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