KT-729 Need to support arrays as varargs

This commit is contained in:
Alex Tkachman
2012-04-28 10:43:49 +03:00
parent 7b7987ba0d
commit f076ff027d
4 changed files with 103 additions and 7 deletions
@@ -1529,15 +1529,55 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> {
Type type = asmType(outType);
assert type.getSort() == Type.ARRAY;
Type elementType = correctElementType(type);
int size = valueArgument.getArguments().size();
List<ValueArgument> arguments = valueArgument.getArguments();
int size = arguments.size();
v.iconst(valueArgument.getArguments().size());
v.newarray(elementType);
boolean hasSpread = false;
for(int i = 0; i != size; ++i) {
v.dup();
v.iconst(i);
gen(valueArgument.getArguments().get(i).getArgumentExpression(), elementType);
StackValue.arrayElement(elementType, false).store(v);
if(arguments.get(i).getSpreadElement() != null) {
hasSpread = true;
break;
}
}
if(hasSpread) {
if(size == 1) {
gen(arguments.get(0).getArgumentExpression(), type);
}
else {
String owner = "jet/runtime/Intrinsics$SpreadBuilder";
v.anew(Type.getObjectType(owner));
v.dup();
v.invokespecial(owner, "<init>", "()V");
for(int i = 0; i != size; ++i) {
v.dup();
ValueArgument argument = arguments.get(i);
if(argument.getSpreadElement() != null) {
gen(argument.getArgumentExpression(),JetTypeMapper.TYPE_OBJECT);
v.invokevirtual(owner, "addSpread", "(Ljava/lang/Object;)V");
}
else {
gen(argument.getArgumentExpression(), elementType);
v.invokevirtual(owner, "add", "(Ljava/lang/Object;)Z");
v.pop();
}
}
v.dup();
v.invokevirtual(owner, "size", "()I");
v.newarray(elementType);
v.invokevirtual(owner, "toArray", "([Ljava/lang/Object;)[Ljava/lang/Object;");
v.checkcast(type);
}
}
else {
v.iconst(arguments.size());
v.newarray(elementType);
for(int i = 0; i != size; ++i) {
v.dup();
v.iconst(i);
gen(arguments.get(i).getArgumentExpression(), elementType);
StackValue.arrayElement(elementType, false).store(v);
}
}
}
@@ -54,6 +54,7 @@ public class JetTypeMapper {
public static final Type TYPE_NOTHING = Type.getObjectType("jet/Nothing");
public static final Type JL_NUMBER_TYPE = Type.getObjectType("java/lang/Number");
public static final Type JL_STRING_BUILDER = Type.getObjectType("java/lang/StringBuilder");
public static final Type JL_ARRAY_LIST = Type.getObjectType("java/util/ArrayList");
public static final Type JL_STRING_TYPE = Type.getObjectType("java/lang/String");
public static final Type JL_CHAR_SEQUENCE_TYPE = Type.getObjectType("java/lang/CharSequence");
private static final Type JL_COMPARABLE_TYPE = Type.getObjectType("java/lang/Comparable");