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
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@4874 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/core/ext/linker/CompilationResult.java b/dev/core/src/com/google/gwt/core/ext/linker/CompilationResult.java
index c9f3e3e..e194f59 100644
--- a/dev/core/src/com/google/gwt/core/ext/linker/CompilationResult.java
+++ b/dev/core/src/com/google/gwt/core/ext/linker/CompilationResult.java
@@ -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
+}
diff --git a/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardLinkerContext.java b/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardLinkerContext.java
index 454f648..bbc8d3a 100644
--- a/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardLinkerContext.java
+++ b/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardLinkerContext.java
@@ -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);
diff --git a/dev/core/src/com/google/gwt/dev/Compiler.java b/dev/core/src/com/google/gwt/dev/Compiler.java
index 4a4759c..ffac60d 100644
--- a/dev/core/src/com/google/gwt/dev/Compiler.java
+++ b/dev/core/src/com/google/gwt/dev/Compiler.java
@@ -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;
diff --git a/dev/core/src/com/google/gwt/dev/GWTCompiler.java b/dev/core/src/com/google/gwt/dev/GWTCompiler.java
index 913785d..ccfd972 100644
--- a/dev/core/src/com/google/gwt/dev/GWTCompiler.java
+++ b/dev/core/src/com/google/gwt/dev/GWTCompiler.java
@@ -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;
diff --git a/dev/core/src/com/google/gwt/dev/Link.java b/dev/core/src/com/google/gwt/dev/Link.java
index e590129..069a752 100644
--- a/dev/core/src/com/google/gwt/dev/Link.java
+++ b/dev/core/src/com/google/gwt/dev/Link.java
@@ -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)
+ public static void link(TreeLogger logger, ModuleDef module,
+ ArtifactSet generatedArtifacts, Permutation[] permutations,
+ List<FileBackedObject<PermutationResult>> resultFiles, File outDir,
+ File extrasDir, JJSOptions precompileOptions)
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,
- List<FileBackedObject<PermutationResult>> resultFiles, File outDir,
- File extrasDir) 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,