Author: sp...@google.com Date: Wed Feb 25 15:59:54 2009 New Revision: 4874
Modified: trunk/dev/core/src/com/google/gwt/core/ext/linker/CompilationResult.java trunk/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardLinkerContext.java trunk/dev/core/src/com/google/gwt/dev/Compiler.java trunk/dev/core/src/com/google/gwt/dev/GWTCompiler.java trunk/dev/core/src/com/google/gwt/dev/Link.java Log: Discard the serialized AST before linking, to save memory. Also, tweaks CompilationResult.compareToComparable() to not read in the JavaScript files from disk, to speed things up when memory is tight. Review by: bobv Modified: trunk/dev/core/src/com/google/gwt/core/ext/linker/CompilationResult.java ============================================================================== --- trunk/dev/core/src/com/google/gwt/core/ext/linker/CompilationResult.java (original) +++ trunk/dev/core/src/com/google/gwt/core/ext/linker/CompilationResult.java Wed Feb 25 15:59:54 2009 @@ -35,11 +35,9 @@ * the code that should be run when the application starts up. The remaining * elements are loaded via * {...@link com.google.gwt.core.client.GWT#runAsync(com.google.gwt.core.client.RunAsyncCallback) - * GWT.runAsync}. The linker should provide a function named - * <code>__gwtStartLoadingFragment</code> that can takes an integer as - * argument and loads that specified code segment. To see how this function is - * used, see {...@link com.google.gwt.core.client.AsyncFragmentLoader - * AsyncFragmentLoader}. + * GWT.runAsync}. See {...@link com.google.gwt.core.client.AsyncFragmentLoader + * AsyncFragmentLoader} for details on the necessary linker support for + * runAsync. */ public abstract String[] getJavaScript(); @@ -93,22 +91,11 @@ @Override protected final int compareToComparableArtifact(CompilationResult o) { - String[] js = getJavaScript(); - String[] otherJs = o.getJavaScript(); - if (js.length != otherJs.length) { - return js.length - otherJs.length; - } - for (int i = 0; i < js.length; i++) { - int diff = js[i].compareTo(otherJs[i]); - if (diff != 0) { - return diff; - } - } - return 0; + return getStrongName().compareTo(o.getStrongName()); } @Override protected final Class<CompilationResult> getComparableArtifactType() { return CompilationResult.class; } -} \ No newline at end of file +} Modified: trunk/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardLinkerContext.java ============================================================================== --- trunk/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardLinkerContext.java (original) +++ trunk/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardLinkerContext.java Wed Feb 25 15:59:54 2009 @@ -273,8 +273,7 @@ String strongName = Util.computeStrongName(Util.getBytes(permutationResult.getJs())); StandardCompilationResult result = resultsByStrongName.get(strongName); if (result == null) { - result = new StandardCompilationResult(permutationResult.getJs(), - strongName, resultFile); + result = new StandardCompilationResult(null, strongName, resultFile); resultsByStrongName.put(result.getStrongName(), result); artifacts.add(result); Modified: trunk/dev/core/src/com/google/gwt/dev/Compiler.java ============================================================================== --- trunk/dev/core/src/com/google/gwt/dev/Compiler.java (original) +++ trunk/dev/core/src/com/google/gwt/dev/Compiler.java Wed Feb 25 15:59:54 2009 @@ -17,15 +17,17 @@ import com.google.gwt.core.ext.TreeLogger; import com.google.gwt.core.ext.UnableToCompleteException; +import com.google.gwt.core.ext.linker.ArtifactSet; import com.google.gwt.dev.CompileTaskRunner.CompileTask; import com.google.gwt.dev.Link.LinkOptionsImpl; import com.google.gwt.dev.Precompile.PrecompileOptionsImpl; import com.google.gwt.dev.cfg.ModuleDef; import com.google.gwt.dev.cfg.ModuleDefLoader; -import com.google.gwt.dev.util.FileBackedObject; +import com.google.gwt.dev.jjs.JJSOptions; import com.google.gwt.dev.shell.CheckForUpdates; import com.google.gwt.dev.shell.PlatformSpecific; import com.google.gwt.dev.shell.CheckForUpdates.UpdateResult; +import com.google.gwt.dev.util.FileBackedObject; import com.google.gwt.dev.util.PerfLogger; import com.google.gwt.dev.util.Util; import com.google.gwt.dev.util.arg.ArgHandlerExtraDir; @@ -111,7 +113,7 @@ public void setOutDir(File outDir) { linkOptions.setOutDir(outDir); } - + public void setWarDir(File outDir) { linkOptions.setWarDir(outDir); } @@ -130,8 +132,8 @@ public boolean run(TreeLogger logger) throws UnableToCompleteException { FutureTask<UpdateResult> updater = null; if (!options.isUpdateCheckDisabled()) { - updater = PlatformSpecific.checkForUpdatesInBackgroundThread(logger, - CheckForUpdates.ONE_DAY); + updater = PlatformSpecific.checkForUpdatesInBackgroundThread( + logger, CheckForUpdates.ONE_DAY); } boolean success = new Compiler(options).run(logger); if (success) { @@ -187,15 +189,20 @@ } Permutation[] allPerms = precompilation.getPermutations(); - List<FileBackedObject<PermutationResult>> resultFiles - = CompilePerms.makeResultFiles( + List<FileBackedObject<PermutationResult>> resultFiles = CompilePerms.makeResultFiles( options.getCompilerWorkDir(moduleName), allPerms); - CompilePerms.compile(logger, precompilation, allPerms, options.getLocalWorkers(), - resultFiles); + CompilePerms.compile(logger, precompilation, allPerms, + options.getLocalWorkers(), resultFiles); + + ArtifactSet generatedArtifacts = precompilation.getGeneratedArtifacts(); + JJSOptions precompileOptions = precompilation.getUnifiedAst().getOptions(); + + precompilation = null; // No longer needed, so save the memory Link.link(logger.branch(TreeLogger.INFO, "Linking into " - + options.getWarDir().getPath()), module, precompilation, - resultFiles, options.getWarDir(), options.getExtraDir()); + + options.getWarDir().getPath()), module, generatedArtifacts, + allPerms, resultFiles, options.getWarDir(), + options.getExtraDir(), precompileOptions); long compileDone = System.currentTimeMillis(); long delta = compileDone - compileStart; Modified: trunk/dev/core/src/com/google/gwt/dev/GWTCompiler.java ============================================================================== --- trunk/dev/core/src/com/google/gwt/dev/GWTCompiler.java (original) +++ trunk/dev/core/src/com/google/gwt/dev/GWTCompiler.java Wed Feb 25 15:59:54 2009 @@ -17,14 +17,16 @@ import com.google.gwt.core.ext.TreeLogger; import com.google.gwt.core.ext.UnableToCompleteException; +import com.google.gwt.core.ext.linker.ArtifactSet; import com.google.gwt.dev.CompileTaskRunner.CompileTask; import com.google.gwt.dev.Precompile.PrecompileOptionsImpl; import com.google.gwt.dev.cfg.ModuleDef; import com.google.gwt.dev.cfg.ModuleDefLoader; -import com.google.gwt.dev.util.FileBackedObject; +import com.google.gwt.dev.jjs.JJSOptions; import com.google.gwt.dev.shell.CheckForUpdates; import com.google.gwt.dev.shell.PlatformSpecific; import com.google.gwt.dev.shell.CheckForUpdates.UpdateResult; +import com.google.gwt.dev.util.FileBackedObject; import com.google.gwt.dev.util.PerfLogger; import com.google.gwt.dev.util.Util; import com.google.gwt.dev.util.arg.ArgHandlerLocalWorkers; @@ -117,8 +119,8 @@ public boolean run(TreeLogger logger) throws UnableToCompleteException { FutureTask<UpdateResult> updater = null; if (!options.isUpdateCheckDisabled()) { - updater = PlatformSpecific.checkForUpdatesInBackgroundThread(logger, - CheckForUpdates.ONE_DAY); + updater = PlatformSpecific.checkForUpdatesInBackgroundThread( + logger, CheckForUpdates.ONE_DAY); } boolean success = new GWTCompiler(options).run(logger); if (success) { @@ -193,9 +195,14 @@ CompilePerms.compile(logger, precompilation, allPerms, options.getLocalWorkers(), resultFiles); + ArtifactSet generatedArtifacts = precompilation.getGeneratedArtifacts(); + JJSOptions precompileOptions = precompilation.getUnifiedAst().getOptions(); + + precompilation = null; // No longer needed, so save the memory + Link.legacyLink(logger.branch(TreeLogger.INFO, "Linking into " - + options.getOutDir().getPath()), module, precompilation, - resultFiles, options.getOutDir()); + + options.getOutDir().getPath()), module, generatedArtifacts, + allPerms, resultFiles, options.getOutDir(), precompileOptions); long compileDone = System.currentTimeMillis(); long delta = compileDone - compileStart; Modified: trunk/dev/core/src/com/google/gwt/dev/Link.java ============================================================================== --- trunk/dev/core/src/com/google/gwt/dev/Link.java (original) +++ trunk/dev/core/src/com/google/gwt/dev/Link.java Wed Feb 25 15:59:54 2009 @@ -26,6 +26,7 @@ import com.google.gwt.dev.cfg.ModuleDef; import com.google.gwt.dev.cfg.ModuleDefLoader; import com.google.gwt.dev.cfg.StaticPropertyOracle; +import com.google.gwt.dev.jjs.JJSOptions; import com.google.gwt.dev.util.FileBackedObject; import com.google.gwt.dev.util.Util; import com.google.gwt.dev.util.arg.ArgHandlerExtraDir; @@ -54,7 +55,7 @@ * Options for Link. */ public interface LinkOptions extends CompileTaskOptions, OptionExtraDir, - OptionWarDir, OptionOutDir /*deprecated*/ { + OptionWarDir, OptionOutDir /* deprecated */{ } static class ArgProcessor extends CompileArgProcessor { @@ -123,33 +124,25 @@ } public static void legacyLink(TreeLogger logger, ModuleDef module, - Precompilation precompilation, - List<FileBackedObject<PermutationResult>> resultFiles, File outDir) - throws UnableToCompleteException { + ArtifactSet generatedArtifacts, Permutation[] permutations, + List<FileBackedObject<PermutationResult>> resultFiles, File outDir, + JJSOptions precompileOptions) throws UnableToCompleteException { StandardLinkerContext linkerContext = new StandardLinkerContext(logger, - module, precompilation.getUnifiedAst().getOptions()); - ArtifactSet artifacts = doLink(logger, linkerContext, precompilation, - resultFiles); + module, precompileOptions); + ArtifactSet artifacts = doLink(logger, linkerContext, generatedArtifacts, + permutations, resultFiles); doProduceLegacyOutput(logger, artifacts, linkerContext, module, outDir); } - public static ArtifactSet link(TreeLogger logger, ModuleDef module, - Precompilation precompilation, - List<FileBackedObject<PermutationResult>> resultFiles) - throws UnableToCompleteException { - StandardLinkerContext linkerContext = new StandardLinkerContext(logger, - module, precompilation.getUnifiedAst().getOptions()); - return doLink(logger, linkerContext, precompilation, resultFiles); - } - public static void link(TreeLogger logger, ModuleDef module, - Precompilation precompilation, + ArtifactSet generatedArtifacts, Permutation[] permutations, List<FileBackedObject<PermutationResult>> resultFiles, File outDir, - File extrasDir) throws UnableToCompleteException { + File extrasDir, JJSOptions precompileOptions) + throws UnableToCompleteException { StandardLinkerContext linkerContext = new StandardLinkerContext(logger, - module, precompilation.getUnifiedAst().getOptions()); - ArtifactSet artifacts = doLink(logger, linkerContext, precompilation, - resultFiles); + module, precompileOptions); + ArtifactSet artifacts = doLink(logger, linkerContext, generatedArtifacts, + permutations, resultFiles); doProduceOutput(logger, artifacts, linkerContext, module, outDir, extrasDir); } @@ -161,7 +154,7 @@ * still implementation-dependent. */ final LinkOptions options = new LinkOptionsImpl(); - + if (new ArgProcessor(options).processArgs(args)) { CompileTask task = new CompileTask() { public boolean run(TreeLogger logger) throws UnableToCompleteException { @@ -178,10 +171,9 @@ } private static ArtifactSet doLink(TreeLogger logger, - StandardLinkerContext linkerContext, Precompilation precompilation, - List<FileBackedObject<PermutationResult>> resultFiles) + StandardLinkerContext linkerContext, ArtifactSet generatedArtifacts, + Permutation[] perms, List<FileBackedObject<PermutationResult>> resultFiles) throws UnableToCompleteException { - Permutation[] perms = precompilation.getPermutations(); if (perms.length != resultFiles.size()) { throw new IllegalArgumentException( "Mismatched resultFiles.length and permutation count"); @@ -191,7 +183,7 @@ finishPermuation(logger, perms[i], resultFiles.get(i), linkerContext); } - linkerContext.addOrReplaceArtifacts(precompilation.getGeneratedArtifacts()); + linkerContext.addOrReplaceArtifacts(generatedArtifacts); return linkerContext.invokeLink(logger); } @@ -259,16 +251,17 @@ File compilerWorkDir = options.getCompilerWorkDir(moduleName); ModuleDef module = ModuleDefLoader.loadFromClassPath(logger, moduleName); - File precompilationFile = new File(options.getCompilerWorkDir(moduleName), - Precompile.PRECOMPILATION_FILENAME); - if (!precompilationFile.exists()) { - logger.log(TreeLogger.ERROR, "File not found '" - + precompilationFile.getAbsolutePath() - + "'; please run Precompile first"); - return false; - } + File precompilationFile = new File( + options.getCompilerWorkDir(moduleName), + Precompile.PRECOMPILATION_FILENAME); + if (!precompilationFile.exists()) { + logger.log(TreeLogger.ERROR, "File not found '" + + precompilationFile.getAbsolutePath() + + "'; please run Precompile first"); + return false; + } - Precompilation precompilation; + Precompilation precompilation; try { precompilation = Util.readFileAsObject(precompilationFile, Precompilation.class); @@ -278,11 +271,16 @@ return false; } Permutation[] perms = precompilation.getPermutations(); + ArtifactSet generatedArtifacts = precompilation.getGeneratedArtifacts(); + JJSOptions precompileOptions = precompilation.getUnifiedAst().getOptions(); + + precompilation = null; // No longer needed, and it needs a lot of memory List<FileBackedObject<PermutationResult>> resultFiles = new ArrayList<FileBackedObject<PermutationResult>>( perms.length); for (int i = 0; i < perms.length; ++i) { - File f = CompilePerms.makePermFilename(compilerWorkDir, perms[i].getId()); + File f = CompilePerms.makePermFilename(compilerWorkDir, + perms[i].getId()); if (!f.exists()) { logger.log(TreeLogger.ERROR, "File not found '" + precompilationFile.getAbsolutePath() @@ -296,9 +294,10 @@ TreeLogger branch = logger.branch(TreeLogger.INFO, "Linking module " + module.getName()); StandardLinkerContext linkerContext = new StandardLinkerContext(branch, - module, precompilation.getUnifiedAst().getOptions()); - ArtifactSet artifacts = doLink(branch, linkerContext, precompilation, - resultFiles); + module, precompileOptions); + + ArtifactSet artifacts = doLink(branch, linkerContext, generatedArtifacts, + perms, resultFiles); if (options.getOutDir() == null) { doProduceOutput(branch, artifacts, linkerContext, module, --~--~---------~--~----~------------~-------~--~----~ http://groups.google.com/group/Google-Web-Toolkit-Contributors -~----------~----~----~----~------~----~------~--~---