Fix aliasing in AST nodes created by JavaScriptObjectNormalizer by calling CloneExpressionVisitor.
Patch by: bobv
Review by: scottb (TBR)
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@4894 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/JavaScriptObjectNormalizer.java b/dev/core/src/com/google/gwt/dev/jjs/impl/JavaScriptObjectNormalizer.java
index 56fe60a..5d14256 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/JavaScriptObjectNormalizer.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/JavaScriptObjectNormalizer.java
@@ -148,15 +148,18 @@
x.getTarget());
localCall.getArgs().addAll(x.getArgs());
+ // We need a second copy of the arguments for the else expression
+ CloneExpressionVisitor cloner = new CloneExpressionVisitor(program);
+
// instance.jsoMethod(arg, arg)
- JMethodCall jsoCall = new JMethodCall(program, info, instance,
- jsoMethod);
- jsoCall.getArgs().addAll(x.getArgs());
+ JMethodCall jsoCall = new JMethodCall(program, info,
+ cloner.cloneExpression(instance), jsoMethod);
+ jsoCall.getArgs().addAll(cloner.cloneExpressions(x.getArgs()));
// Cast.isJavaScriptObject() ? instance.jsoMethod() :
// instance.method();
- JConditional newExpr = makeIsJsoConditional(info, instance,
- x.getType(), jsoCall, localCall);
+ JConditional newExpr = makeIsJsoConditional(info,
+ cloner.cloneExpression(instance), x.getType(), jsoCall, localCall);
multi.exprs.add(newExpr);
// We may only have the ternary operation if there's no side-effect