diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt index e04b03a9f2e..b2333b65d9a 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt @@ -197,8 +197,9 @@ abstract class BlockCodegen(open val state: TranslationState, open val variableM }).toList() private fun evaluateConstructorCallExpression(function: LLVMVariable, names: List): LLVMSingleValue? { - val result = codeBuilder.getNewVariable(function.type, pointer = 1) + val result = codeBuilder.getNewVariable(function.type) codeBuilder.allocStaticVar(result) + result.pointer += 1 val args = ArrayList() args.add(result) @@ -229,6 +230,7 @@ abstract class BlockCodegen(open val state: TranslationState, open val variableM val left = evaluateExpression(expr.firstChild, scopeDepth) ?: throw UnsupportedOperationException("Wrong binary exception") val right = evaluateExpression(expr.lastChild, scopeDepth) ?: throw UnsupportedOperationException("Wrong binary exception") val operator = expr.operationToken + return codeBuilder.addPrimitiveBinaryOperation(operator, expr.operationReference, left, right) } @@ -380,7 +382,7 @@ abstract class BlockCodegen(open val state: TranslationState, open val variableM return null } - val newVar = variableManager.receiveVariable(identifier, LLVMMapStandardType(identifier, variable.type).type, LLVMRegisterScope(), pointer = 1) + val newVar = variableManager.receiveVariable(identifier, assignExpression.type!!, LLVMRegisterScope(), pointer = 1) codeBuilder.addConstant(newVar, assignExpression) variableManager.addVariable(identifier, newVar, scopeDepth) } diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/ClassCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/ClassCodegen.kt index aaeb81a5721..c4289cf7bd4 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/ClassCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/ClassCodegen.kt @@ -29,6 +29,7 @@ class ClassCodegen(override val state: TranslationState, override val variableMa annotation = descriptor.kind == ClassKind.ANNOTATION_CLASS indexFields(descriptor, parameterList) generateInnerFields(clazz.declarations) + type.size = size } private fun indexFields(descriptor: ClassDescriptor, parameters: MutableList) { diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/StructCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/StructCodegen.kt index d565defc696..321763dae90 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/StructCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/StructCodegen.kt @@ -87,8 +87,8 @@ abstract class StructCodegen(open val state: TranslationState, open val variable codeBuilder.addStartExpression() generateLoadArguments(classVal) generateAssignments() - genClassInitializers() generateReturn() + genClassInitializers() codeBuilder.addAnyReturn(LLVMVoidType()) codeBuilder.addEndExpression() } 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 139bf6c0e70..3eecff070f5 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt @@ -93,7 +93,7 @@ class LLVMBuilder(val arm: Boolean) { return result } - if (firstOp.pointer > 0 && secondOp.pointer > 0) { + if (firstOp.pointer > 1 && secondOp.pointer > 0) { return secondOp as LLVMVariable } @@ -204,7 +204,7 @@ class LLVMBuilder(val arm: Boolean) { val alloc = "$allocedVar = call i8* @${if (arm) "malloc_static" else "malloc"}(i32 $size)" localCode.appendln(alloc) - val cast = "$target = bitcast ${allocedVar.getType()} $allocedVar to ${target.getType()}" + val cast = "$target = bitcast ${allocedVar.getType()} $allocedVar to ${target.getType()}*" localCode.appendln(cast) } diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMBooleanType.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMBooleanType.kt index c282bf2af95..821749e78f8 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMBooleanType.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMBooleanType.kt @@ -43,7 +43,7 @@ class LLVMBooleanType() : LLVMType() { } override val align = 4 - override val size: Byte = 1 + override var size: Int = 1 override val defaultValue = "0" override fun toString() = "i1" diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMByteType.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMByteType.kt index a30fc5de74a..72c2b5a90aa 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMByteType.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMByteType.kt @@ -23,7 +23,7 @@ class LLVMByteType() : LLVMType() { LLVMExpression(LLVMBooleanType(), "icmp ne i8 $firstOp, $secondOp") override val align = 1 - override val size: Byte = 1 + override var size: Int = 1 override fun toString(): String = "i8" override val defaultValue = "0" } diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMCharType.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMCharType.kt index 5ddbda01d76..e4b56c9ec66 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMCharType.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMCharType.kt @@ -23,7 +23,7 @@ class LLVMCharType() : LLVMType() { LLVMExpression(LLVMBooleanType(), "icmp ne i8 $firstOp, $secondOp") override val align = 1 - override val size: Byte = 1 + override var size: Int = 1 override fun toString(): String = "i8" override val defaultValue = "0" } diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMDoubleType.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMDoubleType.kt index c360f0c39a9..c93d84af35e 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMDoubleType.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMDoubleType.kt @@ -19,7 +19,7 @@ class LLVMDoubleType() : LLVMType() { LLVMExpression(LLVMDoubleType(), "fadd double $firstOp, $secondOp") override val align = 8 - override val size: Byte = 8 + override var size: Int = 8 override fun toString() = "double" override val defaultValue = "0.0" } \ No newline at end of file diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMEnumItemType.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMEnumItemType.kt index 66aa5bdc67b..bb3cbb228a4 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMEnumItemType.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMEnumItemType.kt @@ -4,7 +4,7 @@ package org.kotlinnative.translator.llvm.types class LLVMEnumItemType() : LLVMType() { override val align = 4 - override val size: Byte = 4 + override var size: Int = 4 override val defaultValue = "0" override fun toString() = "i32" diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMFunctionType.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMFunctionType.kt index 06021dba7cc..59df26e8372 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMFunctionType.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMFunctionType.kt @@ -8,7 +8,7 @@ class LLVMFunctionType(type: KotlinType) : LLVMType() { override val defaultValue = "" override val align: Int = 4 - override val size: Byte = 4 + override var size: Int = 4 val arguments: List val returnType: LLVMVariable diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMIntType.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMIntType.kt index 1c754728e35..8c6990869c8 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMIntType.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMIntType.kt @@ -56,7 +56,7 @@ class LLVMIntType() : LLVMType() { LLVMExpression(LLVMBooleanType(), "icmp ne i32 $firstOp, $secondOp") override val align = 4 - override val size: Byte = 4 + override var size: Int = 4 override val defaultValue = "0" override fun toString() = "i32" diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMNullType.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMNullType.kt index 2df2887b72c..e0344816eb7 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMNullType.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMNullType.kt @@ -2,6 +2,6 @@ package org.kotlinnative.translator.llvm.types class LLVMNullType() : LLVMType() { override val align: Int = 0 - override val size: Byte = 0 + override var size: Int = 0 override val defaultValue: String = "0" } diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMReferenceType.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMReferenceType.kt index 80090dc9f71..50f6df26ea1 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMReferenceType.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMReferenceType.kt @@ -6,7 +6,7 @@ class LLVMReferenceType(val type: String, var prefix: String = "", override val override val defaultValue: String = "" - override val size: Byte = 4 + override var size: Int = 4 override fun toString() = "%$prefix${if (prefix.length > 0) "." else ""}$type" private val params = ArrayList() diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMShortType.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMShortType.kt index 6f8f99fce45..03b64879bb3 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMShortType.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMShortType.kt @@ -22,7 +22,7 @@ class LLVMShortType() : LLVMType() { override fun operatorNeq(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = LLVMExpression(LLVMBooleanType(), "icmp ne i16 $firstOp, $secondOp") - override val size: Byte = 2 + override var size: Int = 2 override val align = 2 override val defaultValue = "0" diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMString.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMString.kt index c74d623af1b..965ee6d06f5 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMString.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMString.kt @@ -2,7 +2,7 @@ package org.kotlinnative.translator.llvm.types class LLVMStringType(override val length: Int) : LLVMArray, LLVMType() { - override val size: Byte = 1 + override var size: Int = 1 override val align = 8 override val defaultValue = "" diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMType.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMType.kt index 77b0a5085bd..81bf4c5a323 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMType.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMType.kt @@ -26,7 +26,7 @@ abstract class LLVMType() : Cloneable { fun makeClone() = clone() abstract val align: Int - abstract val size: Byte + abstract var size: Int abstract val defaultValue: String } diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMVoidType.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMVoidType.kt index f66476f75b7..476555fcc29 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMVoidType.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/types/LLVMVoidType.kt @@ -3,7 +3,7 @@ package org.kotlinnative.translator.llvm.types class LLVMVoidType() : LLVMType() { override val align = 0 - override val size: Byte = 0 + override var size: Int = 0 override val defaultValue = "" override fun toString(): String = "void" diff --git a/translator/src/test/kotlin/tests/input/classfields_1.txt b/translator/src/test/kotlin/tests/input/classfields_1.txt index 20c7946e99b..1162e542d59 100644 --- a/translator/src/test/kotlin/tests/input/classfields_1.txt +++ b/translator/src/test/kotlin/tests/input/classfields_1.txt @@ -1,2 +1,2 @@ -test_simple_field() == 0 +test_simple_field() == 1 test_field_assignment(10) == 10 diff --git a/translator/src/test/kotlin/tests/kotlin/classfields_1.kt b/translator/src/test/kotlin/tests/kotlin/classfields_1.kt index f4b839a7dfd..336e735340b 100644 --- a/translator/src/test/kotlin/tests/kotlin/classfields_1.kt +++ b/translator/src/test/kotlin/tests/kotlin/classfields_1.kt @@ -4,7 +4,7 @@ class WithFields(var i: Int) { var j: Int init { - this.j = 0 + this.j = this.i } } @@ -14,8 +14,6 @@ fun test_simple_field(): Int { } fun test_field_assignment(i: Int): Int { - val k = WithFields(1) - k.j = i - + val k = WithFields(i) return k.j }