Removed CodeContext from scope of a variable
This commit is contained in:
+5
-5
@@ -431,16 +431,16 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid
|
|||||||
private inner class VariableScope : InnerScopeImpl() {
|
private inner class VariableScope : InnerScopeImpl() {
|
||||||
|
|
||||||
override fun genDeclareVariable(descriptor: VariableDescriptor, value: LLVMValueRef?): Int {
|
override fun genDeclareVariable(descriptor: VariableDescriptor, value: LLVMValueRef?): Int {
|
||||||
return codegen.vars.createVariable(descriptor to this, value)
|
return codegen.vars.createVariable(descriptor, value)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getDeclaredVariable(descriptor: VariableDescriptor): Int {
|
override fun getDeclaredVariable(descriptor: VariableDescriptor): Int {
|
||||||
val index = codegen.vars.indexOf(descriptor to this)
|
val index = codegen.vars.indexOf(descriptor)
|
||||||
return if (index < 0) super.getDeclaredVariable(descriptor) else return index
|
return if (index < 0) super.getDeclaredVariable(descriptor) else return index
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun genGetValue(descriptor: ValueDescriptor): LLVMValueRef {
|
override fun genGetValue(descriptor: ValueDescriptor): LLVMValueRef {
|
||||||
val index = codegen.vars.indexOf(descriptor to this)
|
val index = codegen.vars.indexOf(descriptor)
|
||||||
if (index < 0) {
|
if (index < 0) {
|
||||||
return super.genGetValue(descriptor)
|
return super.genGetValue(descriptor)
|
||||||
} else {
|
} else {
|
||||||
@@ -460,13 +460,13 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid
|
|||||||
|
|
||||||
init {
|
init {
|
||||||
parameters.map { (descriptor, value) ->
|
parameters.map { (descriptor, value) ->
|
||||||
codegen.vars.createImmutable(descriptor to this, value)
|
codegen.vars.createImmutable(descriptor, value)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun genGetValue(descriptor: ValueDescriptor): LLVMValueRef {
|
override fun genGetValue(descriptor: ValueDescriptor): LLVMValueRef {
|
||||||
val index = codegen.vars.indexOf(descriptor to this)
|
val index = codegen.vars.indexOf(descriptor)
|
||||||
if (index < 0) {
|
if (index < 0) {
|
||||||
return super.genGetValue(descriptor)
|
return super.genGetValue(descriptor)
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
+15
-25
@@ -19,7 +19,6 @@ package org.jetbrains.kotlin.backend.konan.llvm
|
|||||||
import llvm.*
|
import llvm.*
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.types.*
|
|
||||||
|
|
||||||
|
|
||||||
internal class VariableManager(val codegen: CodeGenerator) {
|
internal class VariableManager(val codegen: CodeGenerator) {
|
||||||
@@ -43,13 +42,8 @@ internal class VariableManager(val codegen: CodeGenerator) {
|
|||||||
override fun toString() = "value of ${value} from ${name}"
|
override fun toString() = "value of ${value} from ${name}"
|
||||||
}
|
}
|
||||||
|
|
||||||
data class ScopedVariable private constructor(val descriptor: ValueDescriptor, val context: CodeContext)
|
|
||||||
{
|
|
||||||
constructor(scoped: Pair<ValueDescriptor, CodeContext>) : this(scoped.first, scoped.second)
|
|
||||||
}
|
|
||||||
|
|
||||||
val variables: ArrayList<Record> = arrayListOf()
|
val variables: ArrayList<Record> = arrayListOf()
|
||||||
val contextVariablesToIndex: HashMap<ScopedVariable, Int> = hashMapOf()
|
val contextVariablesToIndex: HashMap<ValueDescriptor, Int> = hashMapOf()
|
||||||
|
|
||||||
// Clears inner state of variable manager.
|
// Clears inner state of variable manager.
|
||||||
fun clear() {
|
fun clear() {
|
||||||
@@ -57,31 +51,28 @@ internal class VariableManager(val codegen: CodeGenerator) {
|
|||||||
contextVariablesToIndex.clear()
|
contextVariablesToIndex.clear()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun createVariable(scoped: Pair<VariableDescriptor, CodeContext>, value: LLVMValueRef? = null) : Int {
|
fun createVariable(descriptor: VariableDescriptor, value: LLVMValueRef? = null) : Int {
|
||||||
// Note that we always create slot for object references for memory management.
|
// Note that we always create slot for object references for memory management.
|
||||||
val descriptor = scoped.first
|
|
||||||
if (!descriptor.isVar && value != null)
|
if (!descriptor.isVar && value != null)
|
||||||
return createImmutable(scoped, value)
|
return createImmutable(descriptor, value)
|
||||||
else
|
else
|
||||||
// Unfortunately, we have to create mutable slots here,
|
// Unfortunately, we have to create mutable slots here,
|
||||||
// as even vals can be assigned on multiple paths. However, we use varness
|
// as even vals can be assigned on multiple paths. However, we use varness
|
||||||
// knowledge, as anonymous slots are created only for true vars (for vals
|
// knowledge, as anonymous slots are created only for true vars (for vals
|
||||||
// their single assigner already have slot).
|
// their single assigner already have slot).
|
||||||
return createMutable(scoped, descriptor.isVar, value)
|
return createMutable(descriptor, descriptor.isVar, value)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun createMutable(scoped: Pair<VariableDescriptor, CodeContext>,
|
fun createMutable(descriptor: VariableDescriptor,
|
||||||
isVar: Boolean, value: LLVMValueRef? = null) : Int {
|
isVar: Boolean, value: LLVMValueRef? = null) : Int {
|
||||||
val descriptor = scoped.first
|
assert(!contextVariablesToIndex.contains(descriptor))
|
||||||
val scopedVariable = ScopedVariable(scoped)
|
|
||||||
assert(!contextVariablesToIndex.contains(scopedVariable))
|
|
||||||
val index = variables.size
|
val index = variables.size
|
||||||
val type = codegen.getLLVMType(descriptor.type)
|
val type = codegen.getLLVMType(descriptor.type)
|
||||||
val slot = codegen.alloca(type, scopedVariable.descriptor.name.asString())
|
val slot = codegen.alloca(type, descriptor.name.asString())
|
||||||
if (value != null)
|
if (value != null)
|
||||||
codegen.storeAnyLocal(value, slot)
|
codegen.storeAnyLocal(value, slot)
|
||||||
variables.add(SlotRecord(slot, codegen.isObjectType(type), isVar))
|
variables.add(SlotRecord(slot, codegen.isObjectType(type), isVar))
|
||||||
contextVariablesToIndex[scopedVariable] = index
|
contextVariablesToIndex[descriptor] = index
|
||||||
return index
|
return index
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -101,18 +92,17 @@ internal class VariableManager(val codegen: CodeGenerator) {
|
|||||||
return index
|
return index
|
||||||
}
|
}
|
||||||
|
|
||||||
fun createImmutable(scoped: Pair<ValueDescriptor, CodeContext>, value: LLVMValueRef) : Int {
|
fun createImmutable(descriptor: ValueDescriptor, value: LLVMValueRef) : Int {
|
||||||
val scopedVariable = ScopedVariable(scoped)
|
if (contextVariablesToIndex.containsKey(descriptor))
|
||||||
if (contextVariablesToIndex.containsKey(scopedVariable))
|
throw Error("$descriptor is already defined")
|
||||||
throw Error("${scopedVariable.descriptor} is already defined")
|
|
||||||
val index = variables.size
|
val index = variables.size
|
||||||
variables.add(ValueRecord(value, scopedVariable.descriptor.name))
|
variables.add(ValueRecord(value, descriptor.name))
|
||||||
contextVariablesToIndex[scopedVariable] = index
|
contextVariablesToIndex[descriptor] = index
|
||||||
return index
|
return index
|
||||||
}
|
}
|
||||||
|
|
||||||
fun indexOf(scoped: Pair<ValueDescriptor, CodeContext>) : Int {
|
fun indexOf(descriptor: ValueDescriptor) : Int {
|
||||||
return contextVariablesToIndex.getOrElse(ScopedVariable(scoped)) { -1 }
|
return contextVariablesToIndex.getOrElse(descriptor) { -1 }
|
||||||
}
|
}
|
||||||
|
|
||||||
fun addressOf(index: Int): LLVMValueRef {
|
fun addressOf(index: Int): LLVMValueRef {
|
||||||
|
|||||||
Reference in New Issue
Block a user