translator: order class fix

This commit is contained in:
Alexey Stepanov
2016-08-15 17:07:46 +03:00
parent 0d4e3dc8a8
commit 198924163e
2 changed files with 7 additions and 3 deletions
@@ -186,13 +186,16 @@ abstract class StructCodegen(val state: TranslationState,
val blockCodegen = object : BlockCodegen(state, variableManager, codeBuilder) {}
val receiverThis = LLVMVariable("classvariable.this.addr", type, scope = LLVMRegisterScope(), pointer = 1)
codeBuilder.addComment("field initilizers starts")
for ((variable, initializer) in initializedFields) {
val left = blockCodegen.evaluateMemberMethodOrField(receiverThis, variable.label, blockCodegen.topLevel, call = null)!!
codeBuilder.addComment("left expression")
val right = blockCodegen.evaluateExpression(initializer, scopeDepth = blockCodegen.topLevel)!!
codeBuilder.addComment("right expression")
blockCodegen.executeBinaryExpression(KtTokens.EQ, referenceName = null, left = left, right = right)
codeBuilder.addComment("next initializer")
}
codeBuilder.addComment("field initilizers ends")
}
private fun generateReturn() {
@@ -30,7 +30,8 @@ fun LLVMInstanceOfStandardType(name: String, type: KotlinType, scope: LLVMScope
type.isUnit() -> LLVMVariable("", LLVMVoidType(), name, scope)
type.isMarkedNullable -> LLVMVariable(name, LLVMReferenceType(type.toString().dropLast(1), prefix = "class"), name, scope, pointer = 1)
else -> {
val refType = state.classes[type.toString()]!!.type
val refType = state.classes[type.toString()]?.type ?: LLVMReferenceType(type.toString(), align = state.pointerAllign, prefix = "class")
val result = LLVMVariable(name, refType, name, scope, pointer = 1)
refType.location.addAll(type.getSubtypesPredicate().toString().split(".").dropLast(1))
result