From 500e36995c9bd107fdae83a93e7f9f378734bc19 Mon Sep 17 00:00:00 2001 From: e5l Date: Thu, 21 Jul 2016 10:45:48 +0300 Subject: [PATCH] translator: compare references, null compare --- .../translator/llvm/LLVMBuilder.kt | 6 ++++- .../llvm/types/LLVMReferenceType.kt | 7 +++++- .../src/test/kotlin/tests/input/if_1.txt | 2 ++ .../kotlin/tests/input/nested_classes.txt | 2 +- .../src/test/kotlin/tests/kotlin/if_1.kt | 22 +++++++++++++++++++ .../kotlin/tests/kotlin/nested_classes.kt | 3 ++- 6 files changed, 38 insertions(+), 4 deletions(-) diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt index 8883aa0b249..564de179813 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt @@ -81,7 +81,11 @@ class LLVMBuilder(val arm: Boolean) { KtTokens.GT -> firstOp.type!!.operatorGt(firstNativeOp, secondNativeOp) KtTokens.LTEQ -> firstOp.type!!.operatorLeq(firstNativeOp, secondNativeOp) KtTokens.GTEQ -> firstOp.type!!.operatorGeq(firstNativeOp, secondNativeOp) - KtTokens.EQEQ -> firstOp.type!!.operatorEq(firstNativeOp, secondNativeOp) + KtTokens.EQEQ -> + if (firstOp.type is LLVMReferenceType) + firstOp.type!!.operatorEq(firstOp, secondOp) + else + firstOp.type!!.operatorEq(firstNativeOp, secondNativeOp) KtTokens.EXCLEQ -> firstOp.type!!.operatorNeq(firstNativeOp, secondNativeOp) KtTokens.EQ -> { if (secondOp.type is LLVMNullType) { diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMReferenceType.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMReferenceType.kt index 0b6df465743..c1db5dcb653 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMReferenceType.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMReferenceType.kt @@ -1,5 +1,7 @@ package org.kotlinnative.translator.llvm.types +import org.kotlinnative.translator.llvm.LLVMExpression +import org.kotlinnative.translator.llvm.LLVMSingleValue import java.util.* class LLVMReferenceType(val type: String, var prefix: String = "", override val align: Int = 4, var byRef: Boolean = true) : LLVMType() { @@ -8,7 +10,7 @@ class LLVMReferenceType(val type: String, var prefix: String = "", override val override var size: Int = 4 override fun toString() = "%$prefix${if (prefix.length > 0) "." else ""}${ - if (location.size > 0) "${location.joinToString(".")}." else "" + if (location.size > 0) "${location.joinToString(".")}." else "" }$type" private val params = ArrayList() @@ -18,4 +20,7 @@ class LLVMReferenceType(val type: String, var prefix: String = "", override val fun addParam(param: String) { params.add(param) } + + override fun operatorEq(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = + LLVMExpression(LLVMBooleanType(), "icmp eq ${firstOp.getType()} $firstOp, ${if (secondOp.type is LLVMNullType) "null" else "$secondOp"}") } \ No newline at end of file diff --git a/translator/src/test/kotlin/tests/input/if_1.txt b/translator/src/test/kotlin/tests/input/if_1.txt index d734dc58aaf..7e8736d199f 100644 --- a/translator/src/test/kotlin/tests/input/if_1.txt +++ b/translator/src/test/kotlin/tests/input/if_1.txt @@ -1,2 +1,4 @@ if_test_1(11) == 10 if_test_1(0) == 0 +if_test_null(0) == 1 +if_test_null_2(0) == 0 diff --git a/translator/src/test/kotlin/tests/input/nested_classes.txt b/translator/src/test/kotlin/tests/input/nested_classes.txt index 9b1905d9c22..c3c7ca6995c 100644 --- a/translator/src/test/kotlin/tests/input/nested_classes.txt +++ b/translator/src/test/kotlin/tests/input/nested_classes.txt @@ -1,2 +1,2 @@ nested_test_1(1) == 1 -nested_test_2(1) == 1 \ No newline at end of file +nested_test_2(1) == 5 \ No newline at end of file diff --git a/translator/src/test/kotlin/tests/kotlin/if_1.kt b/translator/src/test/kotlin/tests/kotlin/if_1.kt index fa035e98cf7..90da5a214e5 100644 --- a/translator/src/test/kotlin/tests/kotlin/if_1.kt +++ b/translator/src/test/kotlin/tests/kotlin/if_1.kt @@ -6,4 +6,26 @@ fun if_test_1(x: Int): Int { } return a +} + +class MyClass(i: Int) + +fun if_test_null(x: Int): Int { + + val y: MyClass? = null + if (y == null) { + return 1 + } else { + return 0 + } +} + +fun if_test_null_2(x: Int): Int { + val y: MyClass? = MyClass(1) + + if (y == null) { + return 1 + } else { + return 0 + } } \ No newline at end of file diff --git a/translator/src/test/kotlin/tests/kotlin/nested_classes.kt b/translator/src/test/kotlin/tests/kotlin/nested_classes.kt index b4db59b5b77..c0dfd2b4f93 100644 --- a/translator/src/test/kotlin/tests/kotlin/nested_classes.kt +++ b/translator/src/test/kotlin/tests/kotlin/nested_classes.kt @@ -4,7 +4,8 @@ class Outer() { class Nested(var i: Int) { fun test(): Int { - return 1 + this.i = 5 + return this.i } } }