Author: sco...@google.com
Date: Tue Mar 31 09:43:29 2009
New Revision: 5124

Modified:
    changes/scottb/memory/dev/core/src/com/google/gwt/dev/Precompile.java
    changes/scottb/memory/dev/core/src/com/google/gwt/dev/cfg/ModuleDef.java
     
changes/scottb/memory/dev/core/src/com/google/gwt/dev/javac/CompilationState.java
     
changes/scottb/memory/dev/core/src/com/google/gwt/dev/jdt/WebModeCompilerFrontEnd.java
     
changes/scottb/memory/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java

Log:
Free up CompilationState and TypeOracle as soon as the golden CUDs are  
produced.

This allows us to build the Java AST on a clean slate.

Modified:  
changes/scottb/memory/dev/core/src/com/google/gwt/dev/Precompile.java
==============================================================================
--- changes/scottb/memory/dev/core/src/com/google/gwt/dev/Precompile.java       
 
(original)
+++ changes/scottb/memory/dev/core/src/com/google/gwt/dev/Precompile.java       
 
Tue Mar 31 09:43:29 2009
@@ -30,7 +30,6 @@
  import com.google.gwt.dev.javac.CompilationUnit;
  import com.google.gwt.dev.jdt.RebindOracle;
  import com.google.gwt.dev.jdt.RebindPermutationOracle;
-import com.google.gwt.dev.jdt.WebModeCompilerFrontEnd;
  import com.google.gwt.dev.jjs.JJSOptions;
  import com.google.gwt.dev.jjs.JJSOptionsImpl;
  import com.google.gwt.dev.jjs.JavaToJavaScriptCompiler;
@@ -414,10 +413,9 @@
        FragmentLoaderCreator fragmentLoaderCreator = new  
FragmentLoaderCreator(
            compilationState, module, genDir, generatorResourcesDir,
            generatorArtifacts);
-      WebModeCompilerFrontEnd frontEnd = new WebModeCompilerFrontEnd(
-          compilationState, rpo, fragmentLoaderCreator);
-      JavaToJavaScriptCompiler.precompile(logger, frontEnd, declEntryPts,
-          additionalRootTypes, jjsOptions, true);
+      JavaToJavaScriptCompiler.precompile(logger, compilationState, rpo,
+          fragmentLoaderCreator, declEntryPts, additionalRootTypes,  
jjsOptions,
+          true);
        return true;
      } catch (UnableToCompleteException e) {
        // Already logged.
@@ -454,12 +452,10 @@
        FragmentLoaderCreator fragmentLoaderCreator = new  
FragmentLoaderCreator(
            compilationState, module, genDir, generatorResourcesDir,
            generatedArtifacts);
-      WebModeCompilerFrontEnd frontEnd = new WebModeCompilerFrontEnd(
-          compilationState, rpo, fragmentLoaderCreator);
        PerfLogger.start("Precompile");
        UnifiedAst unifiedAst = JavaToJavaScriptCompiler.precompile(logger,
-          frontEnd, declEntryPts, null, jjsOptions,
-          rpo.getPermuationCount() == 1);
+          compilationState, rpo, fragmentLoaderCreator, declEntryPts, null,
+          jjsOptions, rpo.getPermuationCount() == 1);
        PerfLogger.end();

        // Merge all identical permutations together.

Modified:  
changes/scottb/memory/dev/core/src/com/google/gwt/dev/cfg/ModuleDef.java
==============================================================================
---  
changes/scottb/memory/dev/core/src/com/google/gwt/dev/cfg/ModuleDef.java        
 
(original)
+++  
changes/scottb/memory/dev/core/src/com/google/gwt/dev/cfg/ModuleDef.java        
 
Tue Mar 31 09:43:29 2009
@@ -89,8 +89,6 @@

    private ResourceOracleImpl lazySourceOracle;

-  private TypeOracle lazyTypeOracle;
-
    private final Map<String, Class<? extends Linker>> linkerTypesByName =  
new LinkedHashMap<String, Class<? extends Linker>>();

    private final long moduleDefCreationTime = System.currentTimeMillis();
@@ -232,9 +230,11 @@
      return name;
    }

