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) {
|
||||
is KtCallExpression,
|
||||
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)
|
||||
}
|
||||
|
||||
|
||||
@@ -219,7 +219,7 @@ class LLVMBuilder(val arm: Boolean) {
|
||||
|
||||
fun createClass(name: String, fields: List<LLVMVariable>) {
|
||||
val code = "%class.$name = type { ${fields.map { it.getType() }.joinToString()} }"
|
||||
localCode.appendln(code)
|
||||
globalCode.appendln(code)
|
||||
}
|
||||
|
||||
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