From 6982ce454e1110c93d76c845ab303cd1aab6a0c1 Mon Sep 17 00:00:00 2001 From: Alex Tkachman Date: Mon, 14 Nov 2011 06:17:11 +0200 Subject: [PATCH] KT-503 test. Never use asm.Type.getElementType() --- .../jet/codegen/ExpressionCodegen.java | 8 ++--- .../jetbrains/jet/codegen/JetTypeMapper.java | 6 ++++ .../jet/codegen/NamespaceCodegen.java | 2 +- .../testData/codegen/regressions/kt503.jet | 32 +++++++++++++++++++ .../jetbrains/jet/codegen/ArrayGenTest.java | 4 +++ 5 files changed, 47 insertions(+), 5 deletions(-) create mode 100644 compiler/testData/codegen/regressions/kt503.jet diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index d547d3130c2..6e1f3011986 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -1295,7 +1295,7 @@ public class ExpressionCodegen extends JetVisitor { Type type = typeMapper.mapType(outType); assert type.getSort() == Type.ARRAY; - Type elementType = type.getElementType(); + Type elementType = JetTypeMapper.correctElementType(type); int size = valueArgument.getArgumentExpressions().size(); v.iconst(valueArgument.getArgumentExpressions().size()); @@ -1314,7 +1314,7 @@ public class ExpressionCodegen extends JetVisitor { } return mask; } - + private int pushMethodArguments(JetCallElement expression, List valueParameterTypes) { ResolvedCall resolvedCall = bindingContext.get(BindingContext.RESOLVED_CALL, expression.getCalleeExpression()); if(resolvedCall != null) { @@ -2032,7 +2032,7 @@ public class ExpressionCodegen extends JetVisitor { else { Type type = typeMapper.mapType(arrayType, OwnerKind.IMPLEMENTATION); gen(args.get(0).getArgumentExpression(), Type.INT_TYPE); - v.newarray(type.getElementType()); + v.newarray(JetTypeMapper.correctElementType(type)); } if(args.size() == 2) { @@ -2092,7 +2092,7 @@ public class ExpressionCodegen extends JetVisitor { return StackValue.arrayElement(notBoxed, true); } else { - return StackValue.arrayElement(arrayType.getElementType(), false); + return StackValue.arrayElement(JetTypeMapper.correctElementType(arrayType), false); } } else { diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java index f06383ee0b1..cd5b0693897 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java @@ -121,6 +121,12 @@ public class JetTypeMapper { return type; } + static Type correctElementType(Type type) { + String internalName = type.getInternalName(); + assert internalName.charAt(0) == '['; + return Type.getType(internalName.substring(1)); + } + public String getOwner(DeclarationDescriptor descriptor, OwnerKind kind) { String owner; DeclarationDescriptor containingDeclaration = descriptor.getContainingDeclaration(); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java index c3f768112e5..e2cdf6d495e 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java @@ -162,7 +162,7 @@ public class NamespaceCodegen { v.aconst(jvmType); v.iconst(jetType.isNullable() ? 1 : 0); List arguments = jetType.getArguments(); - if (arguments.size() > 0 && !(jvmType.getSort() == Type.ARRAY && jvmType.getElementType().getSort() != Type.OBJECT)) { + if (arguments.size() > 0 && !(jvmType.getSort() == Type.ARRAY && JetTypeMapper.correctElementType(jvmType).getSort() != Type.OBJECT)) { v.iconst(arguments.size()); v.newarray(JetTypeMapper.TYPE_TYPEINFOPROJECTION); diff --git a/compiler/testData/codegen/regressions/kt503.jet b/compiler/testData/codegen/regressions/kt503.jet new file mode 100644 index 00000000000..c1302d2011f --- /dev/null +++ b/compiler/testData/codegen/regressions/kt503.jet @@ -0,0 +1,32 @@ +fun iarr(vararg a : Int) = a +fun array(vararg a : T) = a + +fun box() : String { + val tests = array( + iarr(6, 5, 4, 3, 2, 1), + iarr(1, 2), + iarr(1, 2, 3), + iarr(1, 2, 3, 4), + iarr(1) + ) + + var n = 0 + + try { + var i = 0 + while (true) { + if (thirdElementIsThree(tests[i++])) + n++ + } + } + catch (e : ArrayIndexOutOfBoundsException) { + // No more tests to process + } + System.out?.println(n) + return if(n == 2) "OK" else "fail" +} + +fun thirdElementIsThree(a : IntArray) = +// Problematic code does not compile +// a.size >= 3 & a[2] == 3 + a.size >= 3 && a[2] == 3 \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/ArrayGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/ArrayGenTest.java index 7a1b926962c..1996596edc8 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/ArrayGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/ArrayGenTest.java @@ -166,4 +166,8 @@ public class ArrayGenTest extends CodegenTestCase { Method foo = generateFunction("box"); assertTrue((Integer)foo.invoke(null) == 10); } + + public void testKt503() { + blackBoxFile("regressions/kt503.jet"); + } }