|
|
|
@@ -23,10 +23,30 @@ abstract class BlockCodegen(open val state: TranslationState, open val variableM
|
|
|
|
|
var returnType: LLVMVariable? = null
|
|
|
|
|
var wasReturnOnTopLevel = false
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
protected fun evaluateCodeBlock(expr: PsiElement?, startLabel: LLVMLabel? = null, finishLabel: LLVMLabel? = null, scopeDepth: Int = 0) {
|
|
|
|
|
protected fun evaluateCodeBlock(expr: PsiElement?, startLabel: LLVMLabel? = null, finishLabel: LLVMLabel? = null, scopeDepth: Int = 0, isBlock: Boolean = true) {
|
|
|
|
|
codeBuilder.markWithLabel(startLabel)
|
|
|
|
|
expressionWalker(expr, scopeDepth)
|
|
|
|
|
if (isBlock) {
|
|
|
|
|
expressionWalker(expr, scopeDepth)
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
|
|
var result = evaluateExpression(expr, scopeDepth)!!
|
|
|
|
|
when (result) {
|
|
|
|
|
is LLVMVariable -> {
|
|
|
|
|
if (result.pointer == 1 && result.type !is LLVMReferenceType) {
|
|
|
|
|
result = codeBuilder.loadAndGetVariable(result)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (result.type is LLVMReferenceType) {
|
|
|
|
|
codeBuilder.addAnyReturn(LLVMVoidType())
|
|
|
|
|
} else {
|
|
|
|
|
codeBuilder.addReturnOperator(result)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else -> codeBuilder.addAnyReturn(result.type!!, result.toString())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
wasReturnOnTopLevel = true
|
|
|
|
|
}
|
|
|
|
|
codeBuilder.addUnconditionalJump(finishLabel ?: return)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -171,7 +191,7 @@ abstract class BlockCodegen(open val state: TranslationState, open val variableM
|
|
|
|
|
|
|
|
|
|
val names = parseArgList(call as KtCallExpression, scopeDepth)
|
|
|
|
|
val typePath = type.location.joinToString(".")
|
|
|
|
|
val types = if (names.size > 0) "_${names.joinToString(separator = "_", transform ={ it.type!!.mangle() })}" else ""
|
|
|
|
|
val types = if (names.size > 0) "_${names.joinToString(separator = "_", transform = { it.type!!.mangle() })}" else ""
|
|
|
|
|
val methodName = "${if (typePath.length > 0) "$typePath." else ""}${clazz.structName}.${selectorName.substringBefore('(')}$types"
|
|
|
|
|
|
|
|
|
|
val method = clazz.methods[methodName]!!
|
|
|
|
@@ -212,7 +232,7 @@ abstract class BlockCodegen(open val state: TranslationState, open val variableM
|
|
|
|
|
private fun evaluateReferenceExpression(expr: KtReferenceExpression, scopeDepth: Int, classScope: ClassCodegen? = null): LLVMSingleValue? = when (expr) {
|
|
|
|
|
is KtArrayAccessExpression -> evaluateArrayAccessExpression(expr, scopeDepth + 1)
|
|
|
|
|
else -> if ((expr is KtNameReferenceExpression) && (classScope != null)) evaluateNameReferenceExpression(expr, classScope)
|
|
|
|
|
else variableManager.getLLVMvalue(expr.firstChild.text)
|
|
|
|
|
else variableManager.getLLVMvalue(expr.firstChild.text)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun evaluateCallExpression(expr: KtCallExpression, scopeDepth: Int, classScope: ClassCodegen? = null): LLVMSingleValue? {
|
|
|
|
|