translator: class and objects fields
This commit is contained in:
@@ -197,8 +197,9 @@ abstract class BlockCodegen(open val state: TranslationState, open val variableM
|
|||||||
}).toList()
|
}).toList()
|
||||||
|
|
||||||
private fun evaluateConstructorCallExpression(function: LLVMVariable, names: List<LLVMSingleValue>): LLVMSingleValue? {
|
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)
|
codeBuilder.allocStaticVar(result)
|
||||||
|
result.pointer += 1
|
||||||
|
|
||||||
val args = ArrayList<LLVMSingleValue>()
|
val args = ArrayList<LLVMSingleValue>()
|
||||||
args.add(result)
|
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 left = evaluateExpression(expr.firstChild, scopeDepth) ?: throw UnsupportedOperationException("Wrong binary exception")
|
||||||
val right = evaluateExpression(expr.lastChild, scopeDepth) ?: throw UnsupportedOperationException("Wrong binary exception")
|
val right = evaluateExpression(expr.lastChild, scopeDepth) ?: throw UnsupportedOperationException("Wrong binary exception")
|
||||||
val operator = expr.operationToken
|
val operator = expr.operationToken
|
||||||
|
|
||||||
return codeBuilder.addPrimitiveBinaryOperation(operator, expr.operationReference, left, right)
|
return codeBuilder.addPrimitiveBinaryOperation(operator, expr.operationReference, left, right)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -380,7 +382,7 @@ abstract class BlockCodegen(open val state: TranslationState, open val variableM
|
|||||||
return null
|
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)
|
codeBuilder.addConstant(newVar, assignExpression)
|
||||||
variableManager.addVariable(identifier, newVar, scopeDepth)
|
variableManager.addVariable(identifier, newVar, scopeDepth)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ class ClassCodegen(override val state: TranslationState, override val variableMa
|
|||||||
annotation = descriptor.kind == ClassKind.ANNOTATION_CLASS
|
annotation = descriptor.kind == ClassKind.ANNOTATION_CLASS
|
||||||
indexFields(descriptor, parameterList)
|
indexFields(descriptor, parameterList)
|
||||||
generateInnerFields(clazz.declarations)
|
generateInnerFields(clazz.declarations)
|
||||||
|
type.size = size
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun indexFields(descriptor: ClassDescriptor, parameters: MutableList<KtParameter>) {
|
private fun indexFields(descriptor: ClassDescriptor, parameters: MutableList<KtParameter>) {
|
||||||
|
|||||||
@@ -87,8 +87,8 @@ abstract class StructCodegen(open val state: TranslationState, open val variable
|
|||||||
codeBuilder.addStartExpression()
|
codeBuilder.addStartExpression()
|
||||||
generateLoadArguments(classVal)
|
generateLoadArguments(classVal)
|
||||||
generateAssignments()
|
generateAssignments()
|
||||||
genClassInitializers()
|
|
||||||
generateReturn()
|
generateReturn()
|
||||||
|
genClassInitializers()
|
||||||
codeBuilder.addAnyReturn(LLVMVoidType())
|
codeBuilder.addAnyReturn(LLVMVoidType())
|
||||||
codeBuilder.addEndExpression()
|
codeBuilder.addEndExpression()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -93,7 +93,7 @@ class LLVMBuilder(val arm: Boolean) {
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
if (firstOp.pointer > 0 && secondOp.pointer > 0) {
|
if (firstOp.pointer > 1 && secondOp.pointer > 0) {
|
||||||
return secondOp as LLVMVariable
|
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)"
|
val alloc = "$allocedVar = call i8* @${if (arm) "malloc_static" else "malloc"}(i32 $size)"
|
||||||
localCode.appendln(alloc)
|
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)
|
localCode.appendln(cast)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -43,7 +43,7 @@ class LLVMBooleanType() : LLVMType() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override val align = 4
|
override val align = 4
|
||||||
override val size: Byte = 1
|
override var size: Int = 1
|
||||||
override val defaultValue = "0"
|
override val defaultValue = "0"
|
||||||
|
|
||||||
override fun toString() = "i1"
|
override fun toString() = "i1"
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ class LLVMByteType() : LLVMType() {
|
|||||||
LLVMExpression(LLVMBooleanType(), "icmp ne i8 $firstOp, $secondOp")
|
LLVMExpression(LLVMBooleanType(), "icmp ne i8 $firstOp, $secondOp")
|
||||||
|
|
||||||
override val align = 1
|
override val align = 1
|
||||||
override val size: Byte = 1
|
override var size: Int = 1
|
||||||
override fun toString(): String = "i8"
|
override fun toString(): String = "i8"
|
||||||
override val defaultValue = "0"
|
override val defaultValue = "0"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ class LLVMCharType() : LLVMType() {
|
|||||||
LLVMExpression(LLVMBooleanType(), "icmp ne i8 $firstOp, $secondOp")
|
LLVMExpression(LLVMBooleanType(), "icmp ne i8 $firstOp, $secondOp")
|
||||||
|
|
||||||
override val align = 1
|
override val align = 1
|
||||||
override val size: Byte = 1
|
override var size: Int = 1
|
||||||
override fun toString(): String = "i8"
|
override fun toString(): String = "i8"
|
||||||
override val defaultValue = "0"
|
override val defaultValue = "0"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ class LLVMDoubleType() : LLVMType() {
|
|||||||
LLVMExpression(LLVMDoubleType(), "fadd double $firstOp, $secondOp")
|
LLVMExpression(LLVMDoubleType(), "fadd double $firstOp, $secondOp")
|
||||||
|
|
||||||
override val align = 8
|
override val align = 8
|
||||||
override val size: Byte = 8
|
override var size: Int = 8
|
||||||
override fun toString() = "double"
|
override fun toString() = "double"
|
||||||
override val defaultValue = "0.0"
|
override val defaultValue = "0.0"
|
||||||
}
|
}
|
||||||
+1
-1
@@ -4,7 +4,7 @@ package org.kotlinnative.translator.llvm.types
|
|||||||
class LLVMEnumItemType() : LLVMType() {
|
class LLVMEnumItemType() : LLVMType() {
|
||||||
|
|
||||||
override val align = 4
|
override val align = 4
|
||||||
override val size: Byte = 4
|
override var size: Int = 4
|
||||||
override val defaultValue = "0"
|
override val defaultValue = "0"
|
||||||
|
|
||||||
override fun toString() = "i32"
|
override fun toString() = "i32"
|
||||||
|
|||||||
+1
-1
@@ -8,7 +8,7 @@ class LLVMFunctionType(type: KotlinType) : LLVMType() {
|
|||||||
|
|
||||||
override val defaultValue = ""
|
override val defaultValue = ""
|
||||||
override val align: Int = 4
|
override val align: Int = 4
|
||||||
override val size: Byte = 4
|
override var size: Int = 4
|
||||||
|
|
||||||
val arguments: List<LLVMVariable>
|
val arguments: List<LLVMVariable>
|
||||||
val returnType: LLVMVariable
|
val returnType: LLVMVariable
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ class LLVMIntType() : LLVMType() {
|
|||||||
LLVMExpression(LLVMBooleanType(), "icmp ne i32 $firstOp, $secondOp")
|
LLVMExpression(LLVMBooleanType(), "icmp ne i32 $firstOp, $secondOp")
|
||||||
|
|
||||||
override val align = 4
|
override val align = 4
|
||||||
override val size: Byte = 4
|
override var size: Int = 4
|
||||||
override val defaultValue = "0"
|
override val defaultValue = "0"
|
||||||
|
|
||||||
override fun toString() = "i32"
|
override fun toString() = "i32"
|
||||||
|
|||||||
@@ -2,6 +2,6 @@ package org.kotlinnative.translator.llvm.types
|
|||||||
|
|
||||||
class LLVMNullType() : LLVMType() {
|
class LLVMNullType() : LLVMType() {
|
||||||
override val align: Int = 0
|
override val align: Int = 0
|
||||||
override val size: Byte = 0
|
override var size: Int = 0
|
||||||
override val defaultValue: String = "0"
|
override val defaultValue: String = "0"
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -6,7 +6,7 @@ class LLVMReferenceType(val type: String, var prefix: String = "", override val
|
|||||||
|
|
||||||
override val defaultValue: String = ""
|
override val defaultValue: String = ""
|
||||||
|
|
||||||
override val size: Byte = 4
|
override var size: Int = 4
|
||||||
override fun toString() = "%$prefix${if (prefix.length > 0) "." else ""}$type"
|
override fun toString() = "%$prefix${if (prefix.length > 0) "." else ""}$type"
|
||||||
|
|
||||||
private val params = ArrayList<String>()
|
private val params = ArrayList<String>()
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ class LLVMShortType() : LLVMType() {
|
|||||||
override fun operatorNeq(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression =
|
override fun operatorNeq(firstOp: LLVMSingleValue, secondOp: LLVMSingleValue): LLVMExpression =
|
||||||
LLVMExpression(LLVMBooleanType(), "icmp ne i16 $firstOp, $secondOp")
|
LLVMExpression(LLVMBooleanType(), "icmp ne i16 $firstOp, $secondOp")
|
||||||
|
|
||||||
override val size: Byte = 2
|
override var size: Int = 2
|
||||||
override val align = 2
|
override val align = 2
|
||||||
override val defaultValue = "0"
|
override val defaultValue = "0"
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package org.kotlinnative.translator.llvm.types
|
|||||||
|
|
||||||
class LLVMStringType(override val length: Int) : LLVMArray, LLVMType() {
|
class LLVMStringType(override val length: Int) : LLVMArray, LLVMType() {
|
||||||
|
|
||||||
override val size: Byte = 1
|
override var size: Int = 1
|
||||||
override val align = 8
|
override val align = 8
|
||||||
override val defaultValue = ""
|
override val defaultValue = ""
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ abstract class LLVMType() : Cloneable {
|
|||||||
fun makeClone() = clone()
|
fun makeClone() = clone()
|
||||||
|
|
||||||
abstract val align: Int
|
abstract val align: Int
|
||||||
abstract val size: Byte
|
abstract var size: Int
|
||||||
abstract val defaultValue: String
|
abstract val defaultValue: String
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package org.kotlinnative.translator.llvm.types
|
|||||||
class LLVMVoidType() : LLVMType() {
|
class LLVMVoidType() : LLVMType() {
|
||||||
|
|
||||||
override val align = 0
|
override val align = 0
|
||||||
override val size: Byte = 0
|
override var size: Int = 0
|
||||||
override val defaultValue = ""
|
override val defaultValue = ""
|
||||||
|
|
||||||
override fun toString(): String = "void"
|
override fun toString(): String = "void"
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
test_simple_field() == 0
|
test_simple_field() == 1
|
||||||
test_field_assignment(10) == 10
|
test_field_assignment(10) == 10
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ class WithFields(var i: Int) {
|
|||||||
var j: Int
|
var j: Int
|
||||||
|
|
||||||
init {
|
init {
|
||||||
this.j = 0
|
this.j = this.i
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -14,8 +14,6 @@ fun test_simple_field(): Int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun test_field_assignment(i: Int): Int {
|
fun test_field_assignment(i: Int): Int {
|
||||||
val k = WithFields(1)
|
val k = WithFields(i)
|
||||||
k.j = i
|
|
||||||
|
|
||||||
return k.j
|
return k.j
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user