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;
+ }
+}