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

Reply via email to