translator: fix access to class variables which are classes and fix class declaration order
This commit is contained in:
@@ -176,6 +176,17 @@ abstract class BlockCodegen(open val state: TranslationState, open val variableM
|
|||||||
var receiver = when (receiverExpr) {
|
var receiver = when (receiverExpr) {
|
||||||
is KtCallExpression,
|
is KtCallExpression,
|
||||||
is KtBinaryExpression -> evaluateExpression(receiverExpr, scopeDepth) as LLVMVariable
|
is KtBinaryExpression -> evaluateExpression(receiverExpr, scopeDepth) as LLVMVariable
|
||||||
|
is KtNameReferenceExpression ->{
|
||||||
|
val referenceContext = state.bindingContext.get(BindingContext.REFERENCE_TARGET, receiverExpr)
|
||||||
|
variableManager.get(receiverName)
|
||||||
|
when (referenceContext) {
|
||||||
|
is PropertyDescriptorImpl -> {
|
||||||
|
val receiverThis = variableManager.get("this")!!
|
||||||
|
evaluateMemberMethodOrField(receiverThis, receiverName, topLevel, call = null)!! as LLVMVariable
|
||||||
|
}
|
||||||
|
else -> variableManager.get(receiverName)
|
||||||
|
}
|
||||||
|
}
|
||||||
else -> variableManager.get(receiverName)
|
else -> variableManager.get(receiverName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -219,7 +219,7 @@ class LLVMBuilder(val arm: Boolean) {
|
|||||||
|
|
||||||
fun createClass(name: String, fields: List<LLVMVariable>) {
|
fun createClass(name: String, fields: List<LLVMVariable>) {
|
||||||
val code = "%class.$name = type { ${fields.map { it.getType() }.joinToString()} }"
|
val code = "%class.$name = type { ${fields.map { it.getType() }.joinToString()} }"
|
||||||
localCode.appendln(code)
|
globalCode.appendln(code)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun bitcast(src: LLVMVariable, llvmType: LLVMVariable): LLVMVariable {
|
fun bitcast(src: LLVMVariable, llvmType: LLVMVariable): LLVMVariable {
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
class_variable_access_1_test_Int(22) == 30
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
class class_variable_access_1_donor(var size: Int) {
|
||||||
|
val data: Int = 5
|
||||||
|
}
|
||||||
|
|
||||||
|
class class_variable_access_1_owner(val arg: class_variable_access_1_donor) {
|
||||||
|
val tKIopsD = 56
|
||||||
|
fun getSize(): Int {
|
||||||
|
return arg.size + 8
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun class_variable_access_1_test(x: Int): Int {
|
||||||
|
val instance_donor = class_variable_access_1_donor(x)
|
||||||
|
val instance_owner = class_variable_access_1_owner(instance_donor)
|
||||||
|
|
||||||
|
return instance_owner.getSize()
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user