From 91876c70e6167625090302ff29ca6f72211b5a08 Mon Sep 17 00:00:00 2001 From: Alexey Stepanov Date: Wed, 13 Jul 2016 18:18:13 +0300 Subject: [PATCH] translator: add parsing basic types constants --- .../kotlinnative/translator/FunctionCodegen.kt | 15 +++++++++++---- .../kotlinnative/translator/llvm/LLVMConstant.kt | 9 +++++++-- .../translator/llvm/types/LLVMBooleanType.kt | 6 ++++++ .../translator/llvm/types/LLVMType.kt | 3 +++ 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt index 9ffc1fc8240..3fabf235885 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/FunctionCodegen.kt @@ -3,15 +3,14 @@ package org.kotlinnative.translator import com.intellij.psi.PsiElement import com.intellij.psi.PsiWhiteSpace import com.intellij.psi.impl.source.tree.LeafPsiElement +import org.jetbrains.kotlin.KtNodeTypes import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getNextSiblingIgnoringWhitespaceAndComments import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.calls.callUtil.getValueArgumentsInParentheses import org.kotlinnative.translator.llvm.* -import org.kotlinnative.translator.llvm.types.LLVMIntType -import org.kotlinnative.translator.llvm.types.LLVMType -import org.kotlinnative.translator.llvm.types.LLVMVoidType +import org.kotlinnative.translator.llvm.types.* import java.util.* @@ -186,7 +185,15 @@ class FunctionCodegen(val state: TranslationState, val function: KtNamedFunction private fun evaluateConstantExpression(expr: KtConstantExpression): LLVMConstant { val node = expr.node - return LLVMConstant(node.firstChildNode.text, LLVMIntType(), pointer = false) + + val type = when (node.elementType) { + KtNodeTypes.BOOLEAN_CONSTANT -> LLVMBooleanType() + KtNodeTypes.INTEGER_CONSTANT -> LLVMIntType() + KtNodeTypes.FLOAT_CONSTANT -> LLVMDoubleType() + KtNodeTypes.CHARACTER_CONSTANT -> LLVMCharType() + else -> throw IllegalArgumentException("Unknown type") + } + return LLVMConstant(node.firstChildNode.text, type, pointer = false) } private fun evaluatePsiElement(element: PsiElement, scopeDepth: Int): LLVMSingleValue? { 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 0e0cdf38b2b..07db1b14744 100644 --- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMConstant.kt +++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMConstant.kt @@ -2,9 +2,14 @@ package org.kotlinnative.translator.llvm import org.kotlinnative.translator.llvm.types.LLVMType -open class LLVMConstant(val value: String, override val type: LLVMType? = null, override var pointer: Boolean = false) : LLVMSingleValue(type, pointer) { +open class LLVMConstant(value: String, override val type: LLVMType? = null, override var pointer: Boolean = false) : LLVMSingleValue(type, pointer) { + val value: String + + init { + this.value = type?.parseArg(value) ?: value + } override fun getType(): String = type.toString() + if (pointer) "*" else " " override fun toString(): String = value -} \ No newline at end of file +} 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 72f89c3bc7a..c79056ff29d 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 @@ -36,6 +36,12 @@ class LLVMBooleanType() : LLVMType() { override fun operatorNeq(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = LLVMExpression(LLVMBooleanType(), "icmp ne i1 $firstOp, $secondOp") + override fun parseArg(inputArg: String) = when(inputArg.toLowerCase()){ + "true" -> "1" + "false" -> "0" + else -> throw IllegalArgumentException("Failed to parse boolean type") + } + override val align = 4 override val size: Byte = 1 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 82b621f0674..05ffe0e0179 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 @@ -15,6 +15,7 @@ abstract class LLVMType() : Cloneable { open fun operatorGeq(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = throw UnimplementedException() open fun operatorEq(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = throw UnimplementedException() open fun operatorNeq(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression = throw UnimplementedException() + open fun parseArg(inputArg: String) = inputArg fun makeClone() = clone() @@ -26,6 +27,8 @@ fun parseLLVMType(type: String): LLVMType = when (type) { "i32" -> LLVMIntType() "i16" -> LLVMShortType() "i8" -> LLVMCharType() + "i1" -> LLVMBooleanType() + "double" -> LLVMDoubleType() "Unit" -> LLVMVoidType() else -> LLVMReferenceType(type) }