translator: fix this in initialization in place

This commit is contained in:
Alexey Stepanov
2016-08-15 17:45:59 +03:00
parent 198924163e
commit cb2eb96b64
4 changed files with 29 additions and 1 deletions
@@ -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
}