translator: fix class reassignment in variables
This commit is contained in:
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user