Old JVM: support init blocks in inline classes

#KT-28055 Fixed
This commit is contained in:
Ilmir Usmanov
2020-10-28 20:04:59 +01:00
parent 999604541e
commit 28e148d35a
4 changed files with 17 additions and 9 deletions
@@ -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);
@@ -1,6 +1,4 @@
// IGNORE_BACKEND: JVM
// IGNORE_BACKEND: JS_IR
// IGNORE_LIGHT_ANALYSIS
inline class IC(val i: Int) {
init {
@@ -1,6 +1,4 @@
// IGNORE_BACKEND: JVM
// IGNORE_BACKEND: JS_IR
// IGNORE_LIGHT_ANALYSIS
inline class SingleInitBlock(val s: String) {
init {
@@ -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
// 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