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)
|
variableManager.addVariable(identifier.text, assignExpression, scopeDepth)
|
||||||
}
|
}
|
||||||
is LLVMConstant -> {
|
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)
|
codeBuilder.addConstant(newVar, assignExpression)
|
||||||
variableManager.addVariable(identifier.text, newVar, scopeDepth)
|
variableManager.addVariable(identifier.text, newVar, scopeDepth)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,14 @@
|
|||||||
package org.kotlinnative.translator
|
package org.kotlinnative.translator
|
||||||
|
|
||||||
import org.kotlinnative.translator.llvm.LLVMVariable
|
import org.kotlinnative.translator.llvm.LLVMVariable
|
||||||
|
import org.kotlinnative.translator.llvm.types.LLVMType
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
class VariableManager {
|
class VariableManager {
|
||||||
|
|
||||||
private var fileVariableCollectionTree = HashMap<String, Stack<Pair<LLVMVariable, Int>>>()
|
private var fileVariableCollectionTree = HashMap<String, Stack<Pair<LLVMVariable, Int>>>()
|
||||||
private var globalVariableCollection = HashMap<String, LLVMVariable>()
|
private var globalVariableCollection = HashMap<String, LLVMVariable>()
|
||||||
|
private var variableVersion = HashMap<String, Int>()
|
||||||
|
|
||||||
fun getLLVMvalue(variableName: String): LLVMVariable? {
|
fun getLLVMvalue(variableName: String): LLVMVariable? {
|
||||||
return fileVariableCollectionTree[variableName]?.peek()?.first ?: globalVariableCollection[variableName]
|
return fileVariableCollectionTree[variableName]?.peek()?.first ?: globalVariableCollection[variableName]
|
||||||
@@ -17,9 +19,16 @@ class VariableManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun addVariable(name: String, variable: LLVMVariable, level: Int) {
|
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))
|
stack.push(Pair(variable, level))
|
||||||
fileVariableCollectionTree.put(name, stack)
|
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