translator: evaluate dot expression left part
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user