From 571776d1a9dcbf2738f46abebea7b1757cd3ccf1 Mon Sep 17 00:00:00 2001 From: Alexey Stepanov Date: Wed, 24 Aug 2016 12:01:47 +0300 Subject: [PATCH] translator: basic refactoring whole project --- .../kotlinnative/translator/BlockCodegen.kt | 81 +++++++++---------- .../kotlinnative/translator/ClassCodegen.kt | 3 +- .../translator/FunctionCodegen.kt | 3 - .../kotlinnative/translator/ObjectCodegen.kt | 4 +- .../translator/PropertyCodegen.kt | 1 - .../kotlinnative/translator/StructCodegen.kt | 8 +- .../translator/TranslationState.kt | 5 +- .../translator/llvm/LLVMBuilder.kt | 10 +-- .../translator/llvm/LLVMConstant.kt | 5 +- .../kotlinnative/translator/llvm/LLVMLabel.kt | 1 + .../translator/llvm/LLVMSingleValue.kt | 1 + .../translator/llvm/LLVMVariable.kt | 7 +- .../kotlin/tests/kotlin/null_comparison_1.kt | 2 +- .../kotlin/nullable_primitive_types_1.kt | 2 +- .../tests/kotlin/proto_crossbranch_test.kt | 8 +- .../tests/kotlin/proto_repeated_varint.kt | 14 ++-- .../tests/kotlin/proto_repeated_zigzag.kt | 4 +- .../tests/kotlin/proto_tagorder_test.kt | 4 +- .../kotlin/tests/kotlin/serialization_test.kt | 4 +- .../test/kotlin/tests/kotlin/stress_test_1.kt | 4 +- 20 files changed, 85 insertions(+), 86 deletions(-) diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt index c728555f0d0..f848bb243f0 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt @@ -123,7 +123,7 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va val targetCall = state.bindingContext.get(BindingContext.CALL, expr) val names = parseValueArguments(targetCall!!.valueArguments, scopeDepth) - val args = loadArgsIfRequired(names, constructorArguments) + val args = codeBuilder.loadArgsIfRequired(names, constructorArguments) return evaluateConstructorCallExpression(LLVMVariable(structCodegen.fullName + LLVMType.mangleFunctionArguments(names), structCodegen.type, scope = LLVMVariableScope()), args) } @@ -241,7 +241,9 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va } } - val clazz = resolveCodegen(receiverExpr) ?: return evaluateExtensionExpression(receiverExpr, receiver, selectorExpr as? KtCallExpression ?: throw UnexpectedException(selectorExpr.text), scopeDepth) + val clazz = resolveCodegen(receiverExpr) + ?: return evaluateExtensionExpression(receiverExpr, receiver, selectorExpr as? KtCallExpression + ?: throw UnexpectedException(selectorExpr.text), scopeDepth) return evaluateClassScopedDotExpression(clazz, selectorExpr, scopeDepth, receiver) } @@ -261,15 +263,16 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va } val args = mutableListOf(codeBuilder.loadArgumentIfRequired(receiverExpression, typeThisArgument)) - args.addAll(loadArgsIfRequired(names, extensionCodegen.args)) + args.addAll(codeBuilder.loadArgsIfRequired(names, extensionCodegen.args)) return evaluateFunctionCallExpression(LLVMVariable(extensionCodegen.fullName, extensionCodegen.returnType!!.type, scope = LLVMVariableScope()), args) } - private fun evaluateClassScopedDotExpression(clazz: StructCodegen, selector: KtExpression, scopeDepth: Int, receiver: LLVMVariable? = null): LLVMSingleValue? = when (selector) { - is KtCallExpression -> evaluateCallExpression(selector, scopeDepth, clazz, caller = receiver) - is KtReferenceExpression -> evaluateReferenceExpression(selector, scopeDepth, clazz) - else -> throw UnsupportedOperationException() - } + private fun evaluateClassScopedDotExpression(clazz: StructCodegen, selector: KtExpression, scopeDepth: Int, receiver: LLVMVariable? = null): LLVMSingleValue? = + when (selector) { + is KtCallExpression -> evaluateCallExpression(selector, scopeDepth, clazz, caller = receiver) + is KtReferenceExpression -> evaluateReferenceExpression(selector, scopeDepth, clazz) + else -> throw UnsupportedOperationException() + } fun evaluateMemberMethodOrField(receiver: LLVMVariable, selectorName: String, scopeDepth: Int, call: PsiElement? = null): LLVMSingleValue? { val type = receiver.type as LLVMReferenceType @@ -291,7 +294,7 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va val method = clazz.methods[methodName] ?: throw UnexpectedException(methodName) val returnType = clazz.methods[methodName]!!.returnType!!.type - val loadedArgs = loadArgsIfRequired(names, method.args) + val loadedArgs = codeBuilder.loadArgsIfRequired(names, method.args) val callArgs = mutableListOf(receiver) callArgs.addAll(loadedArgs) @@ -340,13 +343,13 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va val method = clazz.methods[methodName] ?: throw UnexpectedException(expr.text) val returnType = clazz.methods[methodName]!!.returnType!!.type - val loadedArgs = loadArgsIfRequired(names, method.args) + val loadedArgs = codeBuilder.loadArgsIfRequired(names, method.args) val callArgs = mutableListOf(pureReceiver) callArgs.addAll(loadedArgs) return evaluateFunctionCallExpression(LLVMVariable(methodName, returnType, scope = LLVMVariableScope()), callArgs) } - else -> throw IllegalStateException() + else -> throw IllegalStateException("Unknown array access method") } } else -> { @@ -360,17 +363,18 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va } } - private fun evaluateReferenceExpression(expr: KtReferenceExpression, scopeDepth: Int, classScope: StructCodegen? = null): LLVMSingleValue? = when { - expr is KtArrayAccessExpression -> evaluateArrayAccessExpression(expr, scopeDepth + 1) - isEnumClassField(expr, classScope) -> resolveEnumClassField(expr, classScope) - variableManager[expr.firstChild.text] != null -> variableManager[expr.firstChild.text] - (expr is KtNameReferenceExpression) && (classScope != null) -> evaluateNameReferenceExpression(expr, classScope.parentCodegen!!) - else -> { - val clazz = resolveCodegen(expr) - val receiver = if (clazz != null) variableManager[clazz.fullName] ?: variableManager["this"] else variableManager["this"] - evaluateMemberMethodOrField(receiver!!, expr.firstChild.text, topLevel) - } - } + private fun evaluateReferenceExpression(expr: KtReferenceExpression, scopeDepth: Int, classScope: StructCodegen? = null): LLVMSingleValue? = + when { + expr is KtArrayAccessExpression -> evaluateArrayAccessExpression(expr, scopeDepth + 1) + isEnumClassField(expr, classScope) -> resolveEnumClassField(expr, classScope) + variableManager[expr.firstChild.text] != null -> variableManager[expr.firstChild.text] + (expr is KtNameReferenceExpression) && (classScope != null) -> evaluateNameReferenceExpression(expr, classScope.parentCodegen!!) + else -> { + val clazz = resolveCodegen(expr) + val receiver = if (clazz != null) variableManager[clazz.fullName] ?: variableManager["this"] else variableManager["this"] + evaluateMemberMethodOrField(receiver!!, expr.firstChild.text, topLevel) + } + } private fun evaluateNameReferenceExpression(expr: KtNameReferenceExpression, classScope: StructCodegen): LLVMSingleValue? { val fieldName = state.bindingContext.get(BindingContext.REFERENCE_TARGET, expr)!!.name.toString() @@ -422,21 +426,21 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va if (state.functions.containsKey(function) || state.externalFunctions.containsKey(function)) { val descriptor = state.functions[function] ?: state.externalFunctions[function] ?: return null names = parseNamedValueArguments(arguments, descriptor.defaultValues, scopeDepth) - val args = loadArgsIfRequired(names, descriptor.args) + val args = codeBuilder.loadArgsIfRequired(names, descriptor.args) return evaluateFunctionCallExpression(LLVMVariable(function, descriptor.returnType!!.type, scope = LLVMVariableScope()), args) } if (state.classes.containsKey(name) || classScope?.structName == name) { val descriptor = state.classes[name] ?: classScope ?: return null val detectedConstructor = LLVMType.mangleFunctionTypes(functionArguments) - val args = loadArgsIfRequired(names, descriptor.constructorFields[detectedConstructor]!!) + val args = codeBuilder.loadArgsIfRequired(names, descriptor.constructorFields[detectedConstructor]!!) return evaluateConstructorCallExpression(LLVMVariable(descriptor.fullName + detectedConstructor, descriptor.type, scope = LLVMVariableScope()), args) } val localFunction = variableManager[name] if (localFunction != null) { val type = localFunction.type as LLVMFunctionType - val args = loadArgsIfRequired(names, type.arguments) + val args = codeBuilder.loadArgsIfRequired(names, type.arguments) return evaluateFunctionCallExpression(LLVMVariable(name, type.returnType.type, scope = LLVMRegisterScope()), args) } @@ -448,7 +452,7 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va val receiver = variableManager[parentDescriptor.fullName] ?: throw UnexpectedException(parentDescriptor.fullName) val methodFullName = descriptor.name val returnType = descriptor.returnType!!.type - val loadedArgs = loadArgsIfRequired(names, descriptor.args) + val loadedArgs = codeBuilder.loadArgsIfRequired(names, descriptor.args) val callArgs = mutableListOf(receiver) callArgs.addAll(loadedArgs) @@ -458,7 +462,7 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va val nestedConstructor = classScope?.nestedClasses?.get(expr.calleeExpression!!.text) if (nestedConstructor != null) { - val args = loadArgsIfRequired(names, nestedConstructor.constructorFields[nestedConstructor.primaryConstructorIndex]!!) + val args = codeBuilder.loadArgsIfRequired(names, nestedConstructor.constructorFields[nestedConstructor.primaryConstructorIndex]!!) return evaluateConstructorCallExpression(LLVMVariable(nestedConstructor.fullName, nestedConstructor.type, scope = LLVMVariableScope()), args) } @@ -475,7 +479,7 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va args.add(variableManager["this"]!!) } - args.addAll(loadArgsIfRequired(names, method.args)) + args.addAll(codeBuilder.loadArgsIfRequired(names, method.args)) return evaluateFunctionCallExpression(LLVMVariable(method.fullName, method.returnType?.type ?: LLVMVoidType(), scope = LLVMVariableScope()), args) } @@ -526,14 +530,10 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va return resultPtr } } + return null } - private fun loadArgsIfRequired(names: List, args: List) = - names.mapIndexed(fun(i: Int, value: LLVMSingleValue): LLVMSingleValue { - return codeBuilder.loadArgumentIfRequired(value, args[i]) - }).toList() - private fun evaluateConstructorCallExpression(function: LLVMVariable, names: List): LLVMSingleValue? { val store = codeBuilder.getNewVariable(function.type) codeBuilder.allocStaticVar(store) @@ -610,7 +610,7 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va private fun evaluatePostfixExpression(expr: KtPostfixExpression, scopeDepth: Int): LLVMSingleValue? { val operator = expr.operationToken val left = evaluateExpression(expr.baseExpression, scopeDepth) ?: throw UnsupportedOperationException("Wrong binary exception: ${expr.text}") - return executePostfixExpression(operator, expr.operationReference, left as LLVMVariable) + return executePostfixExpression(operator, left as LLVMVariable) } private fun evaluatePrefixExpression(expr: KtPrefixExpression, scopeDepth: Int): LLVMSingleValue? { @@ -619,13 +619,13 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va return executePrefixExpression(operator, expr.operationReference, left) } - private fun executePostfixExpression(operator: IElementType?, operationReference: KtSimpleNameExpression, left: LLVMVariable): LLVMSingleValue? - = addPrimitivePostfixOperation(operator, operationReference, left) + private fun executePostfixExpression(operator: IElementType?, left: LLVMVariable): LLVMSingleValue? + = addPrimitivePostfixOperation(operator, left) private fun executePrefixExpression(operator: IElementType?, operationReference: KtSimpleNameExpression, left: LLVMSingleValue): LLVMSingleValue? = addPrimitivePrefixOperation(operator, operationReference, left) - private fun addPrimitivePostfixOperation(operator: IElementType?, operationReference: KtSimpleNameExpression, firstOp: LLVMVariable): LLVMSingleValue? { + private fun addPrimitivePostfixOperation(operator: IElementType?, firstOp: LLVMVariable): LLVMSingleValue? { val firstNativeOp = codeBuilder.receiveNativeValue(firstOp) when (operator) { KtTokens.PLUSPLUS, KtTokens.MINUSMINUS -> { @@ -647,7 +647,7 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va } KtTokens.EXCLEXCL -> { var result = firstOp - codeBuilder.addComment("start EXCLEXCL") + codeBuilder.addComment("start EXCLEXCL postfix operator") val nullLabel = codeBuilder.getNewLabel(prefix = "nullCheck") val notNullLabel = codeBuilder.getNewLabel(prefix = "nullCheck") val nullCheck = codeBuilder.nullCheck(firstOp) @@ -659,7 +659,7 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va if (firstOp.type.isPrimitive()) { result = codeBuilder.downLoadArgument(firstOp, 0) as LLVMVariable } - codeBuilder.addComment("end EXCLEXCL") + codeBuilder.addComment("end EXCLEXCL postfix operator") return result } else -> throw UnsupportedOperationException() @@ -1108,8 +1108,7 @@ abstract class BlockCodegen(val state: TranslationState, val variableManager: Va val primitivePointer = LLVMMapStandardType(variable.type, state) !is LLVMReferred - val allocVar = variableManager.receiveVariable(identifier, expectedExpressionType.type, LLVMRegisterScope(), pointer = - expectedExpressionType.pointer) + val allocVar = variableManager.receiveVariable(identifier, expectedExpressionType.type, LLVMRegisterScope(), pointer = expectedExpressionType.pointer) codeBuilder.allocStackVar(allocVar) allocVar.pointer++ allocVar.kotlinName = identifier diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/ClassCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/ClassCodegen.kt index d5dbecfbdb6..b4d6db293b1 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/ClassCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/ClassCodegen.kt @@ -16,8 +16,7 @@ class ClassCodegen(state: TranslationState, val clazz: KtClass, codeBuilder: LLVMBuilder, parentCodegen: StructCodegen? = null) : - - StructCodegen(state, variableManager, clazz, state.bindingContext.get(BindingContext.CLASS, clazz) ?: throw TranslationException(), codeBuilder, parentCodegen) { + StructCodegen(state, variableManager, clazz, codeBuilder, parentCodegen) { val annotation: Boolean val enum: Boolean diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt index ed46d176fd3..feed586fbd6 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.codegen.StackValue import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.KtParameter @@ -8,8 +7,6 @@ import org.jetbrains.kotlin.psi.psiUtil.getNextSiblingIgnoringWhitespaceAndComme import org.jetbrains.kotlin.psi.psiUtil.isExtensionDeclaration import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.source.KotlinSourceElement -import org.jetbrains.org.objectweb.asm.Label -import org.jetbrains.org.objectweb.asm.Type import org.kotlinnative.translator.llvm.* import org.kotlinnative.translator.llvm.types.LLVMFunctionType import org.kotlinnative.translator.llvm.types.LLVMReferenceType diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/ObjectCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/ObjectCodegen.kt index 10cf9189dec..5f5338530d1 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/ObjectCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/ObjectCodegen.kt @@ -2,7 +2,6 @@ package org.kotlinnative.translator import org.jetbrains.kotlin.psi.KtObjectDeclaration import org.jetbrains.kotlin.resolve.BindingContext -import org.kotlinnative.translator.exceptions.TranslationException import org.kotlinnative.translator.llvm.LLVMBuilder import org.kotlinnative.translator.llvm.LLVMVariable import org.kotlinnative.translator.llvm.LLVMVariableScope @@ -14,8 +13,7 @@ class ObjectCodegen(state: TranslationState, val objectDeclaration: KtObjectDeclaration, codeBuilder: LLVMBuilder, parentCodegen: StructCodegen? = null) : - StructCodegen(state, variableManager, objectDeclaration, state.bindingContext.get(BindingContext.CLASS, objectDeclaration) ?: throw TranslationException(), - codeBuilder, parentCodegen = parentCodegen) { + StructCodegen(state, variableManager, objectDeclaration, codeBuilder, parentCodegen = parentCodegen) { override var size: Int = 0 override val structName: String = objectDeclaration.name!! override val type: LLVMReferenceType diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/PropertyCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/PropertyCodegen.kt index dd1638aa480..4c508a1cdfa 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/PropertyCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/PropertyCodegen.kt @@ -25,5 +25,4 @@ class PropertyCodegen(val state: TranslationState, val variableManager: Variable } } - } \ No newline at end of file diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/StructCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/StructCodegen.kt index 4f8f939804b..e8ffd4ce0e6 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.descriptors.ClassDescriptor import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.BindingContext @@ -16,7 +15,6 @@ import java.util.* abstract class StructCodegen(val state: TranslationState, val variableManager: VariableManager, val classOrObject: KtClassOrObject, - val classDescriptor: ClassDescriptor, val codeBuilder: LLVMBuilder, val parentCodegen: StructCodegen? = null) { @@ -219,13 +217,13 @@ abstract class StructCodegen(val state: TranslationState, codeBuilder.storeVariable(classField, argument) } } - } val blockCodegen = object : BlockCodegen(state, variableManager, codeBuilder) {} val receiverThis = LLVMVariable("classvariable.this.addr", type, scope = LLVMRegisterScope(), pointer = 1) codeBuilder.addComment("field initilizers starts") variableManager.addVariable("this", receiverThis, 2) + for ((variable, initializer) in initializedFields) { val left = blockCodegen.evaluateMemberMethodOrField(receiverThis, variable.label, blockCodegen.topLevel, call = null)!! codeBuilder.addComment("left expression") @@ -234,6 +232,7 @@ abstract class StructCodegen(val state: TranslationState, blockCodegen.executeBinaryExpression(KtTokens.EQ, referenceName = null, left = left, right = right) codeBuilder.addComment("next initializer") } + variableManager.pullOneUpwardLevelVariable("this") codeBuilder.addComment("field initilizers ends") } @@ -249,7 +248,6 @@ abstract class StructCodegen(val state: TranslationState, protected fun resolveType(field: KtNamedDeclaration, ktType: KotlinType): LLVMClassVariable { val annotations = parseFieldAnnotations(field) - val result = LLVMInstanceOfStandardType(field.name!!, ktType, LLVMRegisterScope(), state = state) if (result.type is LLVMReferenceType) { @@ -262,7 +260,6 @@ abstract class StructCodegen(val state: TranslationState, return LLVMClassVariable(result.label, state.classes[field.name!!]!!.type, result.pointer) } - if (annotations.contains("Plain")) { result.pointer = 0 } @@ -292,6 +289,5 @@ abstract class StructCodegen(val state: TranslationState, } blockCodegen.generate(init.body) } - } } diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/TranslationState.kt b/translator/src/main/kotlin/org/kotlinnative/translator/TranslationState.kt index ee21258c2de..f9dc2772e23 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/TranslationState.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/TranslationState.kt @@ -25,7 +25,7 @@ import org.kotlinnative.translator.llvm.LLVMBuilder import org.kotlinnative.translator.llvm.LLVMVariable import java.util.* -class TranslationState(val environment: KotlinCoreEnvironment, val bindingContext: BindingContext, val arm: Boolean) { +class TranslationState(val environment: KotlinCoreEnvironment, val bindingContext: BindingContext, arm: Boolean) { companion object { var pointerAlign = 4 var pointerSize = 4 @@ -45,6 +45,7 @@ class TranslationState(val environment: KotlinCoreEnvironment, val bindingContex val codeBuilder = LLVMBuilder(arm) val extensionFunctions = HashMap>() + } fun parseAndAnalyze(sources: List, disposer: Disposable, arm: Boolean = false): TranslationState { @@ -98,7 +99,7 @@ fun analyze(environment: KotlinCoreEnvironment): AnalysisResult? { val files = environment.configuration.jvmClasspathRoots val runtimes = files.map { it.canonicalFile }.filter { it.name == PathUtil.KOTLIN_JAVA_RUNTIME_JAR && it.exists() } collector.report(CompilerMessageSeverity.ERROR, runtimes.joinToString { it.path }, CompilerMessageLocation.NO_LOCATION) - println(runtimes.joinToString { it.toString() }) + System.err.println(runtimes.joinToString { it.toString() }) } }) diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt index b015c9be737..6c17e73fbd6 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt @@ -72,6 +72,11 @@ class LLVMBuilder(val arm: Boolean = false) { else -> throw UnsupportedOperationException() } + fun loadArgsIfRequired(names: List, args: List) = + names.mapIndexed(fun(i: Int, value: LLVMSingleValue): LLVMSingleValue { + return loadArgumentIfRequired(value, args[i]) + }).toList() + fun loadArgumentIfRequired(value: LLVMSingleValue, argument: LLVMVariable): LLVMSingleValue { var result = value @@ -238,11 +243,6 @@ class LLVMBuilder(val arm: Boolean = false) { } } - fun addConstant(allocVariable: LLVMVariable, constantValue: LLVMConstant) { - localCode.appendln("$allocVariable = alloca ${allocVariable.type}, align ${allocVariable.type.align}") - localCode.appendln("store ${allocVariable.type} $constantValue, ${allocVariable.getType()} $allocVariable, align ${allocVariable.type.align}") - } - fun defineGlobalVariable(variable: LLVMVariable, defaultValue: String = variable.type.defaultValue) { localCode.appendln("$variable = global ${variable.getType()} $defaultValue, align ${variable.type.align}") } diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMConstant.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMConstant.kt index 0d80caafb39..93ad0c0a9e0 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMConstant.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMConstant.kt @@ -2,7 +2,9 @@ package org.kotlinnative.translator.llvm import org.kotlinnative.translator.llvm.types.LLVMType -open class LLVMConstant(value: String, override val type: LLVMType? = null, override var pointer: Int = 0) : LLVMSingleValue(type, pointer) { +open class LLVMConstant(value: String, + type: LLVMType? = null, + pointer: Int = 0) : LLVMSingleValue(type, pointer) { val value: String init { @@ -12,4 +14,5 @@ open class LLVMConstant(value: String, override val type: LLVMType? = null, over override fun getType(): String = type.toString() + "*".repeat(pointer) override fun toString(): String = value + } diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMLabel.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMLabel.kt index 69500ca41f6..45a995b6314 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMLabel.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMLabel.kt @@ -3,4 +3,5 @@ package org.kotlinnative.translator.llvm class LLVMLabel(val label: String, val scope: LLVMScope) : LLVMNode() { override fun toString(): String = "$scope$label" + } \ No newline at end of file diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMSingleValue.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMSingleValue.kt index a3a6bcbe966..8b00dbffa8d 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMSingleValue.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMSingleValue.kt @@ -6,4 +6,5 @@ import org.kotlinnative.translator.llvm.types.LLVMType open class LLVMSingleValue(open val type: LLVMType? = null, open var pointer: Int = 0) : LLVMNode() { open fun getType(): String = throw UnimplementedException() + } diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMVariable.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMVariable.kt index 82c612680e0..94e8d3cae29 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMVariable.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMVariable.kt @@ -2,9 +2,14 @@ package org.kotlinnative.translator.llvm import org.kotlinnative.translator.llvm.types.LLVMType -open class LLVMVariable(val label: String, override val type: LLVMType, var kotlinName: String? = null, val scope: LLVMScope = LLVMRegisterScope(), override var pointer: Int = 0) : LLVMSingleValue() { +open class LLVMVariable(val label: String, + override val type: LLVMType, + var kotlinName: String? = null, + val scope: LLVMScope = LLVMRegisterScope(), + pointer: Int = 0) : LLVMSingleValue(type, pointer) { override fun getType(): String = type.toString() + "*".repeat(pointer) override fun toString(): String = "$scope$label" + } \ No newline at end of file diff --git a/translator/src/test/kotlin/tests/kotlin/null_comparison_1.kt b/translator/src/test/kotlin/tests/kotlin/null_comparison_1.kt index 091ed3a6cbc..6c767687bff 100644 --- a/translator/src/test/kotlin/tests/kotlin/null_comparison_1.kt +++ b/translator/src/test/kotlin/tests/kotlin/null_comparison_1.kt @@ -23,7 +23,7 @@ fun null_comparison_1_reassigned(): Int { } fun null_comparison_1_declaration(): Int { - var a: null_comparison_1_class? + val a: null_comparison_1_class? a = null_comparison_1_getClass() if (a == null) { return 87 diff --git a/translator/src/test/kotlin/tests/kotlin/nullable_primitive_types_1.kt b/translator/src/test/kotlin/tests/kotlin/nullable_primitive_types_1.kt index eaed37364bb..2f8d1b053d9 100644 --- a/translator/src/test/kotlin/tests/kotlin/nullable_primitive_types_1.kt +++ b/translator/src/test/kotlin/tests/kotlin/nullable_primitive_types_1.kt @@ -32,7 +32,7 @@ fun nullable_primitive_types_1_if_not_null(): Int { fun nullable_primitive_types_1_reassignment(): Int { var z: Int? = 32 z = null - var r = z + val r = z if (r == null) { return 5678 } else { diff --git a/translator/src/test/kotlin/tests/kotlin/proto_crossbranch_test.kt b/translator/src/test/kotlin/tests/kotlin/proto_crossbranch_test.kt index b1c0906a57a..706ab3efe01 100644 --- a/translator/src/test/kotlin/tests/kotlin/proto_crossbranch_test.kt +++ b/translator/src/test/kotlin/tests/kotlin/proto_crossbranch_test.kt @@ -299,7 +299,7 @@ class CrossBranch private constructor () { } fun getSizeNoTag(): Int { - var size = 0 + val size = 0 return size } @@ -352,7 +352,7 @@ class CrossBranch private constructor () { } fun getSizeNoTag(): Int { - var size = 0 + val size = 0 return size } @@ -955,7 +955,7 @@ class CrossBranch private constructor () { } fun getSizeNoTag(): Int { - var size = 0 + val size = 0 return size } @@ -1008,7 +1008,7 @@ class CrossBranch private constructor () { } fun getSizeNoTag(): Int { - var size = 0 + val size = 0 return size } diff --git a/translator/src/test/kotlin/tests/kotlin/proto_repeated_varint.kt b/translator/src/test/kotlin/tests/kotlin/proto_repeated_varint.kt index 27aa7c83897..5f90d979678 100644 --- a/translator/src/test/kotlin/tests/kotlin/proto_repeated_varint.kt +++ b/translator/src/test/kotlin/tests/kotlin/proto_repeated_varint.kt @@ -724,7 +724,7 @@ class MessageRepeatedVarints private constructor (var int: IntArray, var long: L readSize += WireFormat.getInt32SizeNoTag(tmp) } } while (false) - var newArray = IntArray(arraySize) + val newArray = IntArray(arraySize) input.reset() do { var i = 0 @@ -753,7 +753,7 @@ class MessageRepeatedVarints private constructor (var int: IntArray, var long: L readSize += WireFormat.getInt64SizeNoTag(tmp) } } while (false) - var newArray = LongArray(arraySize) + val newArray = LongArray(arraySize) input.reset() do { var i = 0 @@ -782,7 +782,7 @@ class MessageRepeatedVarints private constructor (var int: IntArray, var long: L readSize += WireFormat.getSInt32SizeNoTag(tmp) } } while (false) - var newArray = IntArray(arraySize) + val newArray = IntArray(arraySize) input.reset() do { var i = 0 @@ -811,7 +811,7 @@ class MessageRepeatedVarints private constructor (var int: IntArray, var long: L readSize += WireFormat.getSInt64SizeNoTag(tmp) } } while (false) - var newArray = LongArray(arraySize) + val newArray = LongArray(arraySize) input.reset() do { var i = 0 @@ -840,7 +840,7 @@ class MessageRepeatedVarints private constructor (var int: IntArray, var long: L readSize += WireFormat.getBoolSizeNoTag(tmp) } } while (false) - var newArray = BooleanArray(arraySize) + val newArray = BooleanArray(arraySize) input.reset() do { var i = 0 @@ -869,7 +869,7 @@ class MessageRepeatedVarints private constructor (var int: IntArray, var long: L readSize += WireFormat.getUInt32SizeNoTag(tmp) } } while (false) - var newArray = IntArray(arraySize) + val newArray = IntArray(arraySize) input.reset() do { var i = 0 @@ -898,7 +898,7 @@ class MessageRepeatedVarints private constructor (var int: IntArray, var long: L readSize += WireFormat.getUInt64SizeNoTag(tmp) } } while (false) - var newArray = LongArray(arraySize) + val newArray = LongArray(arraySize) input.reset() do { var i = 0 diff --git a/translator/src/test/kotlin/tests/kotlin/proto_repeated_zigzag.kt b/translator/src/test/kotlin/tests/kotlin/proto_repeated_zigzag.kt index c9fa9d81478..9973ce5a2a7 100644 --- a/translator/src/test/kotlin/tests/kotlin/proto_repeated_zigzag.kt +++ b/translator/src/test/kotlin/tests/kotlin/proto_repeated_zigzag.kt @@ -259,7 +259,7 @@ class MessageRepeatedZigZag private constructor (var int: IntArray, var long: Lo readSize += WireFormat.getSInt32SizeNoTag(tmp) } } while (false) - var newArray = IntArray(arraySize) + val newArray = IntArray(arraySize) input.reset() do { var i = 0 @@ -288,7 +288,7 @@ class MessageRepeatedZigZag private constructor (var int: IntArray, var long: Lo readSize += WireFormat.getSInt64SizeNoTag(tmp) } } while (false) - var newArray = LongArray(arraySize) + val newArray = LongArray(arraySize) input.reset() do { var i = 0 diff --git a/translator/src/test/kotlin/tests/kotlin/proto_tagorder_test.kt b/translator/src/test/kotlin/tests/kotlin/proto_tagorder_test.kt index b253399a9cc..d5af1f20460 100644 --- a/translator/src/test/kotlin/tests/kotlin/proto_tagorder_test.kt +++ b/translator/src/test/kotlin/tests/kotlin/proto_tagorder_test.kt @@ -264,7 +264,7 @@ class TagOrder private constructor (var sint: Int, var int: Int, var slong_array do { var i = 0 while(readSize < expectedByteSize) { - var tmp = LongArray(1) + val tmp = LongArray(1) tmp[0] = input.readSInt64NoTag() newArray = newArray.plus(tmp) readSize += WireFormat.getSInt64SizeNoTag(tmp[0]) @@ -623,7 +623,7 @@ class TagOrderShuffled private constructor (var sint: Int, var int: Int, var slo do { var i = 0 while(readSize < expectedByteSize) { - var tmp = LongArray(1) + val tmp = LongArray(1) tmp[0] = input.readSInt64NoTag() newArray = newArray.plus(tmp) readSize += WireFormat.getSInt64SizeNoTag(tmp[0]) diff --git a/translator/src/test/kotlin/tests/kotlin/serialization_test.kt b/translator/src/test/kotlin/tests/kotlin/serialization_test.kt index 7965516e9b6..69ee598a321 100644 --- a/translator/src/test/kotlin/tests/kotlin/serialization_test.kt +++ b/translator/src/test/kotlin/tests/kotlin/serialization_test.kt @@ -395,7 +395,7 @@ class RouteRequest private constructor(var distances: IntArray, var angles: IntA do { var i = 0 while (readSize < expectedByteSize) { - var tmp = IntArray(1) + val tmp = IntArray(1) tmp[0] = input.readInt32NoTag() newArray = newArray.plus(tmp) readSize += WireFormat.getInt32SizeNoTag(tmp[0]) @@ -414,7 +414,7 @@ class RouteRequest private constructor(var distances: IntArray, var angles: IntA do { var i = 0 while (readSize < expectedByteSize) { - var tmp = IntArray(1) + val tmp = IntArray(1) tmp[0] = input.readInt32NoTag() newArray = newArray.plus(tmp) readSize += WireFormat.getInt32SizeNoTag(tmp[0]) diff --git a/translator/src/test/kotlin/tests/kotlin/stress_test_1.kt b/translator/src/test/kotlin/tests/kotlin/stress_test_1.kt index d5c53c99d37..551b6889a6d 100644 --- a/translator/src/test/kotlin/tests/kotlin/stress_test_1.kt +++ b/translator/src/test/kotlin/tests/kotlin/stress_test_1.kt @@ -252,7 +252,7 @@ class RouteRequest private constructor (var distances: IntArray, var angles: Int do { var i = 0 while(readSize < expectedByteSize) { - var tmp = IntArray(1) + val tmp = IntArray(1) tmp[0] = input.readInt32NoTag() newArray = newArray.plus(tmp) readSize += WireFormat.getInt32SizeNoTag(tmp[0]) @@ -271,7 +271,7 @@ class RouteRequest private constructor (var distances: IntArray, var angles: Int do { var i = 0 while(readSize < expectedByteSize) { - var tmp = IntArray(1) + val tmp = IntArray(1) tmp[0] = input.readInt32NoTag() newArray = newArray.plus(tmp) readSize += WireFormat.getInt32SizeNoTag(tmp[0])