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 a6af3933ed5..5b2d46c0d5d 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt @@ -29,17 +29,21 @@ class LLVMBuilder { fun addPrimitiveBinaryOperation(operation: IElementType, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMVariable { val newVar = getNewVariable(::LLVMIntType) - val llvmOperator = when (operation) { - KtTokens.PLUS -> firstOp.type?.operatorPlus(newVar, firstOp, secondOp)?.generateExpression(this) - KtTokens.MINUS -> firstOp.type?.operatorMinus(newVar, firstOp, secondOp)?.generateExpression(this) - KtTokens.MUL -> firstOp.type?.operatorTimes(newVar, firstOp, secondOp)?.generateExpression(this) + val llvmExpression = when (operation) { + KtTokens.PLUS -> firstOp.type!!.operatorPlus(newVar, firstOp, secondOp) + KtTokens.MINUS -> firstOp.type!!.operatorMinus(newVar, firstOp, secondOp) + KtTokens.MUL -> firstOp.type!!.operatorTimes(newVar, firstOp, secondOp) else -> throw UnsupportedOperationException("Unkbown binary operator") } - llvmCode.appendln("$newVar = $llvmOperator $firstOp, $secondOp") + addAssignment(newVar, llvmExpression) + return newVar } + fun addAssignment(llvmVariable: LLVMNode, assignExpression: LLVMNode) { + llvmCode.appendln("$llvmVariable = $assignExpression") + } fun clean() { llvmCode = StringBuilder() diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMExpression.kt b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMExpression.kt index 51338c88d98..f6a870466d6 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMExpression.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMExpression.kt @@ -1,12 +1,10 @@ package org.kotlinnative.translator.llvm import org.kotlinnative.translator.llvm.types.LLVMType -import kotlin.reflect.KFunction0 -class LLVMExpression(val variableType: KFunction0, val llvmCode: String) : LLVMNode() { - fun generateExpression(builder: LLVMBuilder): LLVMVariable { - val newVar = builder.getNewVariable(variableType); - builder.addLLVMCode("$newVar = $llvmCode"); - return newVar +class LLVMExpression(val variableType: LLVMType, val llvmCode: String) : LLVMNode() { + + override fun toString(): String { + return llvmCode } } \ No newline at end of file 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 74593ed5880..a30461a35e6 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 @@ -8,17 +8,17 @@ class LLVMDoubleType() : LLVMType() { override fun operatorMinus(result: LLVMVariable, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMExpression { //TODO switch by types: int + double = int - return LLVMExpression(::LLVMIntType, "fsub double i32 $firstOp, $secondOp") + return LLVMExpression(LLVMDoubleType(), "fsub double i32 $firstOp, $secondOp") } override fun operatorTimes(result: LLVMVariable, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMExpression { //TODO switch by types: int + double = int - return LLVMExpression(::LLVMIntType, "fmul double i32 $firstOp, $secondOp") + return LLVMExpression(LLVMDoubleType(), "fmul double i32 $firstOp, $secondOp") } override fun operatorPlus(result: LLVMVariable, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMExpression { //TODO switch by types: int + double = int - return LLVMExpression(::LLVMIntType, "fadd double $firstOp, $secondOp") + return LLVMExpression(LLVMDoubleType(), "fadd double $firstOp, $secondOp") } } \ No newline at end of file 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 5698fe35e9e..5e1b9c831b6 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 @@ -8,17 +8,17 @@ class LLVMIntType() : LLVMType() { override fun operatorMinus(result: LLVMVariable, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMExpression { //TODO switch by types: int + double = int - return LLVMExpression(::LLVMIntType, "sub nsw i32 $firstOp, $secondOp") + return LLVMExpression(LLVMIntType(), "sub nsw i32 $firstOp, $secondOp") } override fun operatorTimes(result: LLVMVariable, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMExpression { //TODO switch by types: int + double = int - return LLVMExpression(::LLVMIntType, "mul nsw i32 $firstOp, $secondOp") + return LLVMExpression(LLVMIntType(), "mul nsw i32 $firstOp, $secondOp") } override fun operatorPlus(result: LLVMVariable, firstOp: LLVMVariable, secondOp: LLVMVariable): LLVMExpression { //TODO switch by types: int + double = int - return LLVMExpression(::LLVMIntType, "add nsw i32 $firstOp, $secondOp") + return LLVMExpression(LLVMIntType(), "add nsw i32 $firstOp, $secondOp") } } \ No newline at end of file