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