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 org.kotlinnative.translator.llvm.types.*
|
||||||
import java.rmi.UnexpectedException
|
import java.rmi.UnexpectedException
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
import javax.lang.model.type.ReferenceType
|
||||||
import kotlin.comparisons.compareBy
|
import kotlin.comparisons.compareBy
|
||||||
|
|
||||||
|
|
||||||
@@ -647,6 +648,7 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va
|
|||||||
return oldValue
|
return oldValue
|
||||||
}
|
}
|
||||||
KtTokens.EXCLEXCL -> {
|
KtTokens.EXCLEXCL -> {
|
||||||
|
codeBuilder.addComment("start EXCLEXCL")
|
||||||
val nullLabel = codeBuilder.getNewLabel(prefix = "nullCheck")
|
val nullLabel = codeBuilder.getNewLabel(prefix = "nullCheck")
|
||||||
val notNullLabel = codeBuilder.getNewLabel(prefix = "nullCheck")
|
val notNullLabel = codeBuilder.getNewLabel(prefix = "nullCheck")
|
||||||
val nullCheck = codeBuilder.nullCheck(firstOp)
|
val nullCheck = codeBuilder.nullCheck(firstOp)
|
||||||
@@ -656,6 +658,7 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va
|
|||||||
codeBuilder.addExceptionCall("KotlinNullPointerException")
|
codeBuilder.addExceptionCall("KotlinNullPointerException")
|
||||||
codeBuilder.addUnconditionalJump(notNullLabel)
|
codeBuilder.addUnconditionalJump(notNullLabel)
|
||||||
codeBuilder.markWithLabel(notNullLabel)
|
codeBuilder.markWithLabel(notNullLabel)
|
||||||
|
codeBuilder.addComment("end EXCLEXCL")
|
||||||
return firstOp
|
return firstOp
|
||||||
}
|
}
|
||||||
else -> throw UnsupportedOperationException()
|
else -> throw UnsupportedOperationException()
|
||||||
@@ -1040,27 +1043,22 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va
|
|||||||
val expectedExpressionType = LLVMMapStandardType(variable.type, state)
|
val expectedExpressionType = LLVMMapStandardType(variable.type, state)
|
||||||
val assignExpressionType = assignExpression?.type
|
val assignExpressionType = assignExpression?.type
|
||||||
|
|
||||||
|
val isPrimitive = LLVMMapStandardType(variable.type, state) !is LLVMReferred
|
||||||
when (assignExpression) {
|
when (assignExpression) {
|
||||||
null,
|
null,
|
||||||
is LLVMVariable -> {
|
is LLVMVariable -> {
|
||||||
if (variable.type.isPrimitiveNumberType() || (assignExpression == null)) {
|
val allocVar = variableManager.receiveVariable(identifier, expectedExpressionType, LLVMRegisterScope(), pointer =
|
||||||
val allocVar = variableManager.receiveVariable(identifier, expectedExpressionType, LLVMRegisterScope(), pointer =
|
if (isPrimitive) 0 else 1)
|
||||||
if (variable.type.isPrimitiveNumberType()) 0 else 1)
|
codeBuilder.allocStackVar(allocVar)
|
||||||
codeBuilder.allocStackVar(allocVar)
|
allocVar.pointer++
|
||||||
allocVar.pointer++
|
allocVar.kotlinName = identifier
|
||||||
allocVar.kotlinName = identifier
|
|
||||||
|
|
||||||
variableManager.addVariable(identifier, allocVar, scopeDepth)
|
variableManager.addVariable(identifier, allocVar, scopeDepth)
|
||||||
if (assignExpression != null) {
|
if (assignExpression != null) {
|
||||||
if (assignExpression.type is LLVMReferenceType) {
|
if ((isPrimitive) && (assignExpression.type is LLVMReferenceType)) {
|
||||||
throw UnexpectedException(element.text)
|
throw UnexpectedException(element.text)
|
||||||
}
|
|
||||||
|
|
||||||
addPrimitiveBinaryOperation(KtTokens.EQ, null, allocVar, assignExpression)
|
|
||||||
}
|
}
|
||||||
} else {
|
addPrimitiveBinaryOperation(KtTokens.EQ, null, allocVar, assignExpression)
|
||||||
(assignExpression as LLVMVariable).kotlinName = identifier
|
|
||||||
variableManager.addVariable(identifier, assignExpression, scopeDepth)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
is LLVMConstant -> {
|
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