From 4fd441e86179acf8b4e7e4f21595ac9201fadba7 Mon Sep 17 00:00:00 2001 From: e5l Date: Thu, 11 Aug 2016 17:53:55 +0300 Subject: [PATCH] translator: fix nested types resolve --- .../kotlin/org/kotlinnative/translator/BlockCodegen.kt | 9 +++------ .../kotlin/org/kotlinnative/translator/ClassCodegen.kt | 10 +++++----- .../org/kotlinnative/translator/FunctionCodegen.kt | 9 --------- .../org/kotlinnative/translator/ObjectCodegen.kt | 7 ++++--- .../org/kotlinnative/translator/StructCodegen.kt | 4 ---- .../org/kotlinnative/translator/llvm/generators.kt | 10 ++++++++-- 6 files changed, 20 insertions(+), 29 deletions(-) diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt index 7e89f40b14a..2fc0903543a 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt @@ -401,9 +401,9 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va } if (classScope != null) { - val methodShortName = classScope.structName + "." + function - if (classScope != null && classScope.methods.containsKey(methodShortName)) { - val descriptor = classScope.methods[methodShortName] ?: return null + val methodShortName = "${classScope.fullName}.$function" + if (classScope.methods.containsKey(methodShortName)) { + val descriptor = classScope.methods[methodShortName]!! val parentDescriptor = descriptor.parentCodegen!! val receiver = variableManager[parentDescriptor.fullName]!! val methodFullName = descriptor.name @@ -828,9 +828,6 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va val whenExpression = expr.subjectExpression val kotlinType = state.bindingContext.get(BindingContext.EXPRESSION_TYPE_INFO, expr)!!.type!! val expressionType = LLVMMapStandardType(kotlinType) - if (state.classes.containsKey(kotlinType.toString())) { - (expressionType as LLVMReferenceType).prefix = "class" - } val targetExpression = evaluateExpression(whenExpression, scopeDepth + 1)!! val resultVariable = codeBuilder.getNewVariable(expressionType, pointer = 1) diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/ClassCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/ClassCodegen.kt index 1967f9dfdd6..624da9bde5e 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/ClassCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/ClassCodegen.kt @@ -26,6 +26,11 @@ class ClassCodegen(state: TranslationState, init { type = LLVMReferenceType(structName, "class", byRef = true) + if (parentCodegen != null) { + type.location.addAll(parentCodegen.type.location) + type.location.add(parentCodegen.structName) + } + val descriptor = state.bindingContext.get(BindingContext.CLASS, clazz) ?: throw TranslationException() val parameterList = clazz.getPrimaryConstructorParameterList()?.parameters ?: listOf() @@ -35,11 +40,6 @@ class ClassCodegen(state: TranslationState, indexFields(parameterList) generateInnerFields(clazz.declarations) - if (parentCodegen != null) { - type.location.addAll(parentCodegen.type.location) - type.location.add(parentCodegen.structName) - } - type.size = size } diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt index 06ffff3852a..a251ee2db34 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt @@ -1,6 +1,5 @@ package org.kotlinnative.translator -import org.jetbrains.kotlin.cfg.pseudocode.getSubtypesPredicate import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.psiUtil.getNextSiblingIgnoringWhitespaceAndComments import org.jetbrains.kotlin.psi.psiUtil.isExtensionDeclaration @@ -36,7 +35,6 @@ class FunctionCodegen(state: TranslationState, returnType = LLVMInstanceOfStandardType("instance", descriptor.returnType!!) if (returnType!!.type is LLVMReferenceType) { - (returnType!!.type as LLVMReferenceType).location.addAll(descriptor.returnType!!.getSubtypesPredicate().toString().split(".").dropLast(1)) returnType!!.pointer = 2 } external = isExternal() @@ -86,13 +84,6 @@ class FunctionCodegen(state: TranslationState, } private fun generateDeclaration(this_type: LLVMVariable? = null) { - args.forEach { - val type = it.type - if (type is LLVMReferenceType && state.classes.containsKey(type.type)) { - type.prefix = "class" - } - } - var actualReturnType: LLVMType = returnType!!.type val actualArgs = ArrayList() diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/ObjectCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/ObjectCodegen.kt index 99aa2f6566e..6955e4b2c6f 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/ObjectCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/ObjectCodegen.kt @@ -30,12 +30,13 @@ class ObjectCodegen(state: TranslationState, override fun prepareForGenerate() { super.prepareForGenerate() - } - override fun generate() { - super.generate() val classInstance = LLVMVariable("object.instance.$fullName", type, objectDeclaration.name, LLVMVariableScope(), pointer = 1) codeBuilder.addGlobalInitialize(classInstance, type) variableManager.addGlobalVariable(fullName, classInstance) } + + override fun generate() { + super.generate() + } } diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/StructCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/StructCodegen.kt index 9f91a5bb95a..e26edbc7376 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/StructCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/StructCodegen.kt @@ -1,7 +1,6 @@ package org.kotlinnative.translator import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.cfg.pseudocode.getSubtypesPredicate import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* @@ -198,9 +197,6 @@ abstract class StructCodegen(val state: TranslationState, val type = result.type as LLVMReferenceType type.prefix = "class" type.byRef = true - - val location = ktType.getSubtypesPredicate().toString().split(".").dropLast(1) - type.location.addAll(location) } if (annotations.contains("Plain")) { diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/generators.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/generators.kt index e4b11a920c7..2b7cd2be78e 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/generators.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/generators.kt @@ -1,6 +1,7 @@ package org.kotlinnative.translator.llvm import org.jetbrains.kotlin.builtins.isFunctionTypeOrSubtype +import org.jetbrains.kotlin.cfg.pseudocode.getSubtypesPredicate import org.jetbrains.kotlin.js.descriptorUtils.nameIfStandardType import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.typeUtil.isUnit @@ -26,8 +27,13 @@ fun LLVMInstanceOfStandardType(name: String, type: KotlinType, scope: LLVMScope type.toString() == "String" -> LLVMVariable(name, LLVMStringType(0), name, scope) type.nameIfStandardType.toString() == "Nothing" -> LLVMVariable(name, LLVMNullType(), name, scope) type.isUnit() -> LLVMVariable("", LLVMVoidType(), name, scope) - type.isMarkedNullable -> LLVMVariable(name, LLVMReferenceType(type.toString().dropLast(1)), name, scope, pointer = 1) - else -> LLVMVariable(name, LLVMReferenceType(type.toString(), prefix = "class"), name, scope, pointer = 1) + type.isMarkedNullable -> LLVMVariable(name, LLVMReferenceType(type.toString().dropLast(1), prefix = "class"), name, scope, pointer = 1) + else -> { + val refType = LLVMReferenceType(type.toString(), prefix = "class") + val result = LLVMVariable(name, refType, name, scope, pointer = 1) + refType.location.addAll(type.getSubtypesPredicate().toString().split(".").dropLast(1)) + result + } } fun LLVMMapStandardType(type: KotlinType): LLVMType =