translator: fix this in initialization in place
This commit is contained in:
@@ -187,6 +187,7 @@ abstract class StructCodegen(val state: TranslationState,
|
||||
val blockCodegen = object : BlockCodegen(state, variableManager, codeBuilder) {}
|
||||
val receiverThis = LLVMVariable("classvariable.this.addr", type, scope = LLVMRegisterScope(), pointer = 1)
|
||||
codeBuilder.addComment("field initilizers starts")
|
||||
variableManager.addVariable("this", receiverThis, 2)
|
||||
for ((variable, initializer) in initializedFields) {
|
||||
val left = blockCodegen.evaluateMemberMethodOrField(receiverThis, variable.label, blockCodegen.topLevel, call = null)!!
|
||||
codeBuilder.addComment("left expression")
|
||||
@@ -195,6 +196,7 @@ abstract class StructCodegen(val state: TranslationState,
|
||||
blockCodegen.executeBinaryExpression(KtTokens.EQ, referenceName = null, left = left, right = right)
|
||||
codeBuilder.addComment("next initializer")
|
||||
}
|
||||
variableManager.pullOneUpwardLevelVariable("this")
|
||||
codeBuilder.addComment("field initilizers ends")
|
||||
}
|
||||
|
||||
|
||||
@@ -14,8 +14,12 @@ class VariableManager(val globalVariableCollection: HashMap<String, LLVMVariable
|
||||
return fileVariableCollectionTree[variableName]?.peek()?.first ?: globalVariableCollection[variableName]
|
||||
}
|
||||
|
||||
fun pullOneUpwardLevelVariable(variableName: String) {
|
||||
fileVariableCollectionTree[variableName]?.pop()
|
||||
}
|
||||
|
||||
fun pullUpwardsLevel(level: Int) {
|
||||
fileVariableCollectionTree.forEach { s, stack -> while (!stack.empty() && stack.peek().second >= level) stack.pop() }
|
||||
fileVariableCollectionTree.forEach { s, stack -> while (!stack.empty() && stack.peek().second >= level) stack.pop() }
|
||||
}
|
||||
|
||||
fun addVariable(name: String, variable: LLVMVariable, level: Int) {
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
initialization_in_place_and_this_1() == 100
|
||||
@@ -0,0 +1,21 @@
|
||||
class initialization_in_place_and_this_1_slave_1(var size: Int)
|
||||
|
||||
class initialization_in_place_and_this_1_master(var buffer: initialization_in_place_and_this_1_slave_1) {
|
||||
var output = initialization_in_place_and_this_1_slave_2(buffer)
|
||||
}
|
||||
|
||||
class initialization_in_place_and_this_1_slave_2(val buffer: initialization_in_place_and_this_1_slave_1) {
|
||||
var pos = 897
|
||||
var sz: Int
|
||||
|
||||
init {
|
||||
sz = buffer.size
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
fun initialization_in_place_and_this_1(): Int {
|
||||
val slave = initialization_in_place_and_this_1_slave_1(100)
|
||||
val master = initialization_in_place_and_this_1_master(slave)
|
||||
return master.output.sz
|
||||
}
|
||||
Reference in New Issue
Block a user