From cb2eb96b6485d80b2a3d684f04f912e8c1b5101a Mon Sep 17 00:00:00 2001 From: Alexey Stepanov Date: Mon, 15 Aug 2016 17:45:59 +0300 Subject: [PATCH] translator: fix this in initialization in place --- .../kotlinnative/translator/StructCodegen.kt | 2 ++ .../translator/VariableManager.kt | 6 +++++- .../initialization_in_place_and_this_1.txt | 1 + .../initialization_in_place_and_this_1.kt | 21 +++++++++++++++++++ 4 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 translator/src/test/kotlin/tests/input/initialization_in_place_and_this_1.txt create mode 100644 translator/src/test/kotlin/tests/kotlin/initialization_in_place_and_this_1.kt diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/StructCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/StructCodegen.kt index 889ff36a597..f992331d029 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/StructCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/StructCodegen.kt @@ -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") } diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/VariableManager.kt b/translator/src/main/kotlin/org/kotlinnative/translator/VariableManager.kt index 1bc9828a501..6f917dda40a 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/VariableManager.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/VariableManager.kt @@ -14,8 +14,12 @@ class VariableManager(val globalVariableCollection: HashMap 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) { diff --git a/translator/src/test/kotlin/tests/input/initialization_in_place_and_this_1.txt b/translator/src/test/kotlin/tests/input/initialization_in_place_and_this_1.txt new file mode 100644 index 00000000000..c36054ac9bd --- /dev/null +++ b/translator/src/test/kotlin/tests/input/initialization_in_place_and_this_1.txt @@ -0,0 +1 @@ +initialization_in_place_and_this_1() == 100 diff --git a/translator/src/test/kotlin/tests/kotlin/initialization_in_place_and_this_1.kt b/translator/src/test/kotlin/tests/kotlin/initialization_in_place_and_this_1.kt new file mode 100644 index 00000000000..9e933327051 --- /dev/null +++ b/translator/src/test/kotlin/tests/kotlin/initialization_in_place_and_this_1.kt @@ -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 +} \ No newline at end of file