This patch adds a new flag -XdisableAggressiveOptimization to the compiler and hosted-mode shell that will disable MethodInliner and JsInliner.

Patch by: bobv
Review by: me

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@1585 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/GWTCompiler.java b/dev/core/src/com/google/gwt/dev/GWTCompiler.java
index f9610d4..b8dabf3 100644
--- a/dev/core/src/com/google/gwt/dev/GWTCompiler.java
+++ b/dev/core/src/com/google/gwt/dev/GWTCompiler.java
@@ -47,6 +47,7 @@
 import com.google.gwt.dev.util.log.DetachedTreeLoggerWindow;
 import com.google.gwt.dev.util.log.PrintWriterTreeLogger;
 import com.google.gwt.dev.util.xml.ReflectiveParser;
+import com.google.gwt.util.tools.ArgHandlerDisableAggressiveOptimization;
 import com.google.gwt.util.tools.ArgHandlerExtra;
 import com.google.gwt.util.tools.ArgHandlerOutDir;
 import com.google.gwt.util.tools.ToolBase;
@@ -234,6 +235,8 @@
 
   private Map<String, List<JClassType>> generatedTypesByResultTypeName = new HashMap<String, List<JClassType>>();
 
+  private boolean aggressivelyOptimize = true;
+
   private JavaToJavaScriptCompiler jjs;
 
   private Type logLevel;
@@ -316,6 +319,14 @@
         GWTCompiler.this.setStylePretty();
       }
     });
+
+    registerHandler(new ArgHandlerDisableAggressiveOptimization() {
+      @Override
+      public boolean setFlag() {
+        GWTCompiler.this.setAggressivelyOptimize(false);
+        return true;
+      }
+    });
     this.cacheManager = cacheManager;
   }
 
@@ -339,7 +350,7 @@
     WebModeCompilerFrontEnd frontEnd = new WebModeCompilerFrontEnd(
         sourceOracle, rebindPermOracle);
     jjs = new JavaToJavaScriptCompiler(logger, frontEnd, declEntryPts,
-        obfuscate, prettyNames);
+        obfuscate, prettyNames, aggressivelyOptimize);
     initCompilations(logger);
 
     // Compile for every permutation of properties.
@@ -373,6 +384,10 @@
     return useGuiLogger;
   }
 
+  public void setAggressivelyOptimize(boolean aggressive) {
+    aggressivelyOptimize = aggressive;
+  }
+
   public void setGenDir(File dir) {
     genDir = dir;
   }
diff --git a/dev/core/src/com/google/gwt/dev/GWTShell.java b/dev/core/src/com/google/gwt/dev/GWTShell.java
index acd2103..d07d08d 100644
--- a/dev/core/src/com/google/gwt/dev/GWTShell.java
+++ b/dev/core/src/com/google/gwt/dev/GWTShell.java
@@ -34,6 +34,7 @@
 import com.google.gwt.dev.util.arg.ArgHandlerLogLevel;
 import com.google.gwt.dev.util.arg.ArgHandlerScriptStyle;
 import com.google.gwt.dev.util.log.AbstractTreeLogger;
+import com.google.gwt.util.tools.ArgHandlerDisableAggressiveOptimization;
 import com.google.gwt.util.tools.ArgHandlerExtra;
 import com.google.gwt.util.tools.ArgHandlerFlag;
 import com.google.gwt.util.tools.ArgHandlerOutDir;
@@ -371,6 +372,8 @@
 
   protected File outDir;
 
+  private boolean aggressivelyOptimize = true;
+
   private BrowserWidgetHostImpl browserHost = new BrowserWidgetHostImpl();
 
   private final List<Shell> browserShells = new ArrayList<Shell>();
@@ -462,6 +465,14 @@
         prettyNames = true;
       }
     });
+
+    registerHandler(new ArgHandlerDisableAggressiveOptimization() {
+      @Override
+      public boolean setFlag() {
+        GWTShell.this.setAggressivelyOptimize(false);
+        return true;
+      }
+    });
   }
 
   public void addStartupURL(String url) {
@@ -609,6 +620,10 @@
     }
   }
 
+  public void setAggressivelyOptimize(boolean optimize) {
+    this.aggressivelyOptimize = optimize;
+  }
+
   public void setGenDir(File genDir) {
     this.genDir = genDir;
   }
