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
-~----------~----~----~----~------~----~------~--~---

Reply via email to