Author: [email protected]
Date: Thu May 21 08:48:10 2009
New Revision: 5459
Added:
trunk/dev/core/src/com/google/gwt/dev/js/JsBreakUpLargeVarStatements.java
(contents, props changed)
trunk/user/src/com/google/gwt/core/CompilerParameters.gwt.xml
(contents, props changed)
Modified:
trunk/dev/core/src/com/google/gwt/dev/CompilePerms.java
trunk/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
trunk/user/src/com/google/gwt/core/Core.gwt.xml
trunk/user/test/com/google/gwt/emultest/EmulSuite.gwt.xml
Log:
Per issue 3455, split up very long var lines to avoid a bug in
the beta version of Safari 4.
This also adds a CompilerParameters module. It looks useful for testing to
be
able to tune way down compiler settings such as this one.
Review by: jgw
Modified: trunk/dev/core/src/com/google/gwt/dev/CompilePerms.java
==============================================================================
--- trunk/dev/core/src/com/google/gwt/dev/CompilePerms.java (original)
+++ trunk/dev/core/src/com/google/gwt/dev/CompilePerms.java Thu May 21
08:48:10 2009
@@ -184,7 +184,8 @@
Permutation permutation, UnifiedAst unifiedAst)
throws UnableToCompleteException {
return JavaToJavaScriptCompiler.compilePermutation(logger, unifiedAst,
- permutation.getRebindAnswers(), permutation.getId());
+ permutation.getRebindAnswers(), permutation.getPropertyOracles(),
+ permutation.getId());
}
/**
Modified:
trunk/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
==============================================================================
--- trunk/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
(original)
+++ trunk/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
Thu May 21 08:48:10 2009
@@ -15,6 +15,7 @@
*/
package com.google.gwt.dev.jjs;
+import com.google.gwt.core.ext.PropertyOracle;
import com.google.gwt.core.ext.TreeLogger;
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.linker.ArtifactSet;
@@ -81,6 +82,7 @@
import com.google.gwt.dev.jjs.impl.TypeMap;
import com.google.gwt.dev.jjs.impl.TypeTightener;
import com.google.gwt.dev.js.EvalFunctionsAtTopScope;
+import com.google.gwt.dev.js.JsBreakUpLargeVarStatements;
import com.google.gwt.dev.js.JsIEBlockSizeVisitor;
import com.google.gwt.dev.js.JsInliner;
import com.google.gwt.dev.js.JsNormalizer;
@@ -173,13 +175,14 @@
* {...@link #precompile(TreeLogger, WebModeCompilerFrontEnd,
String[], JJSOptions, boolean)}
* @param rebindAnswers the set of rebind answers to resolve all
outstanding
* rebind decisions
+ * @param propertyOracles All property oracles corresponding to this
permutation.
* @return the output JavaScript
* @throws UnableToCompleteException if an error other than
* {...@link OutOfMemoryError} occurs
*/
public static PermutationResult compilePermutation(TreeLogger logger,
UnifiedAst unifiedAst, Map<String, String> rebindAnswers,
- int permutationId) throws UnableToCompleteException {
+ PropertyOracle[] propertyOracles, int permutationId) throws
UnableToCompleteException {
try {
if (JProgram.isTracingEnabled()) {
System.out.println("------------------------------------------------------------");
@@ -291,6 +294,8 @@
// Work around an IE7 bug,
// http://code.google.com/p/google-web-toolkit/issues/detail?id=1440
JsIEBlockSizeVisitor.exec(jsProgram);
+
+ JsBreakUpLargeVarStatements.exec(jsProgram, propertyOracles);
// (12) Generate the final output text.
String[] js = new String[jsProgram.getFragmentCount()];
Added:
trunk/dev/core/src/com/google/gwt/dev/js/JsBreakUpLargeVarStatements.java
==============================================================================
--- (empty file)
+++
trunk/dev/core/src/com/google/gwt/dev/js/JsBreakUpLargeVarStatements.java
Thu May 21 08:48:10 2009
@@ -0,0 +1,106 @@
+/*
+ * Copyright 2009 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.dev.js;
+
+import com.google.gwt.core.ext.BadPropertyValueException;
+import com.google.gwt.core.ext.ConfigurationProperty;
+import com.google.gwt.core.ext.PropertyOracle;
+import com.google.gwt.dev.jjs.InternalCompilerException;
+import com.google.gwt.dev.js.ast.JsContext;
+import com.google.gwt.dev.js.ast.JsModVisitor;
+import com.google.gwt.dev.js.ast.JsProgram;
+import com.google.gwt.dev.js.ast.JsStatement;
+import com.google.gwt.dev.js.ast.JsVars;
+import com.google.gwt.dev.js.ast.JsVars.JsVar;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Divides large var statements into smaller ones. Very long var
statements have
+ * trouble on some browsers, including the initial Safari 4 beta. See
Issue
+ * 3455.
+ */
+public class JsBreakUpLargeVarStatements extends JsModVisitor {
+ private static final String CONFIG_PROP_MAX_VARS
= "compiler.max.vars.per.var";
+
+ public static void exec(JsProgram program, PropertyOracle[]
propertyOracles) {
+ (new JsBreakUpLargeVarStatements(propertyOracles)).accept(program);
+ }
+
+ private static JsVars last(List<JsVars> list) {
+ return list.get(list.size() - 1);
+ }
+
+ private final int maxVarsPerStatement;
+
+ private JsBreakUpLargeVarStatements(PropertyOracle[] propertyOracles) {
+ maxVarsPerStatement = getMaxVarsPerStatement(propertyOracles[0]);
+ }
+
+ @Override
+ public void endVisit(JsVars x, JsContext<JsStatement> context) {
+ if (maxVarsPerStatement < 0) {
+ return;
+ }
+
+ if (x.getNumVars() > maxVarsPerStatement) {
+ // compute a list of smaller JsVars statements
+ List<JsVars> smallerVars = new ArrayList<JsVars>();
+ smallerVars.add(makeNewChildVars(x));
+
+ for (JsVar var : x) {
+ if (last(smallerVars).getNumVars() >= maxVarsPerStatement) {
+ // Previous statement is full; start a new one
+ smallerVars.add(makeNewChildVars(x));
+ }
+ last(smallerVars).add(var);
+ }
+
+ // replace x by the sequence smallerVars
+ for (JsVars sv : smallerVars) {
+ context.insertBefore(sv);
+ }
+ context.removeMe();
+ }
+ }
+
+ /**
+ * Look up in the specified property oracle the maximum number of
variables to
+ * allow per var statement.
+ */
+ private int getMaxVarsPerStatement(PropertyOracle propertyOracle)
+ throws InternalCompilerException, NumberFormatException {
+ ConfigurationProperty prop;
+ try {
+ prop = propertyOracle.getConfigurationProperty(CONFIG_PROP_MAX_VARS);
+ } catch (BadPropertyValueException e) {
+ throw new InternalCompilerException("Could not find property "
+ + CONFIG_PROP_MAX_VARS, e);
+ }
+ int t = Integer.parseInt(prop.getValues().get(0));
+ return t;
+ }
+
+ /**
+ * Make a new, empty {...@link JsVars} that is a child of x.
+ */
+ private JsVars makeNewChildVars(JsVars x) {
+ return new JsVars(x.getSourceInfo().makeChild(
+ JsBreakUpLargeVarStatements.class,
+ "breaking up a large vars statement into smaller ones"));
+ }
+}
Added: trunk/user/src/com/google/gwt/core/CompilerParameters.gwt.xml
==============================================================================
--- (empty file)
+++ trunk/user/src/com/google/gwt/core/CompilerParameters.gwt.xml Thu May
21 08:48:10 2009
@@ -0,0 +1,26 @@
+<!--
-->
+<!-- Copyright 2009 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 -->
+<!-- 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. License for the specific language governing permissions
and -->
+<!-- limitations under the
License. -->
+
+<!-- Compiler parameters that can be overridden for test cases . -->
+<!--
-->
+<module>
+ <!--
+ This is the maximum number of variables in any var statement GWT
+ will emit. This avoids a bug in some browsers including
+ the initial beta of Safari 4. See Issue 3455. If it is set to -1,
+ then there is no limit.
+ -->
+ <define-configuration-property name='compiler.max.vars.per.var'
is-multi-valued='false' />
+ <set-configuration-property name='compiler.max.vars.per.var'
value='2400' />
+</module>
Modified: trunk/user/src/com/google/gwt/core/Core.gwt.xml
==============================================================================
--- trunk/user/src/com/google/gwt/core/Core.gwt.xml (original)
+++ trunk/user/src/com/google/gwt/core/Core.gwt.xml Thu May 21 08:48:10 2009
@@ -21,16 +21,17 @@
<inherits name="com.google.gwt.dev.jjs.intrinsic.Intrinsic" />
<inherits name="com.google.gwt.emul.Emulation" />
<inherits name="com.google.gwt.xhr.XMLHttpRequest" />
+ <inherits name="com.google.gwt.core.CompilerParameters" />
<define-linker name="sso"
class="com.google.gwt.core.linker.SingleScriptLinker" />
<define-linker name="std"
class="com.google.gwt.core.linker.IFrameLinker" />
- <define-linker name="xs" class="com.google.gwt.core.linker.XSLinker" />
-
- <define-linker name="soycReport"
class="com.google.gwt.core.linker.SoycReportLinker" />
- <define-linker name="symbolMaps"
class="com.google.gwt.core.linker.SymbolMapsLinker" />
+ <define-linker name="xs" class="com.google.gwt.core.linker.XSLinker" />
+
+ <define-linker name="soycReport"
class="com.google.gwt.core.linker.SoycReportLinker" />
+ <define-linker name="symbolMaps"
class="com.google.gwt.core.linker.SymbolMapsLinker" />
<add-linker name="std" />
-
- <add-linker name="soycReport" />
- <add-linker name="symbolMaps" />
+
+ <add-linker name="soycReport" />
+ <add-linker name="symbolMaps" />
</module>
Modified: trunk/user/test/com/google/gwt/emultest/EmulSuite.gwt.xml
==============================================================================
--- trunk/user/test/com/google/gwt/emultest/EmulSuite.gwt.xml (original)
+++ trunk/user/test/com/google/gwt/emultest/EmulSuite.gwt.xml Thu May 21
08:48:10 2009
@@ -13,7 +13,13 @@
<!-- limitations under the
License. -->
<module>
- <inherits name='com.google.gwt.junit.JUnit'/>
- <inherits name='org.apache.commons.Collections'/>
- <source path='java'/>
+ <inherits name='com.google.gwt.junit.JUnit' />
+ <inherits name='org.apache.commons.Collections' />
+ <source path='java' />
+
+ <!--
+ Specify some tighter compiler settings so that those compiler paths
+ are tested by the normal GWT regression suite
+ -->
+ <set-configuration-property name='compiler.max.vars.per.var' value='10'
/>
</module>
--~--~---------~--~----~------------~-------~--~----~
http://groups.google.com/group/Google-Web-Toolkit-Contributors
-~----------~----~----~----~------~----~------~--~---