From 91549ed359a1ea270e08219ad10c25a77e080b7e Mon Sep 17 00:00:00 2001 From: Alex Tkachman Date: Mon, 5 Dec 2011 16:55:17 +0200 Subject: [PATCH] KT-752 RangeTo intrinsic called with receiver --- .../jet/codegen/intrinsics/RangeTo.java | 20 +++++++++++++------ .../testData/codegen/regressions/kt752.jet | 12 +++++++++++ .../jet/codegen/PrimitiveTypesTest.java | 5 +++++ 3 files changed, 31 insertions(+), 6 deletions(-) create mode 100644 compiler/testData/codegen/regressions/kt752.jet diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/RangeTo.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/RangeTo.java index 86850d21051..ac46bd31b60 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/RangeTo.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/RangeTo.java @@ -18,16 +18,24 @@ import java.util.List; public class RangeTo implements IntrinsicMethod { @Override public StackValue generate(ExpressionCodegen codegen, InstructionAdapter v, Type expectedType, PsiElement element, List arguments, StackValue receiver) { - JetBinaryExpression expression = (JetBinaryExpression) element; - final Type leftType = codegen.expressionType(expression.getLeft()); - if (JetTypeMapper.isIntPrimitive(leftType)) { - codegen.gen(expression.getLeft(), Type.INT_TYPE); - codegen.gen(expression.getRight(), Type.INT_TYPE); + if(arguments.size()==1) { + receiver.put(Type.INT_TYPE, v); + codegen.gen(arguments.get(0), Type.INT_TYPE); v.invokestatic("jet/IntRange", "rangeTo", "(II)Ljet/IntRange;"); return StackValue.onStack(JetTypeMapper.TYPE_INT_RANGE); } else { - throw new UnsupportedOperationException("ranges are only supported for int objects"); + JetBinaryExpression expression = (JetBinaryExpression) element; + final Type leftType = codegen.expressionType(expression.getLeft()); + if (JetTypeMapper.isIntPrimitive(leftType)) { + codegen.gen(expression.getLeft(), Type.INT_TYPE); + codegen.gen(expression.getRight(), Type.INT_TYPE); + v.invokestatic("jet/IntRange", "rangeTo", "(II)Ljet/IntRange;"); + return StackValue.onStack(JetTypeMapper.TYPE_INT_RANGE); + } + else { + throw new UnsupportedOperationException("ranges are only supported for int objects"); + } } } } diff --git a/compiler/testData/codegen/regressions/kt752.jet b/compiler/testData/codegen/regressions/kt752.jet new file mode 100644 index 00000000000..20132c9f6a8 --- /dev/null +++ b/compiler/testData/codegen/regressions/kt752.jet @@ -0,0 +1,12 @@ +namespace demo_range + +fun Int?.rangeTo(other : Int?) : IntRange = this.sure().rangeTo(other.sure()) + +fun box() : String { + val x : Int? = 10 + val y : Int? = 12 + + for (i in x..y) + System.out?.println(i.inv()) + return "OK" +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/PrimitiveTypesTest.java b/compiler/tests/org/jetbrains/jet/codegen/PrimitiveTypesTest.java index 9fda35ee5ad..30edd4d4a3d 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/PrimitiveTypesTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/PrimitiveTypesTest.java @@ -337,4 +337,9 @@ public class PrimitiveTypesTest extends CodegenTestCase { // System.out.println(generateToText()); blackBox(); } + + public void testKt752 () { + blackBoxFile("regressions/kt752.jet"); + System.out.println(generateToText()); + } }