-  public CompilationState getCompilationState(TreeLogger logger) {
+  public CompilationState getCompilationState(TreeLogger logger)
+      throws UnableToCompleteException {
      if (lazyCompilationState == null) {
        lazyCompilationState = new CompilationState(logger,  
lazyJavaSourceOracle);
+      checkForSeedTypes(logger);
      }
      return lazyCompilationState;
    }
@@ -294,32 +294,7 @@

    public synchronized TypeOracle getTypeOracle(TreeLogger logger)
        throws UnableToCompleteException {
-    if (lazyTypeOracle == null) {
-      lazyTypeOracle = getCompilationState(logger).getTypeOracle();
-
-      // Sanity check the seed types and don't even start it they're  
missing.
-      boolean seedTypesMissing = false;
-      if (lazyTypeOracle.findType("java.lang.Object") == null) {
-        Util.logMissingTypeErrorWithHints(logger, "java.lang.Object");
-        seedTypesMissing = true;
-      } else {
-        TreeLogger branch = logger.branch(TreeLogger.TRACE,
-            "Finding entry point classes", null);
-        String[] typeNames = getEntryPointTypeNames();
-        for (int i = 0; i < typeNames.length; i++) {
-          String typeName = typeNames[i];
-          if (lazyTypeOracle.findType(typeName) == null) {
-            Util.logMissingTypeErrorWithHints(branch, typeName);
-            seedTypesMissing = true;
-          }
-        }
-      }
-
-      if (seedTypesMissing) {
-        throw new UnableToCompleteException();
-      }
-    }
-    return lazyTypeOracle;
+    return getCompilationState(logger).getTypeOracle();
    }

    public boolean isGwtXmlFileStale() {
@@ -361,11 +336,7 @@
      // Update the compilation state to reflect the resource oracle changes.
      if (lazyCompilationState != null) {
        lazyCompilationState.refresh(logger);
-    }
-
-    // Refresh type oracle if needed.
-    if (lazyTypeOracle != null) {
-      getTypeOracle(logger);
+      checkForSeedTypes(logger);
      }
      PerfLogger.end();
    }
@@ -441,6 +412,32 @@
      lazyJavaSourceOracle = new JavaSourceOracleImpl(lazySourceOracle);

      PerfLogger.end();
+  }
+
+  private void checkForSeedTypes(TreeLogger logger)
+      throws UnableToCompleteException {
+    // Sanity check the seed types and don't even start it they're missing.
+    boolean seedTypesMissing = false;
+    TypeOracle typeOracle = lazyCompilationState.getTypeOracle();
+    if (typeOracle.findType("java.lang.Object") == null) {
+      Util.logMissingTypeErrorWithHints(logger, "java.lang.Object");
+      seedTypesMissing = true;
+    } else {
+      TreeLogger branch = logger.branch(TreeLogger.TRACE,
+          "Finding entry point classes", null);
+      String[] typeNames = getEntryPointTypeNames();
+      for (int i = 0; i < typeNames.length; i++) {
+        String typeName = typeNames[i];
+        if (typeOracle.findType(typeName) == null) {
+          Util.logMissingTypeErrorWithHints(branch, typeName);
+          seedTypesMissing = true;
+        }
+      }
+    }
+
+    if (seedTypesMissing) {
+      throw new UnableToCompleteException();
+    }
    }

  }

Modified:  
changes/scottb/memory/dev/core/src/com/google/gwt/dev/javac/CompilationState.java
==============================================================================
---  
changes/scottb/memory/dev/core/src/com/google/gwt/dev/javac/CompilationState.java
        
(original)
+++  
changes/scottb/memory/dev/core/src/com/google/gwt/dev/javac/CompilationState.java
        
Tue Mar 31 09:43:29 2009
@@ -94,7 +94,7 @@
    /**
     * Controls our type oracle.
     */
