From 01b405c86a1d6c957c51937a327eff925016ccfc Mon Sep 17 00:00:00 2001 From: Alex Tkachman Date: Wed, 18 Jan 2012 17:34:48 +0100 Subject: [PATCH] KT-1055 wrong identityEquals codegen --- .../jetbrains/jet/codegen/intrinsics/Equals.java | 13 ++++++++++--- compiler/testData/codegen/regressions/kt1055.kt | 6 ++++++ .../jetbrains/jet/codegen/PrimitiveTypesTest.java | 4 ++++ 3 files changed, 20 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/codegen/regressions/kt1055.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/Equals.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/Equals.java index 8a9280c0102..246794276a6 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/Equals.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/Equals.java @@ -21,10 +21,11 @@ import java.util.List; public class Equals implements IntrinsicMethod { @Override public StackValue generate(ExpressionCodegen codegen, InstructionAdapter v, Type expectedType, PsiElement element, List arguments, StackValue receiver) { - receiver.put(JetTypeMapper.TYPE_OBJECT, v); boolean leftNullable = true; + JetExpression rightExpr; if(element instanceof JetCallExpression) { + receiver.put(JetTypeMapper.TYPE_OBJECT, v); JetCallExpression jetCallExpression = (JetCallExpression) element; JetExpression calleeExpression = jetCallExpression.getCalleeExpression(); if(calleeExpression != null) { @@ -32,9 +33,15 @@ public class Equals implements IntrinsicMethod { if(leftType != null) leftNullable = leftType.isNullable(); } + rightExpr = arguments.get(0); } - - JetExpression rightExpr = arguments.get(0); + else { + JetExpression leftExpr = arguments.get(0); + leftNullable = codegen.getBindingContext().get(BindingContext.EXPRESSION_TYPE, leftExpr).isNullable(); + codegen.gen(leftExpr).put(JetTypeMapper.TYPE_OBJECT, v); + rightExpr = arguments.get(1); + } + JetType rightType = codegen.getBindingContext().get(BindingContext.EXPRESSION_TYPE, rightExpr); codegen.gen(rightExpr).put(JetTypeMapper.TYPE_OBJECT, v); diff --git a/compiler/testData/codegen/regressions/kt1055.kt b/compiler/testData/codegen/regressions/kt1055.kt new file mode 100644 index 00000000000..b8ecd4cfee4 --- /dev/null +++ b/compiler/testData/codegen/regressions/kt1055.kt @@ -0,0 +1,6 @@ +fun box() : String { + val a = "lala" + if(!a.identityEquals(a)) return "fail 1" + if(a identityEquals a) return "OK" + return "fail 2" +} \ 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 fc073e4bd1f..3dedbb19755 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/PrimitiveTypesTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/PrimitiveTypesTest.java @@ -391,4 +391,8 @@ public class PrimitiveTypesTest extends CodegenTestCase { public void testKt935 () { blackBoxFile("regressions/kt935.kt"); } + + public void testKt1055 () { + blackBoxFile("regressions/kt1055.kt"); + } }