Improve line numbers handling in serialization intrinsic

Fix nullable serializers on top-level & method with incorrect receiver

Improve handling of different runtime versions
This commit is contained in:
Leonid Startsev
2022-08-29 17:24:48 +02:00
committed by Space
parent aac9a06474
commit eae588abea
4 changed files with 125 additions and 84 deletions
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.backend.jvm.mapping.mapClass
import org.jetbrains.kotlin.codegen.AsmUtil
import org.jetbrains.kotlin.codegen.inline.ReifiedTypeInliner
import org.jetbrains.kotlin.codegen.inline.newMethodNodeWithCorrectStackSize
import org.jetbrains.kotlin.config.ApiVersion
import org.jetbrains.kotlin.descriptors.findClassAcrossModuleDependencies
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrFunction
@@ -34,6 +35,7 @@ import org.jetbrains.kotlinx.serialization.compiler.backend.jvm.kSerializerArray
import org.jetbrains.kotlinx.serialization.compiler.backend.jvm.kSerializerType
import org.jetbrains.kotlinx.serialization.compiler.backend.jvm.stringArrayType
import org.jetbrains.kotlinx.serialization.compiler.backend.jvm.stringType
import org.jetbrains.kotlinx.serialization.compiler.diagnostic.VersionReader
import org.jetbrains.kotlinx.serialization.compiler.resolve.SerialEntityNames.ENUM_SERIALIZER_FACTORY_FUNC_NAME
import org.jetbrains.kotlinx.serialization.compiler.resolve.SerialEntityNames.MARKED_ENUM_SERIALIZER_FACTORY_FUNC_NAME
import org.jetbrains.kotlinx.serialization.compiler.resolve.SerializersClassIds.contextSerializerId
@@ -57,8 +59,7 @@ class SerializationJvmIrIntrinsicSupport(val jvmBackendContext: JvmBackendContex
object Simple : IntrinsicType(stubCallDescriptor)
class WithModule(val storedIndex: Int) :
IntrinsicType(stubCallDescriptorWithModule) {
}
IntrinsicType(stubCallDescriptorWithModule)
}
companion object {
@@ -68,7 +69,12 @@ class SerializationJvmIrIntrinsicSupport(val jvmBackendContext: JvmBackendContex
|| method.typeParameters.size != 1
|| method.valueParameters.isNotEmpty()
) return null
return ReifiedSerializerMethod(method.extensionReceiverParameter != null)
val receiver = method.extensionReceiverParameter
return if (receiver == null)
ReifiedSerializerMethod(withModule = false)
else if (receiver.type.classFqName?.asString() == "kotlinx.serialization.modules.SerializersModule")
ReifiedSerializerMethod(withModule = true)
else null
}
val serializersModuleType: Type = Type.getObjectType("kotlinx/serialization/modules/SerializersModule")
@@ -95,7 +101,10 @@ class SerializationJvmIrIntrinsicSupport(val jvmBackendContext: JvmBackendContex
val storedIndex = frameMap.enterTemp(materialVal.type)
mv.store(storedIndex, materialVal.type)
IntrinsicType.WithModule(storedIndex)
} else IntrinsicType.Simple
} else {
codegen.markLineNumber(expression)
IntrinsicType.Simple
}
SerializationJvmIrIntrinsicSupport(codegen.context).generateSerializerForType(
argument,
mv,
@@ -124,8 +133,14 @@ class SerializationJvmIrIntrinsicSupport(val jvmBackendContext: JvmBackendContex
return module.findClassAcrossModuleDependencies(classId)?.let { jvmBackendContext.referenceClass(it) }
}
private val currentVersion = VersionReader.getVersionsForCurrentModuleFromTrace(module, jvmBackendContext.state.bindingTrace)
?.implementationVersion
override val runtimeHasEnumSerializerFactoryFunctions: Boolean
get() = false // TODO
get() = currentVersion != null && currentVersion > ApiVersion.parse("1.4.0")!!
private val hasNewContextSerializerSignature: Boolean
get() = currentVersion != null && currentVersion >= ApiVersion.parse("1.2.0")!!
private fun findTypeSerializerOrContext(argType: IrType): IrClassSymbol? =
emptyGenerator.findTypeSerializerOrContextUnchecked(this, argType)
@@ -243,8 +258,8 @@ class SerializationJvmIrIntrinsicSupport(val jvmBackendContext: JvmBackendContex
) { genericArg ->
assert(putReifyMarkerIfNeeded(genericArg, intrinsicType))
}
if (type.isMarkedNullable()) adapter.wrapStackValueIntoNullableSerializer()
}
if (type.isMarkedNullable()) adapter.wrapStackValueIntoNullableSerializer()
}
}
@@ -405,7 +420,7 @@ class SerializationJvmIrIntrinsicSupport(val jvmBackendContext: JvmBackendContex
aconst(typeMapper.mapTypeCommon(kType, TypeMappingMode.GENERIC_ARGUMENT))
AsmUtil.wrapJavaClassIntoKClass(this)
signature.append(AsmTypes.K_CLASS_TYPE.descriptor)
if (serializer.owner.classId == contextSerializerId && serializer.constructors.any { it.owner.valueParameters.size == 3 }) { // TODO: this isn't working with LAZY IR CLASS
if (serializer.owner.classId == contextSerializerId && hasNewContextSerializerSignature) {
// append new additional arguments
val fallbackDefaultSerializer = findTypeSerializer(this@SerializationJvmIrIntrinsicSupport, kType)
if (fallbackDefaultSerializer != null && fallbackDefaultSerializer != serializer) {
@@ -74,19 +74,19 @@ public final class IntrinsicsKt : java/lang/Object {
public final static kotlinx.serialization.KSerializer listSer()
public final static void test() {
LABEL (L0)
LINENUMBER (28)
GETSTATIC (Simple, Companion, LSimple$Companion;)
INVOKEVIRTUAL (Simple$Companion, serializer, ()Lkotlinx/serialization/KSerializer;)
POP
LABEL (L0)
LABEL (L1)
LINENUMBER (29)
ICONST_0
ISTORE (0)
LABEL (L1)
LABEL (L2)
LINENUMBER (47)
GETSTATIC (Simple, Companion, LSimple$Companion;)
INVOKEVIRTUAL (Simple$Companion, serializer, ()Lkotlinx/serialization/KSerializer;)
LABEL (L2)
LINENUMBER (45)
NOP
LABEL (L3)
POP
LABEL (L4)
@@ -94,44 +94,40 @@ public final class IntrinsicsKt : java/lang/Object {
ICONST_0
ISTORE (0)
LABEL (L5)
LINENUMBER (48)
GETSTATIC (Box, Companion, LBox$Companion;)
GETSTATIC (Simple, Companion, LSimple$Companion;)
INVOKEVIRTUAL (Simple$Companion, serializer, ()Lkotlinx/serialization/KSerializer;)
INVOKEVIRTUAL (Box$Companion, serializer, (Lkotlinx/serialization/KSerializer;)Lkotlinx/serialization/KSerializer;)
LABEL (L6)
LINENUMBER (46)
NOP
LABEL (L7)
POP
LABEL (L8)
LABEL (L7)
LINENUMBER (31)
ICONST_0
ISTORE (0)
LABEL (L9)
LABEL (L8)
LINENUMBER (49)
GETSTATIC (Box, Companion, LBox$Companion;)
GETSTATIC (Simple, Companion, LSimple$Companion;)
INVOKEVIRTUAL (Simple$Companion, serializer, ()Lkotlinx/serialization/KSerializer;)
INVOKEVIRTUAL (Box$Companion, serializer, (Lkotlinx/serialization/KSerializer;)Lkotlinx/serialization/KSerializer;)
LABEL (L10)
LINENUMBER (47)
NOP
LABEL (L11)
LABEL (L9)
POP
LABEL (L12)
LABEL (L10)
LINENUMBER (32)
ICONST_0
ISTORE (0)
LABEL (L13)
LABEL (L11)
LINENUMBER (50)
NEW (kotlinx/serialization/internal/ArrayListSerializer)
DUP
GETSTATIC (Simple, Companion, LSimple$Companion;)
INVOKEVIRTUAL (Simple$Companion, serializer, ()Lkotlinx/serialization/KSerializer;)
INVOKESPECIAL (kotlinx/serialization/internal/ArrayListSerializer, <init>, (Lkotlinx/serialization/KSerializer;)V)
LABEL (L14)
LINENUMBER (48)
NOP
LABEL (L15)
LABEL (L12)
POP
LABEL (L13)
LINENUMBER (34)
GETSTATIC (Box, Companion, LBox$Companion;)
NEW (kotlinx/serialization/internal/ArrayListSerializer)
DUP
@@ -139,11 +135,12 @@ public final class IntrinsicsKt : java/lang/Object {
INVOKESPECIAL (kotlinx/serialization/internal/ArrayListSerializer, <init>, (Lkotlinx/serialization/KSerializer;)V)
INVOKEVIRTUAL (Box$Companion, serializer, (Lkotlinx/serialization/KSerializer;)Lkotlinx/serialization/KSerializer;)
POP
LABEL (L16)
LABEL (L14)
LINENUMBER (36)
ICONST_0
ISTORE (0)
LABEL (L17)
LABEL (L15)
LINENUMBER (51)
NEW (kotlinx/serialization/internal/ArrayListSerializer)
DUP
GETSTATIC (Box, Companion, LBox$Companion;)
@@ -153,21 +150,23 @@ public final class IntrinsicsKt : java/lang/Object {
INVOKESPECIAL (kotlinx/serialization/internal/ArrayListSerializer, <init>, (Lkotlinx/serialization/KSerializer;)V)
INVOKEVIRTUAL (Box$Companion, serializer, (Lkotlinx/serialization/KSerializer;)Lkotlinx/serialization/KSerializer;)
INVOKESPECIAL (kotlinx/serialization/internal/ArrayListSerializer, <init>, (Lkotlinx/serialization/KSerializer;)V)
LABEL (L18)
LINENUMBER (49)
NOP
LABEL (L19)
LABEL (L16)
POP
LABEL (L17)
LINENUMBER (38)
GETSTATIC (kotlinx/serialization/internal/IntSerializer, INSTANCE, Lkotlinx/serialization/internal/IntSerializer;)
POP
LABEL (L18)
LINENUMBER (40)
GETSTATIC (SerializableObject, INSTANCE, LSerializableObject;)
INVOKEVIRTUAL (SerializableObject, serializer, ()Lkotlinx/serialization/KSerializer;)
POP
LABEL (L20)
LABEL (L19)
LINENUMBER (42)
ICONST_0
ISTORE (0)
LABEL (L21)
LABEL (L20)
LINENUMBER (52)
NEW (kotlinx/serialization/internal/ArrayListSerializer)
DUP
NEW (kotlinx/serialization/internal/ArrayListSerializer)
@@ -178,13 +177,16 @@ public final class IntrinsicsKt : java/lang/Object {
INVOKESPECIAL (Box$$serializer, <init>, (Lkotlinx/serialization/KSerializer;)V)
INVOKESPECIAL (kotlinx/serialization/internal/ArrayListSerializer, <init>, (Lkotlinx/serialization/KSerializer;)V)
INVOKESPECIAL (kotlinx/serialization/internal/ArrayListSerializer, <init>, (Lkotlinx/serialization/KSerializer;)V)
LABEL (L22)
LINENUMBER (50)
NOP
LABEL (L23)
LABEL (L21)
POP
LABEL (L24)
LINENUMBER (43)
LABEL (L22)
LINENUMBER (44)
GETSTATIC (Simple, Companion, LSimple$Companion;)
INVOKEVIRTUAL (Simple$Companion, serializer, ()Lkotlinx/serialization/KSerializer;)
INVOKESTATIC (kotlinx/serialization/builtins/BuiltinSerializersKt, getNullable, (Lkotlinx/serialization/KSerializer;)Lkotlinx/serialization/KSerializer;)
POP
LABEL (L23)
LINENUMBER (45)
RETURN
}
}
@@ -76,55 +76,55 @@ public final class IntrinsicsKt : java/lang/Object {
LDC (LSimple;)
INVOKESTATIC (kotlin/jvm/internal/Reflection, typeOf, (Ljava/lang/Class;)Lkotlin/reflect/KType;)
LABEL (L2)
LINENUMBER (51)
LINENUMBER (53)
INVOKESTATIC (kotlinx/serialization/SerializersKt, serializer, (Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer;)
ASTORE (1)
LABEL (L3)
ICONST_0
ISTORE (2)
LABEL (L4)
LINENUMBER (52)
LINENUMBER (54)
ALOAD (1)
LDC (null cannot be cast to non-null type kotlinx.serialization.KSerializer<T of kotlinx.serialization.internal.Platform_commonKt.cast>)
INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNull, (Ljava/lang/Object;Ljava/lang/String;)V)
LABEL (L5)
LINENUMBER (51)
LINENUMBER (53)
NOP
LABEL (L6)
LINENUMBER (29)
ICONST_0
ISTORE (0)
LABEL (L7)
LINENUMBER (53)
LINENUMBER (55)
ICONST_0
ISTORE (1)
LABEL (L8)
LDC (LSimple;)
INVOKESTATIC (kotlin/jvm/internal/Reflection, typeOf, (Ljava/lang/Class;)Lkotlin/reflect/KType;)
LABEL (L9)
LINENUMBER (54)
LINENUMBER (56)
INVOKESTATIC (kotlinx/serialization/SerializersKt, serializer, (Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer;)
ASTORE (2)
LABEL (L10)
ICONST_0
ISTORE (3)
LABEL (L11)
LINENUMBER (55)
LINENUMBER (57)
ALOAD (2)
LDC (null cannot be cast to non-null type kotlinx.serialization.KSerializer<T of kotlinx.serialization.internal.Platform_commonKt.cast>)
INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNull, (Ljava/lang/Object;Ljava/lang/String;)V)
LABEL (L12)
LINENUMBER (54)
LINENUMBER (56)
NOP
LABEL (L13)
LINENUMBER (53)
LINENUMBER (55)
NOP
LABEL (L14)
LINENUMBER (30)
ICONST_0
ISTORE (0)
LABEL (L15)
LINENUMBER (56)
LINENUMBER (58)
ICONST_0
ISTORE (1)
LABEL (L16)
@@ -135,29 +135,29 @@ public final class IntrinsicsKt : java/lang/Object {
INVOKEVIRTUAL (kotlin/reflect/KTypeProjection$Companion, invariant, (Lkotlin/reflect/KType;)Lkotlin/reflect/KTypeProjection;)
INVOKESTATIC (kotlin/jvm/internal/Reflection, typeOf, (Ljava/lang/Class;Lkotlin/reflect/KTypeProjection;)Lkotlin/reflect/KType;)
LABEL (L17)
LINENUMBER (57)
LINENUMBER (59)
INVOKESTATIC (kotlinx/serialization/SerializersKt, serializer, (Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer;)
ASTORE (2)
LABEL (L18)
ICONST_0
ISTORE (3)
LABEL (L19)
LINENUMBER (58)
LINENUMBER (60)
ALOAD (2)
LDC (null cannot be cast to non-null type kotlinx.serialization.KSerializer<T of kotlinx.serialization.internal.Platform_commonKt.cast>)
INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNull, (Ljava/lang/Object;Ljava/lang/String;)V)
LABEL (L20)
LINENUMBER (57)
LINENUMBER (59)
NOP
LABEL (L21)
LINENUMBER (56)
LINENUMBER (58)
NOP
LABEL (L22)
LINENUMBER (31)
ICONST_0
ISTORE (0)
LABEL (L23)
LINENUMBER (59)
LINENUMBER (61)
ICONST_0
ISTORE (1)
LABEL (L24)
@@ -168,29 +168,29 @@ public final class IntrinsicsKt : java/lang/Object {
INVOKEVIRTUAL (kotlin/reflect/KTypeProjection$Companion, invariant, (Lkotlin/reflect/KType;)Lkotlin/reflect/KTypeProjection;)
INVOKESTATIC (kotlin/jvm/internal/Reflection, typeOf, (Ljava/lang/Class;Lkotlin/reflect/KTypeProjection;)Lkotlin/reflect/KType;)
LABEL (L25)
LINENUMBER (60)
LINENUMBER (62)
INVOKESTATIC (kotlinx/serialization/SerializersKt, serializer, (Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer;)
ASTORE (2)
LABEL (L26)
ICONST_0
ISTORE (3)
LABEL (L27)
LINENUMBER (61)
LINENUMBER (63)
ALOAD (2)
LDC (null cannot be cast to non-null type kotlinx.serialization.KSerializer<T of kotlinx.serialization.internal.Platform_commonKt.cast>)
INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNull, (Ljava/lang/Object;Ljava/lang/String;)V)
LABEL (L28)
LINENUMBER (60)
LINENUMBER (62)
NOP
LABEL (L29)
LINENUMBER (59)
LINENUMBER (61)
NOP
LABEL (L30)
LINENUMBER (32)
ICONST_0
ISTORE (0)
LABEL (L31)
LINENUMBER (62)
LINENUMBER (64)
ICONST_0
ISTORE (1)
LABEL (L32)
@@ -201,22 +201,22 @@ public final class IntrinsicsKt : java/lang/Object {
INVOKEVIRTUAL (kotlin/reflect/KTypeProjection$Companion, invariant, (Lkotlin/reflect/KType;)Lkotlin/reflect/KTypeProjection;)
INVOKESTATIC (kotlin/jvm/internal/Reflection, typeOf, (Ljava/lang/Class;Lkotlin/reflect/KTypeProjection;)Lkotlin/reflect/KType;)
LABEL (L33)
LINENUMBER (63)
LINENUMBER (65)
INVOKESTATIC (kotlinx/serialization/SerializersKt, serializer, (Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer;)
ASTORE (2)
LABEL (L34)
ICONST_0
ISTORE (3)
LABEL (L35)
LINENUMBER (64)
LINENUMBER (66)
ALOAD (2)
LDC (null cannot be cast to non-null type kotlinx.serialization.KSerializer<T of kotlinx.serialization.internal.Platform_commonKt.cast>)
INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNull, (Ljava/lang/Object;Ljava/lang/String;)V)
LABEL (L36)
LINENUMBER (63)
LINENUMBER (65)
NOP
LABEL (L37)
LINENUMBER (62)
LINENUMBER (64)
NOP
LABEL (L38)
LINENUMBER (34)
@@ -234,26 +234,26 @@ public final class IntrinsicsKt : java/lang/Object {
INVOKEVIRTUAL (kotlin/reflect/KTypeProjection$Companion, invariant, (Lkotlin/reflect/KType;)Lkotlin/reflect/KTypeProjection;)
INVOKESTATIC (kotlin/jvm/internal/Reflection, typeOf, (Ljava/lang/Class;Lkotlin/reflect/KTypeProjection;)Lkotlin/reflect/KType;)
LABEL (L40)
LINENUMBER (65)
LINENUMBER (67)
INVOKESTATIC (kotlinx/serialization/SerializersKt, serializer, (Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer;)
ASTORE (1)
LABEL (L41)
ICONST_0
ISTORE (2)
LABEL (L42)
LINENUMBER (66)
LINENUMBER (68)
ALOAD (1)
LDC (null cannot be cast to non-null type kotlinx.serialization.KSerializer<T of kotlinx.serialization.internal.Platform_commonKt.cast>)
INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNull, (Ljava/lang/Object;Ljava/lang/String;)V)
LABEL (L43)
LINENUMBER (65)
LINENUMBER (67)
NOP
LABEL (L44)
LINENUMBER (36)
ICONST_0
ISTORE (0)
LABEL (L45)
LINENUMBER (67)
LINENUMBER (69)
ICONST_0
ISTORE (1)
LABEL (L46)
@@ -272,22 +272,22 @@ public final class IntrinsicsKt : java/lang/Object {
INVOKEVIRTUAL (kotlin/reflect/KTypeProjection$Companion, invariant, (Lkotlin/reflect/KType;)Lkotlin/reflect/KTypeProjection;)
INVOKESTATIC (kotlin/jvm/internal/Reflection, typeOf, (Ljava/lang/Class;Lkotlin/reflect/KTypeProjection;)Lkotlin/reflect/KType;)
LABEL (L47)
LINENUMBER (68)
LINENUMBER (70)
INVOKESTATIC (kotlinx/serialization/SerializersKt, serializer, (Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer;)
ASTORE (2)
LABEL (L48)
ICONST_0
ISTORE (3)
LABEL (L49)
LINENUMBER (69)
LINENUMBER (71)
ALOAD (2)
LDC (null cannot be cast to non-null type kotlinx.serialization.KSerializer<T of kotlinx.serialization.internal.Platform_commonKt.cast>)
INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNull, (Ljava/lang/Object;Ljava/lang/String;)V)
LABEL (L50)
LINENUMBER (68)
LINENUMBER (70)
NOP
LABEL (L51)
LINENUMBER (67)
LINENUMBER (69)
NOP
LABEL (L52)
LINENUMBER (38)
@@ -297,19 +297,19 @@ public final class IntrinsicsKt : java/lang/Object {
GETSTATIC (java/lang/Integer, TYPE, Ljava/lang/Class;)
INVOKESTATIC (kotlin/jvm/internal/Reflection, typeOf, (Ljava/lang/Class;)Lkotlin/reflect/KType;)
LABEL (L54)
LINENUMBER (70)
LINENUMBER (72)
INVOKESTATIC (kotlinx/serialization/SerializersKt, serializer, (Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer;)
ASTORE (1)
LABEL (L55)
ICONST_0
ISTORE (2)
LABEL (L56)
LINENUMBER (71)
LINENUMBER (73)
ALOAD (1)
LDC (null cannot be cast to non-null type kotlinx.serialization.KSerializer<T of kotlinx.serialization.internal.Platform_commonKt.cast>)
INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNull, (Ljava/lang/Object;Ljava/lang/String;)V)
LABEL (L57)
LINENUMBER (70)
LINENUMBER (72)
NOP
LABEL (L58)
LINENUMBER (40)
@@ -319,26 +319,26 @@ public final class IntrinsicsKt : java/lang/Object {
LDC (LSerializableObject;)
INVOKESTATIC (kotlin/jvm/internal/Reflection, typeOf, (Ljava/lang/Class;)Lkotlin/reflect/KType;)
LABEL (L60)
LINENUMBER (72)
LINENUMBER (74)
INVOKESTATIC (kotlinx/serialization/SerializersKt, serializer, (Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer;)
ASTORE (1)
LABEL (L61)
ICONST_0
ISTORE (2)
LABEL (L62)
LINENUMBER (73)
LINENUMBER (75)
ALOAD (1)
LDC (null cannot be cast to non-null type kotlinx.serialization.KSerializer<T of kotlinx.serialization.internal.Platform_commonKt.cast>)
INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNull, (Ljava/lang/Object;Ljava/lang/String;)V)
LABEL (L63)
LINENUMBER (72)
LINENUMBER (74)
NOP
LABEL (L64)
LINENUMBER (42)
ICONST_0
ISTORE (0)
LABEL (L65)
LINENUMBER (74)
LINENUMBER (76)
ICONST_0
ISTORE (1)
LABEL (L66)
@@ -357,25 +357,47 @@ public final class IntrinsicsKt : java/lang/Object {
INVOKEVIRTUAL (kotlin/reflect/KTypeProjection$Companion, invariant, (Lkotlin/reflect/KType;)Lkotlin/reflect/KTypeProjection;)
INVOKESTATIC (kotlin/jvm/internal/Reflection, typeOf, (Ljava/lang/Class;Lkotlin/reflect/KTypeProjection;)Lkotlin/reflect/KType;)
LABEL (L67)
LINENUMBER (75)
LINENUMBER (77)
INVOKESTATIC (kotlinx/serialization/SerializersKt, serializer, (Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer;)
ASTORE (2)
LABEL (L68)
ICONST_0
ISTORE (3)
LABEL (L69)
LINENUMBER (76)
LINENUMBER (78)
ALOAD (2)
LDC (null cannot be cast to non-null type kotlinx.serialization.KSerializer<T of kotlinx.serialization.internal.Platform_commonKt.cast>)
INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNull, (Ljava/lang/Object;Ljava/lang/String;)V)
LABEL (L70)
LINENUMBER (75)
LINENUMBER (77)
NOP
LABEL (L71)
LINENUMBER (74)
LINENUMBER (76)
NOP
LABEL (L72)
LINENUMBER (43)
LINENUMBER (44)
ICONST_0
ISTORE (0)
LABEL (L73)
LDC (LSimple;)
INVOKESTATIC (kotlin/jvm/internal/Reflection, nullableTypeOf, (Ljava/lang/Class;)Lkotlin/reflect/KType;)
LABEL (L74)
LINENUMBER (79)
INVOKESTATIC (kotlinx/serialization/SerializersKt, serializer, (Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer;)
ASTORE (1)
LABEL (L75)
ICONST_0
ISTORE (2)
LABEL (L76)
LINENUMBER (80)
ALOAD (1)
LDC (null cannot be cast to non-null type kotlinx.serialization.KSerializer<T of kotlinx.serialization.internal.Platform_commonKt.cast>)
INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNull, (Ljava/lang/Object;Ljava/lang/String;)V)
LABEL (L77)
LINENUMBER (79)
NOP
LABEL (L78)
LINENUMBER (45)
RETURN
}
}
@@ -40,4 +40,6 @@ fun test() {
serializer<SerializableObject>()
listSer<List<Box<Int>>>()
serializer<Simple?>()
}