-  private final TypeOracleMediator mediator = new TypeOracleMediator();
+  private TypeOracleMediator mediator = new TypeOracleMediator();

    /**
     * Our source file inputs.
@@ -124,6 +124,23 @@
      logger.log(TreeLogger.DEBUG, "Using " + usefulGraveyardUnits.values()
          + " units from graveyard");
      addGeneratedCompilationUnits(logger, generatedCups,  
usefulGraveyardUnits);
+  }
+
+  /**
+   * Reset all units to FRESH and clear TypeOracle to free up memory.
+   */
+  public void clear() {
+    // Always remove all generated compilation units.
+    for (Iterator<CompilationUnit> it = unitMap.values().iterator();  
it.hasNext();) {
+      CompilationUnit unit = it.next();
+      unit.setFresh();
+      if (unit.isGenerated()) {
+        it.remove();
+      }
+    }
+    updateExposedUnits();
+    jdtCompiler = null;
+    mediator = new TypeOracleMediator();
    }

    /**

Modified:  
changes/scottb/memory/dev/core/src/com/google/gwt/dev/jdt/WebModeCompilerFrontEnd.java
==============================================================================
---  
changes/scottb/memory/dev/core/src/com/google/gwt/dev/jdt/WebModeCompilerFrontEnd.java
   
(original)
+++  
changes/scottb/memory/dev/core/src/com/google/gwt/dev/jdt/WebModeCompilerFrontEnd.java
   
Tue Mar 31 09:43:29 2009
@@ -48,6 +48,17 @@
   */
  public class WebModeCompilerFrontEnd extends AbstractCompiler {

+  public static CompilationUnitDeclaration[]  
getCompilationUnitDeclarations(
+      TreeLogger logger, String[] seedTypeNames,
+      CompilationState compilationState,
+      RebindPermutationOracle rebindPermOracle,
+      FragmentLoaderCreator fragmentLoaderCreator)
+      throws UnableToCompleteException {
+    return new WebModeCompilerFrontEnd(compilationState, rebindPermOracle,
+        fragmentLoaderCreator).getCompilationUnitDeclarations(logger,
+        seedTypeNames);
+  }
+
    private final FragmentLoaderCreator fragmentLoaderCreator;
    private final RebindPermutationOracle rebindPermOracle;

@@ -57,7 +68,7 @@
     * generator infrastructure, and therefore needs access to more parts of  
the
     * compiler than WebModeCompilerFrontEnd currently has.
     */
-  public WebModeCompilerFrontEnd(CompilationState compilationState,
+  private WebModeCompilerFrontEnd(CompilationState compilationState,
        RebindPermutationOracle rebindPermOracle,
        FragmentLoaderCreator fragmentLoaderCreator) {
      super(compilationState, false);
@@ -123,10 +134,6 @@
          icus.toArray(new ICompilationUnit[icus.size()]));
      Memory.maybeDumpMemory("WebModeCompiler");
      return cuds;
-  }
-
-  public RebindPermutationOracle getRebindPermutationOracle() {
-    return rebindPermOracle;
    }

    @Override

Modified:  
changes/scottb/memory/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
==============================================================================
---  
changes/scottb/memory/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
  
(original)
+++  
changes/scottb/memory/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
  
Tue Mar 31 09:43:29 2009
@@ -27,6 +27,7 @@
  import com.google.gwt.core.ext.soyc.impl.SplitPointRecorderImpl;
  import com.google.gwt.core.ext.soyc.impl.StoryRecorderImpl;
  import com.google.gwt.dev.PermutationResult;
+import com.google.gwt.dev.javac.CompilationState;
  import com.google.gwt.dev.jdt.RebindPermutationOracle;
  import com.google.gwt.dev.jdt.WebModeCompilerFrontEnd;
  import com.google.gwt.dev.jjs.InternalCompilerException.NodeInfo;
@@ -315,7 +316,9 @@
     * Performs a precompilation, returning a unified AST.
     *
     * @param logger the logger to use
-   * @param compilerFrontEnd the compiler front ent
+   * @param compilationState the CompilationState
+   * @param rpo the RebindPermutationOracle
+   * @param fragmentLoaderCreator a FragmentLoaderCreator
     * @param declEntryPts the set of entry classes declared in a GWT module;
     *          these will be automatically rebound
     * @param additionalRootTypes additional classes that should serve as  
code
@@ -328,7 +331,8 @@
     *           {...@link OutOfMemoryError} occurs
     */
    public static UnifiedAst precompile(TreeLogger logger,
-      WebModeCompilerFrontEnd compilerFrontEnd, String[] declEntryPts,
+CompilationState compilationState, RebindPermutationOracle rpo,
+FragmentLoaderCreator fragmentLoaderCreator, String[] declEntryPts,
        String[] additionalRootTypes, JJSOptions options,
        boolean singlePermutation) throws UnableToCompleteException {

@@ -339,8 +343,6 @@
        throw new IllegalArgumentException("entry point(s) required");
      }

-    RebindPermutationOracle rpo =  
compilerFrontEnd.getRebindPermutationOracle();
-
      Set<String> allRootTypes = new TreeSet<String>();

      // Find all the possible rebinds for declared entry point types.
@@ -357,8 +359,12 @@

      // Compile the source and get the compiler so we can get the parse tree
      //
-    CompilationUnitDeclaration[] goldenCuds =  
compilerFrontEnd.getCompilationUnitDeclarations(
-        logger, allRootTypes.toArray(new String[0]));
+    CompilationUnitDeclaration[] goldenCuds =  
WebModeCompilerFrontEnd.getCompilationUnitDeclarations(
+        logger, allRootTypes.toArray(new String[0]), compilationState, rpo,
+        fragmentLoaderCreator);
+
+    // Free up memory.
+    compilationState.clear();

      // Check for compilation problems. We don't log here because any  
problems
      // found here will have already been logged by AbstractCompiler.

--~--~---------~--~----~------------~-------~--~----~
http://groups.google.com/group/Google-Web-Toolkit-Contributors
-~----------~----~----~----~------~----~------~--~---

Reply via email to