Basic compiler support for varargs. Review by: mmendez git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@1487 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 de0dd89..a6e4313 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
@@ -711,11 +711,7 @@ } // Plain old regular user arguments - if (x.arguments != null) { - for (int i = 0, n = x.arguments.length; i < n; ++i) { - call.getArgs().add(dispProcessExpression(x.arguments[i])); - } - } + addCallArgs(x.arguments, call, b); // Synthetic args for inner classes ReferenceBinding targetBinding = b.declaringClass; @@ -1030,11 +1026,7 @@ } // The arguments come first... - if (x.arguments != null) { - for (int i = 0, n = x.arguments.length; i < n; ++i) { - call.getArgs().add(dispProcessExpression(x.arguments[i])); - } - } + addCallArgs(x.arguments, call, x.binding); if (type != method.getType()) { // Must be a generic; insert a cast operation. @@ -1136,11 +1128,7 @@ } // Plain old regular arguments - if (x.arguments != null) { - for (int i = 0, n = x.arguments.length; i < n; ++i) { - call.getArgs().add(dispProcessExpression(x.arguments[i])); - } - } + addCallArgs(x.arguments, call, b); // Synthetic args for inner classes ReferenceBinding targetBinding = b.declaringClass; @@ -1780,11 +1768,7 @@ JExpression trueQualifier = createThisRef(info, currentClass); JMethodCall call = new JMethodCall(program, info, trueQualifier, ctor); - if (x.arguments != null) { - for (int i = 0, n = x.arguments.length; i < n; ++i) { - call.getArgs().add(dispProcessExpression(x.arguments[i])); - } - } + addCallArgs(x.arguments, call, x.binding); // We have to find and pass through any synthetics our supertype needs ReferenceBinding superClass = x.binding.declaringClass; @@ -1854,11 +1838,7 @@ assert (x.qualification == null); - if (x.arguments != null) { - for (int i = 0, n = x.arguments.length; i < n; ++i) { - call.getArgs().add(dispProcessExpression(x.arguments[i])); - } - } + addCallArgs(x.arguments, call, x.binding); // All synthetics must be passed through to the target ctor ReferenceBinding declaringClass = x.binding.declaringClass; @@ -1898,6 +1878,50 @@ } } + private void addCallArgs(Expression[] args, JMethodCall call, + MethodBinding binding) { + if (args != null) { + TypeBinding[] params = binding.parameters; + int n = params.length; + + if (binding.isVarargs()) { + // Do everything but the last arg. + --n; + } + + for (int i = 0; i < n; ++i) { + call.getArgs().add(dispProcessExpression(args[i])); + } + + if (binding.isVarargs()) { + // Handle the last arg. + JArrayType type = (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.getArgs().add(dispProcessExpression(args[n])); + return; + } + } + } + + // Fall through: must synthesize a new array allocation. + SourceInfo info = makeSourceInfo(args[n]); + JNewArray newArray = new JNewArray(program, info, type); + newArray.initializers = new ArrayList<JExpression>(); + for (int i = n; i < args.length; ++i) { + newArray.initializers.add(dispProcessExpression(args[i])); + } + call.getArgs().add(newArray); + } + } + } + private JExpression box(JExpression toBox, JClassType wrapperType) { JPrimitiveType primitiveType = getPrimitiveTypeForWrapperType(wrapperType); if (primitiveType == null) {