translator: fix multiscope variable resolving
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user