From 9ce2297957bb795b7cd8945fd0db97522d0a4395 Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Wed, 1 Mar 2017 20:05:57 +0300 Subject: [PATCH] Added INSTANCE_INITIALIZER_CALL to enum classes. Initializers lowering relies on fact that each constructor calling super constructor has also INSTANCE_INITIALIZER_CALL in it's body. --- .../backend/konan/lower/EnumClassLowering.kt | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/EnumClassLowering.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/EnumClassLowering.kt index e96b03e1445..9c4c9cb3859 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/EnumClassLowering.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/EnumClassLowering.kt @@ -126,6 +126,7 @@ internal class EnumClassLowering(val context: Context) : ClassLoweringPass { private lateinit var valueOfFunctionDescriptor: FunctionDescriptor fun run() { + insertInstanceInitializerCall() assignOrdinalsToEnumEntries() lowerEnumConstructors(irClass) lowerEnumEntriesClasses() @@ -136,6 +137,28 @@ internal class EnumClassLowering(val context: Context) : ClassLoweringPass { createImplObject() } + private fun insertInstanceInitializerCall() { + irClass.transformChildrenVoid(object: IrElementTransformerVoid() { + override fun visitClass(declaration: IrClass): IrStatement { + // Skip nested + return declaration + } + + override fun visitConstructor(declaration: IrConstructor): IrStatement { + declaration.transformChildrenVoid(this) + + val blockBody = declaration.body as? IrBlockBody ?: throw AssertionError("Unexpected constructor body: ${declaration.body}") + blockBody.statements.transformFlat { + if (it is IrEnumConstructorCall) + listOf(it, IrInstanceInitializerCallImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, + irClass.descriptor)) + else null + } + return declaration + } + }) + } + private fun assignOrdinalsToEnumEntries() { var ordinal = 0 irClass.declarations.forEach {