When SameParameterValueOptimizer substitutes a value
for a parameter, it now casts the value to the type
of the parameter. This prevents, for example,
treating an integer as a long.
Review by: scottb
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@7338 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/SameParameterValueOptimizer.java b/dev/core/src/com/google/gwt/dev/jjs/impl/SameParameterValueOptimizer.java
index e118238..c22d483 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/SameParameterValueOptimizer.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/SameParameterValueOptimizer.java
@@ -173,7 +173,6 @@
* all calls.
*/
private Map<JParameter, JValueLiteral> parameterValues = new IdentityHashMap<JParameter, JValueLiteral>();
-
private final JProgram program;
/**
@@ -183,9 +182,11 @@
* TODO: support polymorphic calls properly.
*/
private Set<JMethod> rescuedMethods = new HashSet<JMethod>();
+ private final Simplifier simplifier;
private SameParameterValueOptimizer(JProgram program) {
this.program = program;
+ simplifier = new Simplifier(program);
}
private boolean execImpl(JNode node) {
@@ -200,7 +201,7 @@
JValueLiteral valueLiteral = parameterValues.get(parameter);
if (valueLiteral != null) {
SubstituteParameterVisitor substituteParameterVisitor = new SubstituteParameterVisitor(
- parameter, valueLiteral);
+ parameter, simplifier.cast(parameter.getType(), valueLiteral));
substituteParameterVisitor.accept(parameter.getEnclosingMethod());
madeChanges |= substituteParameterVisitor.didChange();
}
diff --git a/dev/core/test/com/google/gwt/dev/jjs/impl/SameParameterValueOptimizerTest.java b/dev/core/test/com/google/gwt/dev/jjs/impl/SameParameterValueOptimizerTest.java
index 231539b..036d71a 100644
--- a/dev/core/test/com/google/gwt/dev/jjs/impl/SameParameterValueOptimizerTest.java
+++ b/dev/core/test/com/google/gwt/dev/jjs/impl/SameParameterValueOptimizerTest.java
@@ -40,6 +40,12 @@
"public static int foo(int i){", " return i;", "}");
}
+ public void testNumericCast() throws Exception {
+ assertOptimize("foo", "static void foo(long i) { long j = i; }",
+ "foo(1); foo(1);").into("public static void foo(long i){",
+ " long j = 1L;", "}");
+ }
+
public void testSameParameter() throws Exception {
assertOptimize("foo", "static void foo(int i) { int j = i; }",
"foo(1); foo(1);").into("public static void foo(int i){",