Fix handling of null passed into varargs.

Fixes a bug where passing null into a varargs method in web mode would create a 1-length array containing null.  The correct behavior is to pass null in for the array.

Found by: rchandia

Review by: cromwellian@google.com

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@9574 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaAST.java b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaAST.java
index 923734f..428a942 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaAST.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaAST.java
@@ -2051,10 +2051,11 @@
       }
     }
 
-    private void addCallArgs(Expression[] args, JMethodCall call,
+    private void addCallArgs(Expression[] jdtArgs, JMethodCall call,
         MethodBinding binding) {
-      if (args == null) {
-        args = new Expression[0];
+      JExpression[] args = new JExpression[jdtArgs == null ? 0 : jdtArgs.length];
+      for (int i = 0; i < args.length; ++i) {
+        args[i] = dispProcessExpression(jdtArgs[i]);
       }
 
       TypeBinding[] params = binding.parameters;
@@ -2072,32 +2073,29 @@
       }
 
       for (int i = 0; i < n; ++i) {
-        call.addArg(dispProcessExpression(args[i]));
+        call.addArg(args[i]);
       }
 
       if (binding.isVarargs()) {
         // Handle the last arg.
-        JArrayType type = (JArrayType) typeMap.get(params[n]);
+        JArrayType lastParamType = (JArrayType) typeMap.get(params[n]);
 
         // See if there is only one arg and it's an array of the correct dims.
         if (args.length == n + 1) {
-          JType lastArgType = (JType) typeMap.get(args[n].resolvedType);
-          if (lastArgType instanceof JArrayType) {
-            JArrayType lastArgArrayType = (JArrayType) lastArgType;
-            if (lastArgArrayType.getDims() == type.getDims()) {
-              // Looks like it's already an array.
-              call.addArg(dispProcessExpression(args[n]));
-              return;
-            }
+          if (program.typeOracle.canTriviallyCast(args[n].getType(),
+              lastParamType)) {
+            // Looks like it's already an array.
+            call.addArg(args[n]);
+            return;
           }
         }
 
         List<JExpression> initializers = new ArrayList<JExpression>();
         for (int i = n; i < args.length; ++i) {
-          initializers.add(dispProcessExpression(args[i]));
+          initializers.add(args[i]);
         }
         JNewArray newArray = JNewArray.createInitializers(program,
-            call.getSourceInfo(), type, initializers);
+            call.getSourceInfo(), lastParamType, initializers);
         call.addArg(newArray);
       }
     }
diff --git a/user/test/com/google/gwt/dev/jjs/test/VarargsTest.java b/user/test/com/google/gwt/dev/jjs/test/VarargsTest.java
index b824191..0285390 100644
--- a/user/test/com/google/gwt/dev/jjs/test/VarargsTest.java
+++ b/user/test/com/google/gwt/dev/jjs/test/VarargsTest.java
@@ -28,6 +28,13 @@
     return "com.google.gwt.dev.jjs.CompilerSuite";
   }
 
+  public void testNullEmpty() {
+    assertNotNull(vararg());
+    assertNull(vararg(null));
+    assertNotNull(vararg((String) null));
+    assertNull(vararg((String[]) null));
+  }
+
   public void testVararg() {
     String[] expected = new String[] {"1", "2", "3"};
     String[] actual = vararg("1", "2", "3");