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");
