CODEGEN: fix initialization and workarounds for object initialization with companion objects and etc.
(cherry picked from commit ae9e493ee92a3730a5ad82e072ab7eed32a8cc27)
This commit is contained in:
committed by
vvlevchenko
parent
4717e99ac2
commit
87c8a9f895
+24
-5
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user