Fix JsInliner improperly inlining array, object, and function literals. Patch by: cromwellian Review by: spoon, scottb git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@6404 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/js/JsInliner.java b/dev/core/src/com/google/gwt/dev/js/JsInliner.java index 0a8b1a2..02373c6 100644 --- a/dev/core/src/com/google/gwt/dev/js/JsInliner.java +++ b/dev/core/src/com/google/gwt/dev/js/JsInliner.java
@@ -98,6 +98,16 @@ } @Override + public void endVisit(JsArrayLiteral x, JsContext<JsExpression> ctx) { + affectedBySideEffects = true; + } + + @Override + public void endVisit(JsFunction x, JsContext<JsExpression> ctx) { + affectedBySideEffects = true; + } + + @Override public void endVisit(JsInvocation x, JsContext<JsExpression> ctx) { /* * We could make this more accurate by analyzing the function that's being @@ -126,6 +136,11 @@ */ affectedBySideEffects = true; } + + @Override + public void endVisit(JsObjectLiteral x, JsContext<JsExpression> ctx) { + affectedBySideEffects = true; + } } /**
diff --git a/dev/core/test/com/google/gwt/dev/js/JsInlinerTest.java b/dev/core/test/com/google/gwt/dev/js/JsInlinerTest.java index b652df4..4debe87 100644 --- a/dev/core/test/com/google/gwt/dev/js/JsInlinerTest.java +++ b/dev/core/test/com/google/gwt/dev/js/JsInlinerTest.java
@@ -28,6 +28,7 @@ public class JsInlinerTest extends OptimizerTestBase { private static class FixStaticRefsVisitor extends JsModVisitor { + public static void exec(JsProgram program) { (new FixStaticRefsVisitor()).accept(program); } @@ -35,13 +36,35 @@ @Override public void endVisit(JsFunction x, JsContext<JsExpression> ctx) { JsName name = x.getName(); - name.setStaticRef(x); + if (name != null) { + name.setStaticRef(x); + } } } + public void testInlineArrayLiterals() throws Exception { + String input = "function a1(arg, x) { arg.x = x; return arg; }" + + "function b1() { var x=a1([], 10); } b1();"; + compare(input, input); + } + + public void testInlineFunctionLiterals() throws Exception { + String input = "function a1(arg, x) { arg.x = x; return arg; }" + + "function b1() { var x=a1(function (){}, 10); } b1();"; + compare(input, input); + String input2 = "function a1(arg, x) { arg.x = x; return arg; }" + + "function b1() { var x=a1(function blah(){}, 10); } b1();"; + compare(input2, input2); + } + + public void testInlineObjectLiterals() throws Exception { + String input = "function a1(arg, x) { arg.x = x; return arg; }" + + "function b1() { var x=a1({}, 10); } b1();"; + compare(input, input); + } /** * A test for mutually-recursive functions. Setup: - * + * * <pre> * a -> b, c * b -> a, c @@ -71,6 +94,7 @@ input = optimize(input, JsSymbolResolver.class, FixStaticRefsVisitor.class, JsInliner.class, JsUnusedFunctionRemover.class); expected = optimize(expected); + System.err.println("Input vs "); assertEquals(expected, input); } }