translator: evaluate dot expression left part

This commit is contained in:
e5l
2016-07-22 14:06:49 +03:00
parent c243ab7fc0
commit f8e4a296e2
3 changed files with 27 additions and 10 deletions
@@ -37,7 +37,7 @@ abstract class BlockCodegen(open val state: TranslationState, open val variableM
}
if (result.type is LLVMReferenceType) {
codeBuilder.addAnyReturn(LLVMVoidType())
genReferenceReturn(result)
} else {
codeBuilder.addReturnOperator(result)
}
@@ -121,7 +121,12 @@ abstract class BlockCodegen(open val state: TranslationState, open val variableM
val receiverName = receiverExpr.text
val selectorExpr = expr.selectorExpression!!
var receiver = variableManager.getLLVMvalue(receiverName)
var receiver = when (receiverExpr) {
is KtCallExpression,
is KtBinaryExpression -> evaluateExpression(receiverExpr, scopeDepth) as LLVMVariable
else -> variableManager.getLLVMvalue(receiverName)
}
if (receiver != null) {
if (receiver.pointer == 2) {
receiver = codeBuilder.loadAndGetVariable(receiver)
@@ -679,14 +684,7 @@ abstract class BlockCodegen(open val state: TranslationState, open val variableM
val type = retVar?.type ?: LLVMVoidType()
when (type) {
is LLVMReferenceType -> {
if (retVar!!.pointer == 2) {
retVar = codeBuilder.loadAndGetVariable(retVar as LLVMVariable)
}
codeBuilder.storeVariable(returnType!!, retVar)
codeBuilder.addAnyReturn(LLVMVoidType())
}
is LLVMReferenceType -> genReferenceReturn(retVar!!)
is LLVMVoidType -> {
codeBuilder.addAnyReturn(LLVMVoidType())
}
@@ -700,4 +698,14 @@ abstract class BlockCodegen(open val state: TranslationState, open val variableM
}
return null
}
private fun genReferenceReturn(retVar: LLVMSingleValue) {
var result = retVar
if (result.pointer == 2) {
result = codeBuilder.loadAndGetVariable(retVar as LLVMVariable)
}
codeBuilder.storeVariable(returnType!!, result)
codeBuilder.addAnyReturn(LLVMVoidType())
}
}
@@ -0,0 +1,2 @@
test1_Int(1) == 1
test2_Int(2) == 2
@@ -0,0 +1,7 @@
class MyClass(val i: Int)
fun gen(i: Int) = MyClass(i)
fun test1(q: Int) = gen(q).i
fun test2(w: Int) = MyClass(w).i