translator: fix multiscope variable resolving

This commit is contained in:
Alexey Stepanov
2016-07-13 12:43:03 +03:00
parent 8b81d9c38b
commit 2fe1a68439
2 changed files with 11 additions and 2 deletions
@@ -248,7 +248,7 @@ class FunctionCodegen(val state: TranslationState, val function: KtNamedFunction
variableManager.addVariable(identifier.text, assignExpression, scopeDepth)
}
is LLVMConstant -> {
val newVar = LLVMVariable("%${identifier!!.text}.addr", type = LLVMIntType(), kotlinName = identifier.text, pointer = true)
val newVar = variableManager.getVariable(identifier!!.text, type = LLVMIntType(), pointer = true)
codeBuilder.addConstant(newVar, assignExpression)
variableManager.addVariable(identifier.text, newVar, scopeDepth)
}
@@ -1,12 +1,14 @@
package org.kotlinnative.translator
import org.kotlinnative.translator.llvm.LLVMVariable
import org.kotlinnative.translator.llvm.types.LLVMType
import java.util.*
class VariableManager {
private var fileVariableCollectionTree = HashMap<String, Stack<Pair<LLVMVariable, Int>>>()
private var globalVariableCollection = HashMap<String, LLVMVariable>()
private var variableVersion = HashMap<String, Int>()
fun getLLVMvalue(variableName: String): LLVMVariable? {
return fileVariableCollectionTree[variableName]?.peek()?.first ?: globalVariableCollection[variableName]
@@ -17,9 +19,16 @@ class VariableManager {
}
fun addVariable(name: String, variable: LLVMVariable, level: Int) {
val stack = fileVariableCollectionTree.getOrDefault(String, Stack<Pair<LLVMVariable, Int>>())
val stack = fileVariableCollectionTree.getOrDefault(name, Stack<Pair<LLVMVariable, Int>>())
stack.push(Pair(variable, level))
fileVariableCollectionTree.put(name, stack)
}
fun getVariable(name: String, type: LLVMType, pointer: Boolean): LLVMVariable {
val ourVersion = variableVersion.getOrDefault(name, 0) + 1
variableVersion.put(name, ourVersion)
return LLVMVariable("%managed.${name}.${ourVersion}", kotlinName = name, type = type, pointer = pointer)
}
}