@@ -637,6 +652,7 @@
   protected void compile(TreeLogger logger, ModuleDef moduleDef)
       throws UnableToCompleteException {
     GWTCompiler compiler = new GWTCompiler(moduleDef.getCacheManager());
+    compiler.setAggressivelyOptimize(aggressivelyOptimize);
     compiler.setGenDir(genDir);
     compiler.setOutDir(outDir);
     compiler.setModuleName(moduleDef.getName());
diff --git a/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java b/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
index c5f126e..70cf5cc 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
@@ -196,6 +196,7 @@
     return null;
   }
 
+  private final boolean aggressivelyOptimize;
   private final String[] declEntryPoints;
   private final CompilationUnitDeclaration[] goldenCuds;
   private long lastModified;
@@ -206,17 +207,22 @@
   public JavaToJavaScriptCompiler(final TreeLogger logger,
       final WebModeCompilerFrontEnd compiler, final String[] declEntryPts)
       throws UnableToCompleteException {
-    this(logger, compiler, declEntryPts, true, false);
+    this(logger, compiler, declEntryPts, true, false, true);
   }
 
   public JavaToJavaScriptCompiler(final TreeLogger logger,
       final WebModeCompilerFrontEnd compiler, final String[] declEntryPts,
-      boolean obfuscate, boolean prettyNames) throws UnableToCompleteException {
+      boolean obfuscate, boolean prettyNames, boolean aggressivelyOptimize)
+      throws UnableToCompleteException {
 
     if (declEntryPts.length == 0) {
       throw new IllegalArgumentException("entry point(s) required");
     }
 
+    // Should we attempt to inline Java and JavaScript methods?
+    //
+    this.aggressivelyOptimize = aggressivelyOptimize;
+
     // Remember these for subsequent compiles.
     //
     this.declEntryPoints = declEntryPts;
@@ -357,9 +363,10 @@
         // dead code removal??
         didChange = DeadCodeElimination.exec(jprogram) || didChange;
 
-        // inlining
-        didChange = MethodInliner.exec(jprogram) || didChange;
-
+        if (aggressivelyOptimize) {
+          // inlining
+          didChange = MethodInliner.exec(jprogram) || didChange;
+        }
         // prove that any types that have been culled from the main tree are
         // unreferenced due to type tightening?
       } while (didChange);
@@ -391,13 +398,16 @@
       JsSymbolResolver.exec(jsProgram);
 
       // (10) Apply optimizations to JavaScript AST
-      do {
-        didChange = false;
-        // Inline JavaScript function invocations
-        didChange = JsInliner.exec(jsProgram) || didChange;
-        // Remove unused functions, possible
-        didChange = JsUnusedFunctionRemover.exec(jsProgram) || didChange;
-      } while (didChange);
+      if (aggressivelyOptimize) {
+        do {
+          didChange = false;
+          // Inline JavaScript function invocations
+          didChange = aggressivelyOptimize && JsInliner.exec(jsProgram)
+              || didChange;
+          // Remove unused functions, possible
+          didChange = JsUnusedFunctionRemover.exec(jsProgram) || didChange;
+        } while (didChange);
+      }
 
       // (11) Obfuscate
       if (obfuscate) {
diff --git a/dev/core/src/com/google/gwt/util/tools/ArgHandlerDisableAggressiveOptimization.java b/dev/core/src/com/google/gwt/util/tools/ArgHandlerDisableAggressiveOptimization.java
new file mode 100644
index 0000000..f464ea4
--- /dev/null
+++ b/dev/core/src/com/google/gwt/util/tools/ArgHandlerDisableAggressiveOptimization.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2007 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.util.tools;
+
+/**
+ * Handles the -XdisableAggressiveOptimization command line flag.
+ */
+public abstract class ArgHandlerDisableAggressiveOptimization extends
+    ArgHandlerFlag {
+  @Override
+  public String getPurpose() {
+    return "Troubleshooting: Prevent the web mode compiler from performing "
+        + "aggressive optimizations.";
+  }
+
+  @Override
+  public String getTag() {
+    return "-XdisableAggressiveOptimization";
+  }
+
+  @Override
+  public boolean isUndocumented() {
+    return true;
+  }
+}