translator: class and objects fields

This commit is contained in:
e5l
2016-07-19 19:42:31 +03:00
parent a1ee214c90
commit 3e0cc75a3a
19 changed files with 24 additions and 23 deletions
@@ -197,8 +197,9 @@ abstract class BlockCodegen(open val state: TranslationState, open val variableM
}).toList()
private fun evaluateConstructorCallExpression(function: LLVMVariable, names: List<LLVMSingleValue>): LLVMSingleValue? {
val result = codeBuilder.getNewVariable(function.type, pointer = 1)
val result = codeBuilder.getNewVariable(function.type)
codeBuilder.allocStaticVar(result)
result.pointer += 1
val args = ArrayList<LLVMSingleValue>()
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)
}
@@ -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<KtParameter>) {
@@ -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()
}
@@ -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)
}
@@ -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"
@@ -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"
}
@@ -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"
}
@@ -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"
}
@@ -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"
@@ -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<LLVMVariable>
val returnType: LLVMVariable
@@ -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"
@@ -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"
}
@@ -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<String>()
@@ -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"
@@ -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 = ""
@@ -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
}
@@ -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"
@@ -1,2 +1,2 @@
test_simple_field() == 0
test_simple_field() == 1
test_field_assignment(10) == 10
@@ -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
}