translator: fix access to class variables which are classes and fix class declaration order

This commit is contained in:
Alexey Stepanov
2016-08-09 12:39:05 +03:00
parent 1826db5936
commit 36cef0a401
4 changed files with 31 additions and 1 deletions
@@ -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()
}