diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt index d4ee07da62a..5d0c92195c8 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt @@ -26,6 +26,7 @@ import org.kotlinnative.translator.llvm.* import org.kotlinnative.translator.llvm.types.* import java.rmi.UnexpectedException import java.util.* +import javax.lang.model.type.ReferenceType import kotlin.comparisons.compareBy @@ -647,6 +648,7 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va return oldValue } KtTokens.EXCLEXCL -> { + codeBuilder.addComment("start EXCLEXCL") val nullLabel = codeBuilder.getNewLabel(prefix = "nullCheck") val notNullLabel = codeBuilder.getNewLabel(prefix = "nullCheck") val nullCheck = codeBuilder.nullCheck(firstOp) @@ -656,6 +658,7 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va codeBuilder.addExceptionCall("KotlinNullPointerException") codeBuilder.addUnconditionalJump(notNullLabel) codeBuilder.markWithLabel(notNullLabel) + codeBuilder.addComment("end EXCLEXCL") return firstOp } else -> throw UnsupportedOperationException() @@ -1040,27 +1043,22 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va val expectedExpressionType = LLVMMapStandardType(variable.type, state) val assignExpressionType = assignExpression?.type + val isPrimitive = LLVMMapStandardType(variable.type, state) !is LLVMReferred when (assignExpression) { null, is LLVMVariable -> { - if (variable.type.isPrimitiveNumberType() || (assignExpression == null)) { - val allocVar = variableManager.receiveVariable(identifier, expectedExpressionType, LLVMRegisterScope(), pointer = - if (variable.type.isPrimitiveNumberType()) 0 else 1) - codeBuilder.allocStackVar(allocVar) - allocVar.pointer++ - allocVar.kotlinName = identifier + val allocVar = variableManager.receiveVariable(identifier, expectedExpressionType, LLVMRegisterScope(), pointer = + if (isPrimitive) 0 else 1) + codeBuilder.allocStackVar(allocVar) + allocVar.pointer++ + allocVar.kotlinName = identifier - variableManager.addVariable(identifier, allocVar, scopeDepth) - if (assignExpression != null) { - if (assignExpression.type is LLVMReferenceType) { - throw UnexpectedException(element.text) - } - - addPrimitiveBinaryOperation(KtTokens.EQ, null, allocVar, assignExpression) + variableManager.addVariable(identifier, allocVar, scopeDepth) + if (assignExpression != null) { + if ((isPrimitive) && (assignExpression.type is LLVMReferenceType)) { + throw UnexpectedException(element.text) } - } else { - (assignExpression as LLVMVariable).kotlinName = identifier - variableManager.addVariable(identifier, assignExpression, scopeDepth) + addPrimitiveBinaryOperation(KtTokens.EQ, null, allocVar, assignExpression) } } is LLVMConstant -> { diff --git a/translator/src/test/kotlin/tests/input/class_reassigment_1.txt b/translator/src/test/kotlin/tests/input/class_reassigment_1.txt deleted file mode 100644 index 80065f860c6..00000000000 --- a/translator/src/test/kotlin/tests/input/class_reassigment_1.txt +++ /dev/null @@ -1 +0,0 @@ -class_reassigment_1() == 567 diff --git a/translator/src/test/kotlin/tests/input/class_reassignment_1.txt b/translator/src/test/kotlin/tests/input/class_reassignment_1.txt new file mode 100644 index 00000000000..1a15c1493a0 --- /dev/null +++ b/translator/src/test/kotlin/tests/input/class_reassignment_1.txt @@ -0,0 +1 @@ +class_reassignment_1() == 567 diff --git a/translator/src/test/kotlin/tests/input/class_reassignment_2.txt b/translator/src/test/kotlin/tests/input/class_reassignment_2.txt new file mode 100644 index 00000000000..bc9cdca2635 --- /dev/null +++ b/translator/src/test/kotlin/tests/input/class_reassignment_2.txt @@ -0,0 +1 @@ +class_reassignment_2() == 10605 diff --git a/translator/src/test/kotlin/tests/kotlin/class_reassigment_1.kt b/translator/src/test/kotlin/tests/kotlin/class_reassigment_1.kt deleted file mode 100644 index 3d843b78ea3..00000000000 --- a/translator/src/test/kotlin/tests/kotlin/class_reassigment_1.kt +++ /dev/null @@ -1,12 +0,0 @@ -class class_reassigment_1_class(val field: Int) - -fun class_reassigment_1_base() : class_reassigment_1_class{ - val instance = class_reassigment_1_class(567) - return instance -} - -fun class_reassigment_1(): Int{ - var instance = class_reassigment_1_class(123) - instance = class_reassigment_1_base() - return instance.field -} \ No newline at end of file diff --git a/translator/src/test/kotlin/tests/kotlin/class_reassignment_1.kt b/translator/src/test/kotlin/tests/kotlin/class_reassignment_1.kt new file mode 100644 index 00000000000..aa04098aae1 --- /dev/null +++ b/translator/src/test/kotlin/tests/kotlin/class_reassignment_1.kt @@ -0,0 +1,12 @@ +class class_reassignment_1_class(val field: Int) + +fun class_reassignment_1_base(): class_reassignment_1_class { + val instance = class_reassignment_1_class(567) + return instance +} + +fun class_reassignment_1(): Int { + var instance = class_reassignment_1_class(123) + instance = class_reassignment_1_base() + return instance.field +} \ No newline at end of file diff --git a/translator/src/test/kotlin/tests/kotlin/class_reassignment_2.kt b/translator/src/test/kotlin/tests/kotlin/class_reassignment_2.kt new file mode 100644 index 00000000000..0614be58541 --- /dev/null +++ b/translator/src/test/kotlin/tests/kotlin/class_reassignment_2.kt @@ -0,0 +1,15 @@ +class class_reassignment_2_Node { + var left: class_reassignment_2_Node? = null + var right: class_reassignment_2_Node? = null + var value: Int = 0 +} + +fun class_reassignment_2(): Int { + val root: class_reassignment_2_Node = class_reassignment_2_Node() + root.value = 12 + root.left = class_reassignment_2_Node() + var current: class_reassignment_2_Node? = root + current = root.left + current!!.value = 10593 + return current.value + root.value +} \ No newline at end of file