[IR] Fixed bug with SharedVariablesManager

This commit is contained in:
Igor Chevdar
2020-04-13 20:04:31 +05:00
parent b638c90100
commit b4787a1379
4 changed files with 36 additions and 18 deletions
@@ -8,11 +8,11 @@ package org.jetbrains.kotlin.backend.konan.descriptors
import org.jetbrains.kotlin.backend.common.ir.SharedVariablesManager
import org.jetbrains.kotlin.backend.konan.KonanBackendContext
import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor
import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.declarations.IrProperty
import org.jetbrains.kotlin.ir.declarations.IrVariable
import org.jetbrains.kotlin.ir.declarations.impl.IrVariableImpl
import org.jetbrains.kotlin.ir.descriptors.WrappedVariableDescriptor
import org.jetbrains.kotlin.ir.expressions.IrGetValue
import org.jetbrains.kotlin.ir.expressions.IrSetVariable
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
@@ -20,9 +20,9 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrCompositeImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrConstructorCallImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl
import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol
import org.jetbrains.kotlin.ir.symbols.impl.IrVariableSymbolImpl
import org.jetbrains.kotlin.ir.types.typeWith
import org.jetbrains.kotlin.ir.util.constructors
import org.jetbrains.kotlin.types.*
internal class KonanSharedVariablesManager(val context: KonanBackendContext) : SharedVariablesManager {
@@ -32,18 +32,7 @@ internal class KonanSharedVariablesManager(val context: KonanBackendContext) : S
private val elementProperty = refClass.owner.declarations.filterIsInstance<IrProperty>().single()
private fun refType(elementType: KotlinType): KotlinType {
return refClass.descriptor.defaultType.replace(listOf(TypeProjectionImpl(elementType)))
}
override fun declareSharedVariable(originalDeclaration: IrVariable): IrVariable {
val variableDescriptor = originalDeclaration.descriptor
val sharedVariableDescriptor = LocalVariableDescriptor(
variableDescriptor.containingDeclaration, variableDescriptor.annotations, variableDescriptor.name,
refType(variableDescriptor.type),
false, false, variableDescriptor.source
)
val valueType = originalDeclaration.type
val refConstructorCall = IrConstructorCallImpl.fromSymbolOwner(
@@ -54,11 +43,19 @@ internal class KonanSharedVariablesManager(val context: KonanBackendContext) : S
putTypeArgument(0, valueType)
}
return IrVariableImpl(
originalDeclaration.startOffset, originalDeclaration.endOffset, originalDeclaration.origin,
sharedVariableDescriptor, refConstructorCall.type
).apply {
initializer = refConstructorCall
return with(originalDeclaration) {
WrappedVariableDescriptor().let {
IrVariableImpl(
startOffset, endOffset, origin,
IrVariableSymbolImpl(it), name, refConstructorCall.type,
isVar = false,
isConst = false,
isLateinit = false
).apply {
it.bind(this)
initializer = refConstructorCall
}
}
}
}
+5
View File
@@ -1301,6 +1301,11 @@ linkTest("initializers_linkTest2") {
lib = "codegen/initializers/linkTest2_lib.kt"
}
linkTest("initializers_sharedVarInInitBlock") {
source = "codegen/initializers/sharedVarInInitBlock_main.kt"
lib = "codegen/initializers/sharedVarInInitBlock_lib.kt"
}
task arithmetic_basic(type: KonanLocalTest) {
source = "codegen/arithmetic/basic.kt"
}
@@ -0,0 +1,13 @@
class A {
val x: Int
init {
var y = 10
fun foo() { y = 42 }
foo()
x = y
}
}
@@ -0,0 +1,3 @@
import kotlin.test.*
fun main() = assertEquals(42, (A().x))