Author: sco...@google.com Date: Mon May 11 17:09:51 2009 New Revision: 5346
Modified: trunk/dev/core/src/com/google/gwt/dev/Precompile.java trunk/dev/core/src/com/google/gwt/dev/javac/CompilationState.java trunk/dev/core/src/com/google/gwt/dev/javac/CompilationUnitInvalidator.java trunk/dev/core/src/com/google/gwt/dev/javac/JsniCollector.java trunk/dev/core/src/com/google/gwt/dev/javac/TypeOracleMediator.java trunk/dev/core/test/com/google/gwt/dev/javac/CompilationStateTest.java Log: CompilationState now keeps a Collection of units rather than a Set; this allows us to simply reuse the map's values(). This replaces code that used to construct a new HashSet each time new units were generated, which was super-linear. It turns out none of the callers rely on the the return type being a Set. Review by: jat (desk) Modified: trunk/dev/core/src/com/google/gwt/dev/Precompile.java ============================================================================== --- trunk/dev/core/src/com/google/gwt/dev/Precompile.java (original) +++ trunk/dev/core/src/com/google/gwt/dev/Precompile.java Mon May 11 17:09:51 2009 @@ -64,6 +64,7 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.util.Collection; import java.util.HashSet; import java.util.Set; import java.util.SortedMap; @@ -413,7 +414,7 @@ String[] additionalRootTypes = null; if (declEntryPts.length == 0) { // No declared entry points, just validate all visible classes. - Set<CompilationUnit> compilationUnits = compilationState.getCompilationUnits(); + Collection<CompilationUnit> compilationUnits = compilationState.getCompilationUnits(); additionalRootTypes = new String[compilationUnits.size()]; int i = 0; for (CompilationUnit unit : compilationUnits) { Modified: trunk/dev/core/src/com/google/gwt/dev/javac/CompilationState.java ============================================================================== --- trunk/dev/core/src/com/google/gwt/dev/javac/CompilationState.java (original) +++ trunk/dev/core/src/com/google/gwt/dev/javac/CompilationState.java Mon May 11 17:09:51 2009 @@ -49,7 +49,7 @@ return result; } - private static void markSurvivorsChecked(Set<CompilationUnit> units) { + private static void markSurvivorsChecked(Collection<CompilationUnit> units) { for (CompilationUnit unit : units) { if (unit.getState() == State.COMPILED || unit.getState() == State.GRAVEYARD) { @@ -86,7 +86,7 @@ /** * Unmodifiable view of all units. */ - private Set<CompilationUnit> exposedUnits = Collections.emptySet(); + private final Collection<CompilationUnit> exposedUnits = Collections.unmodifiableCollection(unitMap.values()); private CompilationUnitInvalidator.InvalidatorState invalidatorState = new CompilationUnitInvalidator.InvalidatorState(); @@ -144,7 +144,7 @@ } } unitMap.clear(); - updateExposedUnits(); + invalidateClassFileMaps(); jdtCompiler = null; mediator = new TypeOracleMediator(); invalidatorState = new CompilationUnitInvalidator.InvalidatorState(); @@ -181,7 +181,7 @@ /** * Returns an unmodifiable view of the set of compilation units. */ - public Set<CompilationUnit> getCompilationUnits() { + public Collection<CompilationUnit> getCompilationUnits() { return exposedUnits; } @@ -220,11 +220,11 @@ } refreshFromSourceOracle(); - updateExposedUnits(); + invalidateClassFileMaps(); // Don't log about invalidated units via refresh. - Set<CompilationUnit> allUnitsPlusGraveyard = concatSet( - getCompilationUnits(), graveyardUnits.values()); + Set<CompilationUnit> allUnitsPlusGraveyard = concatSet(unitMap.values(), + graveyardUnits.values()); CompilationUnitInvalidator.invalidateUnitsWithInvalidRefs(TreeLogger.NULL, allUnitsPlusGraveyard); removeInvalidatedGraveyardUnits(graveyardUnits); @@ -233,7 +233,8 @@ * Only retain state for units marked as CHECKED; because CHECKED units * won't be revalidated. */ - Set<CompilationUnit> toRetain = new HashSet<CompilationUnit>(exposedUnits); + Set<CompilationUnit> toRetain = new HashSet<CompilationUnit>( + unitMap.values()); for (Iterator<CompilationUnit> it = toRetain.iterator(); it.hasNext();) { CompilationUnit unit = it.next(); if (unit.getState() != State.CHECKED) { @@ -243,10 +244,9 @@ invalidatorState.retainAll(toRetain); jdtCompiler = new JdtCompiler(); - compile(logger, getCompilationUnits(), - Collections.<CompilationUnit> emptySet()); - mediator.refresh(logger, getCompilationUnits()); - markSurvivorsChecked(getCompilationUnits()); + compile(logger, unitMap.values(), Collections.<CompilationUnit> emptySet()); + mediator.refresh(logger, unitMap.values()); + markSurvivorsChecked(unitMap.values()); } /** @@ -273,9 +273,9 @@ for (CompilationUnit generatedUnit : usefulGeneratedCups) { unitMap.put(generatedUnit.getTypeName(), generatedUnit); } - updateExposedUnits(); + invalidateClassFileMaps(); - compile(logger, usefulGeneratedCups, getCompilationUnits()); + compile(logger, usefulGeneratedCups, unitMap.values()); mediator.addNewUnits(logger, usefulGeneratedCups); markSurvivorsChecked(usefulGeneratedCups); } @@ -320,7 +320,7 @@ Set<CompilationUnit> allGraveyardUnits = concatSet( graveyardUnits.values(), usefulGraveyardUnits.values()); CompilationUnitInvalidator.invalidateUnitsWithInvalidRefs( - TreeLogger.NULL, allGraveyardUnits, exposedUnits); + TreeLogger.NULL, allGraveyardUnits, unitMap.values()); removeInvalidatedGraveyardUnits(graveyardUnits); removeInvalidatedGraveyardUnits(usefulGraveyardUnits); @@ -332,8 +332,8 @@ * Compile units and update their internal state. Invalidate any units with * compile errors. */ - private void compile(TreeLogger logger, Set<CompilationUnit> newUnits, - Set<CompilationUnit> existingUnits) { + private void compile(TreeLogger logger, Collection<CompilationUnit> newUnits, + Collection<CompilationUnit> existingUnits) { PerfLogger.start("CompilationState.compile"); if (jdtCompiler.doCompile(newUnits)) { logger = logger.branch(TreeLogger.DEBUG, @@ -362,10 +362,16 @@ PerfLogger.end(); } + private void invalidateClassFileMaps() { + // TODO: see if we can call this in fewer places. + exposedClassFileMap = null; + exposedClassFileMapBySource = null; + } + private void rebuildClassMaps() { HashMap<String, CompiledClass> classFileMap = new HashMap<String, CompiledClass>(); HashMap<String, CompiledClass> classFileMapBySource = new HashMap<String, CompiledClass>(); - for (CompilationUnit unit : getCompilationUnits()) { + for (CompilationUnit unit : unitMap.values()) { if (unit.isCompiled()) { for (CompiledClass compiledClass : unit.getCompiledClasses()) { classFileMap.put(compiledClass.getBinaryName(), compiledClass); @@ -425,12 +431,5 @@ it.remove(); } } - } - - private void updateExposedUnits() { - exposedUnits = Collections.unmodifiableSet(new HashSet<CompilationUnit>( - unitMap.values())); - exposedClassFileMap = null; - exposedClassFileMapBySource = null; } } Modified: trunk/dev/core/src/com/google/gwt/dev/javac/CompilationUnitInvalidator.java ============================================================================== --- trunk/dev/core/src/com/google/gwt/dev/javac/CompilationUnitInvalidator.java (original) +++ trunk/dev/core/src/com/google/gwt/dev/javac/CompilationUnitInvalidator.java Mon May 11 17:09:51 2009 @@ -60,7 +60,7 @@ * @return <code>true</code> if any units changed state */ public static boolean invalidateUnitsWithErrors(TreeLogger logger, - Set<CompilationUnit> units) { + Collection<CompilationUnit> units) { logger = logger.branch(TreeLogger.TRACE, "Removing units with errors"); // Start by removing units with a known problem. boolean anyRemoved = false; @@ -135,7 +135,7 @@ * set that reference each other */ public static void invalidateUnitsWithInvalidRefs(TreeLogger logger, - Set<CompilationUnit> unitsToCheck) { + Collection<CompilationUnit> unitsToCheck) { invalidateUnitsWithInvalidRefs(logger, unitsToCheck, Collections.<CompilationUnit> emptySet()); } @@ -151,7 +151,8 @@ * may be empty) */ public static void invalidateUnitsWithInvalidRefs(TreeLogger logger, - Set<CompilationUnit> unitsToCheck, Set<CompilationUnit> knownUnits) { + Collection<CompilationUnit> unitsToCheck, + Collection<CompilationUnit> knownUnits) { logger = logger.branch(TreeLogger.TRACE, "Removing invalidated units"); Set<String> knownValidRefs = new HashSet<String>(); @@ -195,7 +196,7 @@ } public static void validateCompilationUnits(InvalidatorState state, - Set<CompilationUnit> units, Set<String> validBinaryTypeNames) { + Collection<CompilationUnit> units, Set<String> validBinaryTypeNames) { for (CompilationUnit unit : units) { if (unit.getState() == State.COMPILED) { CompilationUnitDeclaration jdtCud = unit.getJdtCud(); Modified: trunk/dev/core/src/com/google/gwt/dev/javac/JsniCollector.java ============================================================================== --- trunk/dev/core/src/com/google/gwt/dev/javac/JsniCollector.java (original) +++ trunk/dev/core/src/com/google/gwt/dev/javac/JsniCollector.java Mon May 11 17:09:51 2009 @@ -35,8 +35,8 @@ import java.io.IOException; import java.io.StringReader; import java.util.ArrayList; +import java.util.Collection; import java.util.List; -import java.util.Set; /** * Adapts compilation units containing JSNI-accessible code by rewriting the @@ -156,7 +156,7 @@ } public static void collectJsniMethods(TreeLogger logger, - Set<CompilationUnit> units, JsProgram program) { + Collection<CompilationUnit> units, JsProgram program) { for (CompilationUnit unit : units) { if (unit.getState() == State.COMPILED) { String loc = unit.getDisplayLocation(); Modified: trunk/dev/core/src/com/google/gwt/dev/javac/TypeOracleMediator.java ============================================================================== --- trunk/dev/core/src/com/google/gwt/dev/javac/TypeOracleMediator.java (original) +++ trunk/dev/core/src/com/google/gwt/dev/javac/TypeOracleMediator.java Mon May 11 17:09:51 2009 @@ -83,6 +83,7 @@ import java.lang.annotation.RetentionPolicy; import java.lang.reflect.Array; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set; @@ -266,7 +267,7 @@ /** * Adds new units to an existing TypeOracle. */ - public void addNewUnits(TreeLogger logger, Set<CompilationUnit> units) { + public void addNewUnits(TreeLogger logger, Collection<CompilationUnit> units) { // Perform a shallow pass to establish identity for new and old types. for (CompilationUnit unit : units) { switch (unit.getState()) { @@ -328,7 +329,7 @@ /** * Full refresh based on new units. */ - public void refresh(TreeLogger logger, Set<CompilationUnit> units) { + public void refresh(TreeLogger logger, Collection<CompilationUnit> units) { logger = logger.branch(TreeLogger.DEBUG, "Refreshing TypeOracle"); binaryMapper.clear(); typeOracle.reset(); Modified: trunk/dev/core/test/com/google/gwt/dev/javac/CompilationStateTest.java ============================================================================== --- trunk/dev/core/test/com/google/gwt/dev/javac/CompilationStateTest.java (original) +++ trunk/dev/core/test/com/google/gwt/dev/javac/CompilationStateTest.java Mon May 11 17:09:51 2009 @@ -438,10 +438,11 @@ private void validateCompilationState(String... generatedTypeNames) { // Save off the reflected collections. Map<String, CompilationUnit> unitMap = state.getCompilationUnitMap(); - Set<CompilationUnit> units = state.getCompilationUnits(); + Collection<CompilationUnit> units = state.getCompilationUnits(); // Validate that the collections are consistent with each other. - assertEquals(new HashSet<CompilationUnit>(unitMap.values()), units); + assertEquals(new HashSet<CompilationUnit>(unitMap.values()), + new HashSet<CompilationUnit>(units)); // Save off a mutable copy of the source map and generated types to compare. Map<String, Resource> sourceMap = new HashMap<String, Resource>( --~--~---------~--~----~------------~-------~--~----~ http://groups.google.com/group/Google-Web-Toolkit-Contributors -~----------~----~----~----~------~----~------~--~---