diff --git a/car_llvmkot/kotlib/kotlin_main.ll b/car_llvmkot/kotlib/kotlin_main.ll
index 06f73785689..b057e1ddaa2 100644
--- a/car_llvmkot/kotlib/kotlin_main.ll
+++ b/car_llvmkot/kotlib/kotlin_main.ll
@@ -1,86 +1,72 @@
declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1)
declare i8* @malloc(i32)
-%class.MyClass = type { i32 }
-define void @MyClass(%class.MyClass* %classvariable.this, i32 %i)
-{
-%classvariable.this.addr = alloca %class.MyClass, align 4
-%i.addr = alloca i32, align 4
-store i32 %i, i32* %i.addr, align 4
-%var1 = load i32* %i.addr, align 4
-%var2 = getelementptr inbounds %class.MyClass* %classvariable.this.addr, i32 0, i32 0
-store i32 %var1, i32* %var2, align 4
-%var3 = bitcast %class.MyClass* %classvariable.this to i8*
-%var4 = bitcast %class.MyClass* %classvariable.this.addr to i8*
-call void @llvm.memcpy.p0i8.p0i8.i64(i8* %var3, i8* %var4, i64 4, i32 4, i1 false)
-ret void
-}
%class.ByteArray = type { i32, i32 }
define void @ByteArray(%class.ByteArray* %classvariable.this, i32 %size)
{
%classvariable.this.addr = alloca %class.ByteArray, align 4
%size.addr = alloca i32, align 4
store i32 %size, i32* %size.addr, align 4
-%var5 = load i32* %size.addr, align 4
-%var6 = getelementptr inbounds %class.ByteArray* %classvariable.this.addr, i32 0, i32 0
-store i32 %var5, i32* %var6, align 4
-%var7 = bitcast %class.ByteArray* %classvariable.this to i8*
-%var8 = bitcast %class.ByteArray* %classvariable.this.addr to i8*
-call void @llvm.memcpy.p0i8.p0i8.i64(i8* %var7, i8* %var8, i64 8, i32 4, i1 false)
-%var9 = getelementptr inbounds %class.ByteArray* %classvariable.this, i32 0, i32 1
-%var10 = getelementptr inbounds %class.ByteArray* %classvariable.this, i32 0, i32 0
-%var11 = load i32* %var10, align 4
-%var12 = call i32 @malloc_array(i32 %var11)
-%var13 = alloca i32, align 4
-store i32 %var12, i32* %var13, align 4
-%var14 = load i32* %var9, align 4
-%var15 = load i32* %var13, align 4
-store i32 %var15, i32* %var9, align 4
+%var1 = load i32* %size.addr, align 4
+%var2 = getelementptr inbounds %class.ByteArray* %classvariable.this.addr, i32 0, i32 0
+store i32 %var1, i32* %var2, align 4
+%var3 = bitcast %class.ByteArray* %classvariable.this to i8*
+%var4 = bitcast %class.ByteArray* %classvariable.this.addr to i8*
+call void @llvm.memcpy.p0i8.p0i8.i64(i8* %var3, i8* %var4, i64 8, i32 4, i1 false)
+%var5 = getelementptr inbounds %class.ByteArray* %classvariable.this, i32 0, i32 1
+%var6 = getelementptr inbounds %class.ByteArray* %classvariable.this, i32 0, i32 0
+%var7 = load i32* %var6, align 4
+%var8 = call i32 @malloc_array(i32 %var7)
+%var9 = alloca i32, align 4
+store i32 %var8, i32* %var9, align 4
+%var10 = load i32* %var5, align 4
+%var11 = load i32* %var9, align 4
+store i32 %var11, i32* %var5, align 4
ret void
}
define i8 @ByteArray.get(%class.ByteArray* %classvariable.this, i32 %index)
{
%index.addr = alloca i32, align 4
store i32 %index, i32* %index.addr, align 4
-%var16 = getelementptr inbounds %class.ByteArray* %classvariable.this, i32 0, i32 1
-%var17 = load i32* %var16, align 4
-%var18 = load i32* %index.addr, align 4
-%var19 = call i8 @kotlinclib_get_byte(i32 %var17, i32 %var18)
-%var20 = alloca i8, align 1
-store i8 %var19, i8* %var20, align 1
-%var21 = load i8* %var20, align 1
-ret i8 %var21
+%var12 = getelementptr inbounds %class.ByteArray* %classvariable.this, i32 0, i32 1
+%var13 = load i32* %var12, align 4
+%var14 = load i32* %index.addr, align 4
+%var15 = call i8 @kotlinclib_get_byte(i32 %var13, i32 %var14)
+%var16 = alloca i8, align 1
+store i8 %var15, i8* %var16, align 1
+%var17 = load i8* %var16, align 1
+ret i8 %var17
}
define void @ByteArray.clone(%class.ByteArray** %instance, %class.ByteArray* %classvariable.this)
{
-%var22 = getelementptr inbounds %class.ByteArray* %classvariable.this, i32 0, i32 0
-%var23 = load i32* %var22, align 4
-%var25 = call i8* @malloc(i32 8)
-%var24 = bitcast i8* %var25 to %class.ByteArray*
-call void @ByteArray(%class.ByteArray* %var24, i32 %var23)
+%var18 = getelementptr inbounds %class.ByteArray* %classvariable.this, i32 0, i32 0
+%var19 = load i32* %var18, align 4
+%var21 = call i8* @malloc(i32 8)
+%var20 = bitcast i8* %var21 to %class.ByteArray*
+call void @ByteArray(%class.ByteArray* %var20, i32 %var19)
%managed.index.1 = alloca i32, align 4
store i32 0, i32* %managed.index.1, align 4
br label %label.while.1
label.while.1:
-%var26 = getelementptr inbounds %class.ByteArray* %classvariable.this, i32 0, i32 0
-%var27 = load i32* %managed.index.1, align 4
-%var28 = load i32* %var26, align 4
-%var29 = icmp slt i32 %var27, %var28
-br i1 %var29, label %label.while.2, label %label.while.3
+%var22 = getelementptr inbounds %class.ByteArray* %classvariable.this, i32 0, i32 0
+%var23 = load i32* %managed.index.1, align 4
+%var24 = load i32* %var22, align 4
+%var25 = icmp slt i32 %var23, %var24
+br i1 %var25, label %label.while.2, label %label.while.3
label.while.2:
-%var30 = load i32* %managed.index.1, align 4
-%var31 = call i8 @ByteArray.get(%class.ByteArray* %classvariable.this, i32 %var30)
-%var32 = alloca i8, align 1
-store i8 %var31, i8* %var32, align 1
+%var26 = load i32* %managed.index.1, align 4
+%var27 = call i8 @ByteArray.get(%class.ByteArray* %classvariable.this, i32 %var26)
+%var28 = alloca i8, align 1
+store i8 %var27, i8* %var28, align 1
+%var29 = load i32* %managed.index.1, align 4
+%var30 = load i8* %var28, align 1
+call void @ByteArray.set(%class.ByteArray* %var20, i32 %var29, i8 %var30)
+%var31 = load i32* %managed.index.1, align 4
+%var32 = add nsw i32 %var31, 1
%var33 = load i32* %managed.index.1, align 4
-%var34 = load i8* %var32, align 1
-call void @ByteArray.set(%class.ByteArray* %var24, i32 %var33, i8 %var34)
-%var35 = load i32* %managed.index.1, align 4
-%var36 = add nsw i32 %var35, 1
-%var37 = load i32* %managed.index.1, align 4
-store i32 %var36, i32* %managed.index.1, align 4
+store i32 %var32, i32* %managed.index.1, align 4
br label %label.while.1
label.while.3:
-store %class.ByteArray* %var24, %class.ByteArray** %instance, align 4
+store %class.ByteArray* %var20, %class.ByteArray** %instance, align 4
ret void
}
define void @ByteArray.set(%class.ByteArray* %classvariable.this, i32 %index, i8 %value)
@@ -89,22 +75,29 @@ define void @ByteArray.set(%class.ByteArray* %classvariable.this, i32 %index,
store i32 %index, i32* %index.addr, align 4
%value.addr = alloca i8, align 1
store i8 %value, i8* %value.addr, align 1
-%var38 = getelementptr inbounds %class.ByteArray* %classvariable.this, i32 0, i32 1
-%var39 = load i32* %var38, align 4
-%var40 = load i32* %index.addr, align 4
-%var41 = load i8* %value.addr, align 1
-call void @kotlinclib_set_byte(i32 %var39, i32 %var40, i8 %var41)
+%var34 = getelementptr inbounds %class.ByteArray* %classvariable.this, i32 0, i32 1
+%var35 = load i32* %var34, align 4
+%var36 = load i32* %index.addr, align 4
+%var37 = load i8* %value.addr, align 1
+call void @kotlinclib_set_byte(i32 %var35, i32 %var36, i8 %var37)
ret void
}
declare i8 @kotlinclib_get_byte(i32 %src, i32 %index)
+define i8 @bytearray_1(i8 %x)
+{
+%x.addr = alloca i8, align 1
+store i8 %x, i8* %x.addr, align 1
+%var39 = call i8* @malloc(i32 8)
+%var38 = bitcast i8* %var39 to %class.ByteArray*
+call void @ByteArray(%class.ByteArray* %var38, i32 10)
+%var40 = load i8* %x.addr, align 1
+call void @ByteArray.set(%class.ByteArray* %var38, i32 1, i8 %var40)
+%var41 = call i8 @ByteArray.get(%class.ByteArray* %var38, i32 1)
+%var42 = alloca i8, align 1
+store i8 %var41, i8* %var42, align 1
+%var43 = load i8* %var42, align 1
+ret i8 %var43
+}
declare i32 @malloc_array(i32 %size)
declare void @kotlinclib_set_byte(i32 %src, i32 %index, i8 %value)
-define void @createMyClass(%class.MyClass** %instance)
-{
-%var43 = call i8* @malloc(i32 4)
-%var42 = bitcast i8* %var43 to %class.MyClass*
-call void @MyClass(%class.MyClass* %var42, i32 1)
-store %class.MyClass* %var42, %class.MyClass** %instance, align 4
-ret void
-}
diff --git a/translator/.gradle/2.9/taskArtifacts/cache.properties.lock b/translator/.gradle/2.9/taskArtifacts/cache.properties.lock
index 5d12538d200..d061c564a6c 100644
Binary files a/translator/.gradle/2.9/taskArtifacts/cache.properties.lock and b/translator/.gradle/2.9/taskArtifacts/cache.properties.lock differ
diff --git a/translator/.gradle/2.9/taskArtifacts/fileHashes.bin b/translator/.gradle/2.9/taskArtifacts/fileHashes.bin
index 2097cddd1b2..697fb99ea5c 100644
Binary files a/translator/.gradle/2.9/taskArtifacts/fileHashes.bin and b/translator/.gradle/2.9/taskArtifacts/fileHashes.bin differ
diff --git a/translator/.gradle/2.9/taskArtifacts/fileSnapshots.bin b/translator/.gradle/2.9/taskArtifacts/fileSnapshots.bin
index 15cddfed94e..d791606d08d 100644
Binary files a/translator/.gradle/2.9/taskArtifacts/fileSnapshots.bin and b/translator/.gradle/2.9/taskArtifacts/fileSnapshots.bin differ
diff --git a/translator/.gradle/2.9/taskArtifacts/outputFileStates.bin b/translator/.gradle/2.9/taskArtifacts/outputFileStates.bin
index 6e981f93221..90ce2923599 100644
Binary files a/translator/.gradle/2.9/taskArtifacts/outputFileStates.bin and b/translator/.gradle/2.9/taskArtifacts/outputFileStates.bin differ
diff --git a/translator/.gradle/2.9/taskArtifacts/taskArtifacts.bin b/translator/.gradle/2.9/taskArtifacts/taskArtifacts.bin
index 1eb8c2e00c5..8f71b7520c0 100644
Binary files a/translator/.gradle/2.9/taskArtifacts/taskArtifacts.bin and b/translator/.gradle/2.9/taskArtifacts/taskArtifacts.bin differ
diff --git a/translator/.idea/modules/ast-kotlin_test.iml b/translator/.idea/modules/ast-kotlin_test.iml
index 9dd3eef3c3e..8717ed3e558 100644
--- a/translator/.idea/modules/ast-kotlin_test.iml
+++ b/translator/.idea/modules/ast-kotlin_test.iml
@@ -10,6 +10,7 @@
+
diff --git a/translator/build.gradle b/translator/build.gradle
index 3286ebcc285..cbea023af9b 100644
--- a/translator/build.gradle
+++ b/translator/build.gradle
@@ -2,16 +2,19 @@ group 'ast-kotlin'
version '1.0-SNAPSHOT'
buildscript {
+ ext.kotlin_version = '1.0.3'
+
repositories {
mavenCentral()
}
dependencies {
- classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.0.1"
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.0.2"
}
}
apply plugin: 'java'
apply plugin: 'kotlin'
+apply plugin: 'application'
repositories {
mavenCentral()
@@ -19,7 +22,16 @@ repositories {
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib:1.0.1"
- // https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-compiler
compile group: 'org.jetbrains.kotlin', name: 'kotlin-compiler', version: '1.0.3'
testCompile group: 'junit', name: 'junit', version: '4.11'
}
+
+jar {
+ manifest {
+ attributes 'Main-Class': 'MainKt'
+ }
+
+ from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
+}
+
+mainClassName = 'MainKt'
diff --git a/translator/idea_run.sh b/translator/idea_run.sh
index 73b76133699..de4cd777fe6 100755
--- a/translator/idea_run.sh
+++ b/translator/idea_run.sh
@@ -1,4 +1,3 @@
#!/bin/bash
-
-/usr/lib/jvm/default-java/bin/java -Didea.launcher.port=7533 -Didea.launcher.bin.path=/opt/idea-IU-145.1617.8/bin -Dfile.encoding=UTF-8 -classpath /usr/lib/jvm/default-java/jre/lib/charsets.jar:/usr/lib/jvm/default-java/jre/lib/ext/cldrdata.jar:/usr/lib/jvm/default-java/jre/lib/ext/dnsns.jar:/usr/lib/jvm/default-java/jre/lib/ext/icedtea-sound.jar:/usr/lib/jvm/default-java/jre/lib/ext/jaccess.jar:/usr/lib/jvm/default-java/jre/lib/ext/localedata.jar:/usr/lib/jvm/default-java/jre/lib/ext/nashorn.jar:/usr/lib/jvm/default-java/jre/lib/ext/sunec.jar:/usr/lib/jvm/default-java/jre/lib/ext/sunjce_provider.jar:/usr/lib/jvm/default-java/jre/lib/ext/sunpkcs11.jar:/usr/lib/jvm/default-java/jre/lib/ext/zipfs.jar:/usr/lib/jvm/default-java/jre/lib/jce.jar:/usr/lib/jvm/default-java/jre/lib/jsse.jar:/usr/lib/jvm/default-java/jre/lib/management-agent.jar:/usr/lib/jvm/default-java/jre/lib/resources.jar:/usr/lib/jvm/default-java/jre/lib/rt.jar:/home/user/Kotlin/carkot/translator/build/classes/main:/home/user/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.0.1/68cddd9aec83d23f789f72bfdc933db245c4a635/kotlin-stdlib-1.0.1.jar:/home/user/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler/1.0.3/5dbeb14062996a5c2208861d6364cc97a21b06b8/kotlin-compiler-1.0.3.jar:/home/user/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-runtime/1.0.1/124852ea8cdd3d89827923b5e79627e8a7c314b2/kotlin-runtime-1.0.1.jar:/opt/idea-IU-145.1617.8/lib/idea_rt.jar com.intellij.rt.execution.application.AppMain MainKt $1 > $2
+java -jar build/libs/ast-kotlin-1.0-SNAPSHOT.jar $1 > $2
diff --git a/translator/src/main/kotlin/main.kt b/translator/src/main/kotlin/main.kt
index 2a3bc8babb9..b834fa8c304 100644
--- a/translator/src/main/kotlin/main.kt
+++ b/translator/src/main/kotlin/main.kt
@@ -14,11 +14,9 @@ fun main(args: Array) {
val analyzedFiles = ArrayList()
- val kotlib = ClassLoader.getSystemClassLoader().getResources("kotlib/kotlin")
- for (resource in kotlib) {
- for (app in File(resource.toURI()).listFiles()) {
- analyzedFiles.add(app.absoluteFile.toString())
- }
+ val kotlib = File("build/resources/main/kotlib/kotlin").listFiles()
+ for (resourse in kotlib) {
+ analyzedFiles.add(resourse.absolutePath)
}
analyzedFiles.addAll(args.toList())
diff --git a/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt b/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt
index 49e09948129..a15430f089f 100644
--- a/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt
+++ b/translator/src/main/kotlin/org/kotlinnative/translator/BlockCodegen.kt
@@ -67,6 +67,7 @@ abstract class BlockCodegen(open val state: TranslationState, open val variableM
is KtReferenceExpression -> evaluateReferenceExpression(expr, scopeDepth)
is KtIfExpression -> evaluateIfOperator(expr.firstChild as LeafPsiElement, scopeDepth + 1, true)
is KtStringTemplateExpression -> evaluateStringTemplateExpression(expr)
+ is KtReturnExpression -> evaluateReturnInstruction(expr.firstChild, scopeDepth)
is PsiWhiteSpace -> null
is PsiElement -> evaluatePsiElement(expr, scopeDepth)
null -> null
@@ -175,7 +176,7 @@ abstract class BlockCodegen(open val state: TranslationState, open val variableM
private fun evaluateReferenceExpression(expr: KtReferenceExpression, scopeDepth: Int, classScope: ClassCodegen? = null): LLVMSingleValue? = when (expr) {
is KtArrayAccessExpression -> evaluateArrayAccessExpression(expr, scopeDepth + 1)
else -> if ((expr is KtNameReferenceExpression) && (classScope != null)) evaluatenameReferenceExpression(expr, scopeDepth + 1, classScope)
- else variableManager.getLLVMvalue(expr.firstChild.text)
+ else variableManager.getLLVMvalue(expr.firstChild.text)
}
private fun evaluateCallExpression(expr: KtCallExpression, scopeDepth: Int, classScope: ClassCodegen? = null): LLVMSingleValue? {
@@ -217,9 +218,7 @@ abstract class BlockCodegen(open val state: TranslationState, open val variableM
callArgs.addAll(loadedArgs)
return evaluateFunctionCallExpression(LLVMVariable(methodFullName, returnType, scope = LLVMVariableScope()), callArgs)
-
}
-
}
val nestedConstructor = classScope?.nestedClasses?.get(expr.calleeExpression!!.text)
@@ -306,15 +305,19 @@ abstract class BlockCodegen(open val state: TranslationState, open val variableM
}
private fun evaluateBinaryExpression(expr: KtBinaryExpression, scopeDepth: Int): LLVMVariable {
+ val operator = expr.operationToken
+ if (operator == KtTokens.ELVIS) {
+ return evaluateElvisOperator(expr, scopeDepth)
+ }
+
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 executeBinaryExpression(operator, expr.operationReference, left, right, scopeDepth)
}
private fun executeBinaryExpression(operator: IElementType, referenceName: KtSimpleNameExpression?, left: LLVMSingleValue, right: LLVMSingleValue, scopeDepth: Int): LLVMVariable {
- val result = codeBuilder.addPrimitiveBinaryOperation(operator, referenceName, left, right)
+ val result = addPrimitiveBinaryOperation(operator, referenceName, left, right)
if (left.type is LLVMReferenceType && left.pointer > 0 && right.pointer > 0) {
variableManager.addVariable((left as LLVMVariable).kotlinName!!, result, scopeDepth)
@@ -323,6 +326,80 @@ abstract class BlockCodegen(open val state: TranslationState, open val variableM
return result
}
+ private fun evaluateElvisOperator(expr: KtBinaryExpression, scopeDepth: Int): LLVMVariable {
+ val left = evaluateExpression(expr.firstChild, scopeDepth) ?: throw UnsupportedOperationException("Wrong binary exception")
+ val condition = left.type!!.operatorEq(left, LLVMVariable("", LLVMNullType()))
+
+ val conditionResult = codeBuilder.getNewVariable(condition.variableType)
+ codeBuilder.addAssignment(conditionResult, condition)
+
+ val elvisResult = codeBuilder.getNewVariable(left.type!!, pointer = left.pointer)
+ codeBuilder.allocStackVar(elvisResult)
+ elvisResult.pointer++
+
+ val thenLabel = codeBuilder.getNewLabel(prefix = "elvis")
+ val elseLabel = codeBuilder.getNewLabel(prefix = "elvis")
+ val endLabel = codeBuilder.getNewLabel(prefix = "elvis")
+
+ codeBuilder.addCondition(conditionResult, thenLabel, elseLabel)
+
+ codeBuilder.markWithLabel(thenLabel)
+ codeBuilder.storeVariable(elvisResult, left)
+ codeBuilder.addUnconditionalJump(endLabel)
+
+ codeBuilder.markWithLabel(elseLabel)
+ val right = evaluateExpression(expr.lastChild, scopeDepth + 1)
+ if (right != null) {
+ codeBuilder.storeVariable(elvisResult, right)
+ }
+
+ codeBuilder.addUnconditionalJump(endLabel)
+ codeBuilder.markWithLabel(endLabel)
+ return elvisResult
+ }
+
+ private fun addPrimitiveBinaryOperation(operator: IElementType, referenceName: KtSimpleNameExpression?, firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMVariable {
+ val firstNativeOp = codeBuilder.receiveNativeValue(firstOp)
+ val secondNativeOp = codeBuilder.receiveNativeValue(secondOp)
+ val llvmExpression = when (operator) {
+ KtTokens.PLUS -> firstOp.type!!.operatorPlus(firstNativeOp, secondNativeOp)
+ KtTokens.MINUS -> firstOp.type!!.operatorMinus(firstNativeOp, secondNativeOp)
+ KtTokens.MUL -> firstOp.type!!.operatorTimes(firstNativeOp, secondNativeOp)
+ KtTokens.LT -> firstOp.type!!.operatorLt(firstNativeOp, secondNativeOp)
+ KtTokens.GT -> firstOp.type!!.operatorGt(firstNativeOp, secondNativeOp)
+ KtTokens.LTEQ -> firstOp.type!!.operatorLeq(firstNativeOp, secondNativeOp)
+ KtTokens.GTEQ -> firstOp.type!!.operatorGeq(firstNativeOp, secondNativeOp)
+ KtTokens.EQEQ ->
+ if (firstOp.type is LLVMReferenceType)
+ firstOp.type!!.operatorEq(firstOp, secondOp)
+ else
+ firstOp.type!!.operatorEq(firstNativeOp, secondNativeOp)
+ KtTokens.EXCLEQ -> firstOp.type!!.operatorNeq(firstNativeOp, secondNativeOp)
+ KtTokens.EQ -> {
+ if (secondOp.type is LLVMNullType) {
+ val result = codeBuilder.getNewVariable(firstOp.type!!, firstOp.pointer)
+ codeBuilder.allocStackVar(result)
+ result.pointer++
+
+ codeBuilder.storeNull(result)
+ return result
+ }
+
+ if (firstOp.type is LLVMReferenceType && firstOp.pointer > 0 && secondOp.pointer > 0) {
+ return secondOp as LLVMVariable
+ }
+
+ val result = firstOp as LLVMVariable
+ codeBuilder.storeVariable(result, secondNativeOp)
+ return result
+ }
+ else -> codeBuilder.addPrimitiveReferenceOperation(referenceName!!, firstNativeOp, secondNativeOp)
+ }
+ val resultOp = codeBuilder.getNewVariable(llvmExpression.variableType)
+ codeBuilder.addAssignment(resultOp, llvmExpression)
+ return resultOp
+ }
+
private fun evaluateConstantExpression(expr: KtConstantExpression): LLVMConstant {
val node = expr.node
@@ -535,17 +612,21 @@ abstract class BlockCodegen(open val state: TranslationState, open val variableM
return null
}
- private fun evaluateReturnInstruction(element: LeafPsiElement, scopeDepth: Int): LLVMVariable? {
+ private fun evaluateReturnInstruction(element: PsiElement, scopeDepth: Int): LLVMVariable? {
val next = element.getNextSiblingIgnoringWhitespaceAndComments()
- val retVar = evaluateExpression(next, scopeDepth) as LLVMSingleValue
+ val retVar = evaluateExpression(next, scopeDepth)
+ val type = retVar?.type ?: LLVMVoidType()
- when (returnType!!.type) {
+ when (type) {
is LLVMReferenceType -> {
- codeBuilder.storeVariable(returnType!!, retVar)
+ codeBuilder.storeVariable(returnType!!, retVar!!)
+ codeBuilder.addAnyReturn(LLVMVoidType())
+ }
+ is LLVMVoidType -> {
codeBuilder.addAnyReturn(LLVMVoidType())
}
else -> {
- val retNativeValue = codeBuilder.receiveNativeValue(retVar)
+ val retNativeValue = codeBuilder.receiveNativeValue(retVar!!)
codeBuilder.addReturnOperator(retNativeValue)
}
}
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 7756cc5e068..f2b1c694ffa 100644
--- a/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt
+++ b/translator/src/main/kotlin/org/kotlinnative/translator/llvm/LLVMBuilder.kt
@@ -70,57 +70,14 @@ class LLVMBuilder(val arm: Boolean) {
}
}
- fun addPrimitiveBinaryOperation(operation: IElementType, referenceName: KtSimpleNameExpression?, firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMVariable {
- val firstNativeOp = receiveNativeValue(firstOp)
- val secondNativeOp = receiveNativeValue(secondOp)
- val llvmExpression = when (operation) {
- KtTokens.PLUS -> firstOp.type!!.operatorPlus(firstNativeOp, secondNativeOp)
- KtTokens.MINUS -> firstOp.type!!.operatorMinus(firstNativeOp, secondNativeOp)
- KtTokens.MUL -> firstOp.type!!.operatorTimes(firstNativeOp, secondNativeOp)
- KtTokens.LT -> firstOp.type!!.operatorLt(firstNativeOp, secondNativeOp)
- KtTokens.GT -> firstOp.type!!.operatorGt(firstNativeOp, secondNativeOp)
- KtTokens.LTEQ -> firstOp.type!!.operatorLeq(firstNativeOp, secondNativeOp)
- KtTokens.GTEQ -> firstOp.type!!.operatorGeq(firstNativeOp, secondNativeOp)
- KtTokens.EQEQ ->
- if (firstOp.type is LLVMReferenceType)
- firstOp.type!!.operatorEq(firstOp, secondOp)
- else
- firstOp.type!!.operatorEq(firstNativeOp, secondNativeOp)
- KtTokens.EXCLEQ -> firstOp.type!!.operatorNeq(firstNativeOp, secondNativeOp)
- KtTokens.EQ -> {
- if (secondOp.type is LLVMNullType) {
- val result = getNewVariable(firstOp.type!!, firstOp.pointer)
- allocStackVar(result)
- result.pointer++
-
- storeNull(result)
- return result
- }
-
- if (firstOp.type is LLVMReferenceType && firstOp.pointer > 0 && secondOp.pointer > 0) {
- return secondOp as LLVMVariable
- }
-
- val result = firstOp as LLVMVariable
- storeVariable(result, secondNativeOp)
- return result
- }
- else -> addPrimitiveReferenceOperation(referenceName!!, firstNativeOp, secondNativeOp)
- }
- val resultOp = getNewVariable(llvmExpression.variableType)
- addAssignment(resultOp, llvmExpression)
-
- return resultOp
- }
-
fun clean() {
localCode = StringBuilder()
globalCode = StringBuilder()
initBuilder()
}
- fun addAssignment(llvmVariable: LLVMVariable, rhs: LLVMNode) {
- localCode.appendln("$llvmVariable = $rhs")
+ fun addAssignment(lhs: LLVMVariable, rhs: LLVMNode) {
+ localCode.appendln("$lhs = $rhs")
}
fun addReturnOperator(llvmVariable: LLVMSingleValue) {
diff --git a/translator/src/test/kotlin/tests/kotlin/if_1.kt b/translator/src/test/kotlin/tests/kotlin/if_1.kt
index 90da5a214e5..a67f222497f 100644
--- a/translator/src/test/kotlin/tests/kotlin/if_1.kt
+++ b/translator/src/test/kotlin/tests/kotlin/if_1.kt
@@ -8,11 +8,11 @@ fun if_test_1(x: Int): Int {
return a
}
-class MyClass(i: Int)
+class MyClass2(i: Int)
fun if_test_null(x: Int): Int {
- val y: MyClass? = null
+ val y: MyClass2? = null
if (y == null) {
return 1
} else {
@@ -21,7 +21,7 @@ fun if_test_null(x: Int): Int {
}
fun if_test_null_2(x: Int): Int {
- val y: MyClass? = MyClass(1)
+ val y: MyClass2? = MyClass2(1)
if (y == null) {
return 1