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 blockCodegen = object : BlockCodegen(state, variableManager, codeBuilder) {}
|
||||||
val receiverThis = LLVMVariable("classvariable.this.addr", type, scope = LLVMRegisterScope(), pointer = 1)
|
val receiverThis = LLVMVariable("classvariable.this.addr", type, scope = LLVMRegisterScope(), pointer = 1)
|
||||||
codeBuilder.addComment("field initilizers starts")
|
codeBuilder.addComment("field initilizers starts")
|
||||||
|
variableManager.addVariable("this", receiverThis, 2)
|
||||||
for ((variable, initializer) in initializedFields) {
|
for ((variable, initializer) in initializedFields) {
|
||||||
val left = blockCodegen.evaluateMemberMethodOrField(receiverThis, variable.label, blockCodegen.topLevel, call = null)!!
|
val left = blockCodegen.evaluateMemberMethodOrField(receiverThis, variable.label, blockCodegen.topLevel, call = null)!!
|
||||||
codeBuilder.addComment("left expression")
|
codeBuilder.addComment("left expression")
|
||||||
@@ -195,6 +196,7 @@ abstract class StructCodegen(val state: TranslationState,
|
|||||||
blockCodegen.executeBinaryExpression(KtTokens.EQ, referenceName = null, left = left, right = right)
|
blockCodegen.executeBinaryExpression(KtTokens.EQ, referenceName = null, left = left, right = right)
|
||||||
codeBuilder.addComment("next initializer")
|
codeBuilder.addComment("next initializer")
|
||||||
}
|
}
|
||||||
|
variableManager.pullOneUpwardLevelVariable("this")
|
||||||
codeBuilder.addComment("field initilizers ends")
|
codeBuilder.addComment("field initilizers ends")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,8 +14,12 @@ class VariableManager(val globalVariableCollection: HashMap<String, LLVMVariable
|
|||||||
return fileVariableCollectionTree[variableName]?.peek()?.first ?: globalVariableCollection[variableName]
|
return fileVariableCollectionTree[variableName]?.peek()?.first ?: globalVariableCollection[variableName]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun pullOneUpwardLevelVariable(variableName: String) {
|
||||||
|
fileVariableCollectionTree[variableName]?.pop()
|
||||||
|
}
|
||||||
|
|
||||||
fun pullUpwardsLevel(level: Int) {
|
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) {
|
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