From 28e148d35abbf378e7cb6ac5fc72d9c484ebcb01 Mon Sep 17 00:00:00 2001 From: Ilmir Usmanov Date: Wed, 28 Oct 2020 20:04:59 +0100 Subject: [PATCH] Old JVM: support init blocks in inline classes #KT-28055 Fixed --- .../kotlin/codegen/ConstructorCodegen.java | 4 +++- .../boxImplDoesNotExecuteInitBlock.kt | 2 -- .../codegen/box/inlineClasses/initBlock.kt | 2 -- .../inlineClasses/boxThisOfInlineClass.kt | 18 ++++++++++++++---- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ConstructorCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ConstructorCodegen.java index 336210c8b9a..cf1bb8fab10 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ConstructorCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ConstructorCodegen.java @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.resolve.BindingContext; import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils; +import org.jetbrains.kotlin.resolve.InlineClassesUtilsKt; import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall; import org.jetbrains.kotlin.resolve.jvm.InlineClassManglingRulesKt; import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin; @@ -192,6 +193,7 @@ public class ConstructorCodegen { markLineNumberForConstructor(constructorDescriptor, primaryConstructor, codegen); if (OwnerKind.ERASED_INLINE_CLASS == kind) { + memberCodegen.generateInitializers(() -> codegen); Type t = typeMapper.mapType(constructorDescriptor.getContainingDeclaration()); iv.load(0, t); iv.areturn(t); @@ -226,7 +228,7 @@ public class ConstructorCodegen { } //object initialization was moved to initializeObjects() - if (!isObject(descriptor)) { + if (!isObject(descriptor) && !InlineClassesUtilsKt.isInlineClass(descriptor)) { memberCodegen.generateInitializers(() -> codegen); } iv.visitInsn(RETURN); diff --git a/compiler/testData/codegen/box/inlineClasses/boxImplDoesNotExecuteInitBlock.kt b/compiler/testData/codegen/box/inlineClasses/boxImplDoesNotExecuteInitBlock.kt index 6a79dbf722d..3bad4968fef 100644 --- a/compiler/testData/codegen/box/inlineClasses/boxImplDoesNotExecuteInitBlock.kt +++ b/compiler/testData/codegen/box/inlineClasses/boxImplDoesNotExecuteInitBlock.kt @@ -1,6 +1,4 @@ -// IGNORE_BACKEND: JVM // IGNORE_BACKEND: JS_IR -// IGNORE_LIGHT_ANALYSIS inline class IC(val i: Int) { init { diff --git a/compiler/testData/codegen/box/inlineClasses/initBlock.kt b/compiler/testData/codegen/box/inlineClasses/initBlock.kt index d3fde4e0723..4bdcdd2b53e 100644 --- a/compiler/testData/codegen/box/inlineClasses/initBlock.kt +++ b/compiler/testData/codegen/box/inlineClasses/initBlock.kt @@ -1,6 +1,4 @@ -// IGNORE_BACKEND: JVM // IGNORE_BACKEND: JS_IR -// IGNORE_LIGHT_ANALYSIS inline class SingleInitBlock(val s: String) { init { diff --git a/compiler/testData/codegen/bytecodeText/inlineClasses/boxThisOfInlineClass.kt b/compiler/testData/codegen/bytecodeText/inlineClasses/boxThisOfInlineClass.kt index 650dad0a430..6ef6901785b 100644 --- a/compiler/testData/codegen/bytecodeText/inlineClasses/boxThisOfInlineClass.kt +++ b/compiler/testData/codegen/bytecodeText/inlineClasses/boxThisOfInlineClass.kt @@ -13,8 +13,18 @@ inline class UInt(val a: Int) { fun takeNullable(a: UInt?) {} -// 2 INVOKESTATIC UInt\.box -// 0 INVOKEVIRTUAL Foo.unbox - // 1 valueOf -// 0 intValue \ No newline at end of file +// 0 intValue + +// JVM_TEMPLATES: +// 2 INVOKESTATIC UInt\.box +// -- equals-impl +// 1 INVOKEVIRTUAL UInt\.unbox + +// JVM_IR_TEMPLATES: +// -- 1 before takeNullable +// -- 1 before takeAnyInside +// -- 1 before takeAnyInside's GETFIELD +// 3 INVOKESTATIC UInt\.box +// -- getA, toString, hashCode, equals-impl, equals +// 5 INVOKEVIRTUAL UInt\.unbox \ No newline at end of file