Supported creating varargs of reified type parameter
This commit is contained in:
committed by
Andrey Breslav
parent
29b4ba9b3d
commit
a8ca39754c
@@ -373,10 +373,15 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
||||
|
||||
@NotNull
|
||||
public Type expressionType(JetExpression expression) {
|
||||
JetType type = bindingContext.get(EXPRESSION_TYPE, expression);
|
||||
JetType type = expressionJetType(expression);
|
||||
return type == null ? Type.VOID_TYPE : asmType(type);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public JetType expressionJetType(JetExpression expression) {
|
||||
return bindingContext.get(EXPRESSION_TYPE, expression);
|
||||
}
|
||||
|
||||
@Override
|
||||
public StackValue visitParenthesizedExpression(@NotNull JetParenthesizedExpression expression, StackValue receiver) {
|
||||
return genQualified(receiver, expression.getExpression());
|
||||
@@ -2525,14 +2530,14 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
||||
}
|
||||
v.dup();
|
||||
v.invokevirtual(owner, "size", "()I", false);
|
||||
v.newarray(elementType);
|
||||
newArrayInstruction(outType);
|
||||
v.invokevirtual(owner, "toArray", "([Ljava/lang/Object;)[Ljava/lang/Object;", false);
|
||||
v.checkcast(type);
|
||||
}
|
||||
}
|
||||
else {
|
||||
v.iconst(arguments.size());
|
||||
v.newarray(elementType);
|
||||
newArrayInstruction(outType);
|
||||
for (int i = 0; i != size; ++i) {
|
||||
v.dup();
|
||||
v.iconst(i);
|
||||
@@ -3460,19 +3465,8 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
||||
throw new CompilationException("primitive array constructor requires one argument", null, expression);
|
||||
}
|
||||
|
||||
if (isArray) {
|
||||
gen(args.get(0), Type.INT_TYPE);
|
||||
putReifierMarkerIfTypeIsReifiedParameter(
|
||||
arrayType.getArguments().get(0).getType(),
|
||||
ReifiedTypeInliner.NEW_ARRAY_MARKER_METHOD_NAME
|
||||
);
|
||||
v.newarray(boxType(asmType(arrayType.getArguments().get(0).getType())));
|
||||
}
|
||||
else {
|
||||
Type type = typeMapper.mapType(arrayType);
|
||||
gen(args.get(0), Type.INT_TYPE);
|
||||
v.newarray(correctElementType(type));
|
||||
}
|
||||
gen(args.get(0), Type.INT_TYPE);
|
||||
newArrayInstruction(arrayType);
|
||||
|
||||
if (args.size() == 2) {
|
||||
int sizeIndex = myFrameMap.enterTemp(Type.INT_TYPE);
|
||||
@@ -3512,6 +3506,21 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> implem
|
||||
}
|
||||
}
|
||||
|
||||
public void newArrayInstruction(@NotNull JetType arrayType) {
|
||||
if (KotlinBuiltIns.getInstance().isArray(arrayType)) {
|
||||
JetType elementJetType = arrayType.getArguments().get(0).getType();
|
||||
putReifierMarkerIfTypeIsReifiedParameter(
|
||||
elementJetType,
|
||||
ReifiedTypeInliner.NEW_ARRAY_MARKER_METHOD_NAME
|
||||
);
|
||||
v.newarray(boxType(asmType(elementJetType)));
|
||||
}
|
||||
else {
|
||||
Type type = typeMapper.mapType(arrayType);
|
||||
v.newarray(correctElementType(type));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public StackValue visitArrayAccessExpression(@NotNull JetArrayAccessExpression expression, StackValue receiver) {
|
||||
JetExpression array = expression.getArrayExpression();
|
||||
|
||||
@@ -19,6 +19,7 @@ package org.jetbrains.jet.codegen.intrinsics;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.jet.lang.types.JetType;
|
||||
import org.jetbrains.org.objectweb.asm.Type;
|
||||
import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter;
|
||||
import org.jetbrains.jet.codegen.ExpressionCodegen;
|
||||
@@ -45,7 +46,11 @@ public class CopyToArray extends IntrinsicMethod {
|
||||
v.dup();
|
||||
v.invokeinterface("java/util/Collection", "size", "()I");
|
||||
|
||||
v.newarray(returnType.getElementType());
|
||||
assert element instanceof JetExpression;
|
||||
JetType arrayType = codegen.expressionJetType((JetExpression) element);
|
||||
assert arrayType != null;
|
||||
|
||||
codegen.newArrayInstruction(arrayType);
|
||||
v.invokeinterface("java/util/Collection", "toArray", "([Ljava/lang/Object;)[Ljava/lang/Object;");
|
||||
|
||||
return getType(Object[].class);
|
||||
|
||||
Reference in New Issue
Block a user