CODEGEN: fix initialization and workarounds for object initialization with companion objects and etc.

(cherry picked from commit ae9e493ee92a3730a5ad82e072ab7eed32a8cc27)
This commit is contained in:
Konstantin Anisimov
2016-11-25 18:13:21 +03:00
committed by vvlevchenko
parent 4717e99ac2
commit 87c8a9f895
@@ -154,7 +154,8 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid
override fun visitConstructor(constructorDeclaration: IrConstructor) { override fun visitConstructor(constructorDeclaration: IrConstructor) {
codegen.function(constructorDeclaration) codegen.function(constructorDeclaration)
val classDescriptor = DescriptorUtils.getContainingClass(constructorDeclaration.descriptor) val constructorDescriptor = constructorDeclaration.descriptor
val classDescriptor = DescriptorUtils.getContainingClass(constructorDescriptor)
val thisPtr = codegen.load(codegen.thisVariable(), codegen.newVar()) val thisPtr = codegen.load(codegen.thisVariable(), codegen.newVar())
/** /**
@@ -169,7 +170,7 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid
if (!skipConstructorBodyGeneration(constructorDeclaration)) if (!skipConstructorBodyGeneration(constructorDeclaration))
constructorDeclaration.acceptChildrenVoid(this) constructorDeclaration.acceptChildrenVoid(this)
if (constructorDeclaration.descriptor.isPrimary) { if (constructorDescriptor.isPrimary && !DescriptorUtils.isCompanionObject(constructorDescriptor.constructedClass)) {
val irOfCurrentClass = context.moduleIndex.classes[classDescriptor!!.classId] val irOfCurrentClass = context.moduleIndex.classes[classDescriptor!!.classId]
irOfCurrentClass!!.acceptChildrenVoid(object : IrElementVisitorVoid { irOfCurrentClass!!.acceptChildrenVoid(object : IrElementVisitorVoid {
override fun visitElement(element: IrElement) { override fun visitElement(element: IrElement) {
@@ -181,7 +182,7 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid
val fieldDescriptor = fieldDeclaration.descriptor val fieldDescriptor = fieldDeclaration.descriptor
val fieldPtr = fieldPtrOfClass(thisPtr, fieldDescriptor) val fieldPtr = fieldPtrOfClass(thisPtr, fieldDescriptor)
var value:LLVMValueRef? = null var value:LLVMValueRef? = null
if (constructorDeclaration.descriptor.valueParameters.any{ it.name == fieldDescriptor.name }) { if (constructorDescriptor.valueParameters.any{ it.name == fieldDescriptor.name }) {
val variable = codegen.variable(fieldDescriptor.name.asString()) val variable = codegen.variable(fieldDescriptor.name.asString())
value = codegen.load(variable!!, codegen.newVar()) value = codegen.load(variable!!, codegen.newVar())
} }
@@ -190,6 +191,18 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid
} }
codegen.store(value!!, fieldPtr!!) codegen.store(value!!, fieldPtr!!)
} }
override fun visitAnonymousInitializer(declaration: IrAnonymousInitializer) {
evaluateExpression("", declaration.body)
}
override fun visitClass(declaration: IrClass) {
return
}
override fun visitConstructor(declaration: IrConstructor) {
return
}
}) })
} }
@@ -197,6 +210,11 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid
logger.log("visitConstructor : ${ir2string(constructorDeclaration)}") logger.log("visitConstructor : ${ir2string(constructorDeclaration)}")
} }
//-------------------------------------------------------------------------//
override fun visitAnonymousInitializer(declaration: IrAnonymousInitializer) {
logger.log("visitAnonymousInitializer : ${ir2string(declaration)}")
}
//-------------------------------------------------------------------------// //-------------------------------------------------------------------------//
@@ -361,6 +379,7 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid
is IrWhen -> return evaluateWhen (tmpVariableName, value) is IrWhen -> return evaluateWhen (tmpVariableName, value)
is IrThrow -> return evaluateThrow (tmpVariableName, value) is IrThrow -> return evaluateThrow (tmpVariableName, value)
is IrStringConcatenation -> return evaluateStringConcatenation(tmpVariableName, value) is IrStringConcatenation -> return evaluateStringConcatenation(tmpVariableName, value)
is IrBlockBody -> return evaluateBlock ( value as IrStatementContainer)
null -> return null null -> return null
else -> { else -> {
TODO("${ir2string(value)}") TODO("${ir2string(value)}")
@@ -635,8 +654,8 @@ internal class CodeGeneratorVisitor(val context: Context) : IrElementVisitorVoid
//-------------------------------------------------------------------------// //-------------------------------------------------------------------------//
private fun evaluateBlock(value: IrBlock): LLVMValueRef? { private fun evaluateBlock(value: IrStatementContainer): LLVMValueRef? {
logger.log("evaluateBlock : ${ir2string(value)}") logger.log("evaluateBlock : ${value.statements.forEach { ir2string(it) }}")
value.statements.dropLast(1).forEach { value.statements.dropLast(1).forEach {
evaluateExpression(codegen.newVar(), it) evaluateExpression(codegen.newVar(), it)
} }