translator: fix class reassignment in variables

This commit is contained in:
Alexey Stepanov
2016-08-22 16:17:22 +03:00
parent 09159f750d
commit 183357fa40
7 changed files with 43 additions and 29 deletions
@@ -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 -> {
@@ -1 +0,0 @@
class_reassigment_1() == 567
@@ -0,0 +1 @@
class_reassignment_1() == 567
@@ -0,0 +1 @@
class_reassignment_2() == 10605
@@ -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
}
@@ -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
}
@@ -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
}