diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt index b1c728d1c2b..d5499459b90 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt @@ -1053,6 +1053,13 @@ interface IrBuilderExtension { typeArgs = listOf(typeArgs[0].makeNotNull()) + typeArgs } + // If KType is interface, .classSerializer always yields PolymorphicSerializer, which may be unavailable for interfaces from other modules + if (!kType.isInterface() && serializerClassOriginal == kType.toClassDescriptor?.classSerializer && enclosingGenerator !is SerializableCompanionIrGenerator) { + // This is default type serializer, we can shortcut through Companion.serializer() + // BUT not during generation of this method itself + callSerializerFromCompanion(thisIrType, typeArgs, args)?.let { return it } + } + val serializable = getSerializableClassDescriptorBySerializer(serializerClass) val ctor = if (serializable?.declaredTypeParameters?.isNotEmpty() == true) { @@ -1085,6 +1092,27 @@ interface IrBuilderExtension { return irInvoke(null, ctor, typeArguments = typeArgs, valueArguments = args, returnTypeHint = substitutedReturnType) } + fun IrBuilderWithScope.callSerializerFromCompanion( + thisIrType: IrType, + typeArgs: List, + args: List + ): IrExpression? { + val baseClass = thisIrType.getClass() ?: return null + val companionClass = baseClass.companionObject() ?: return null + val serializerProviderFunction = companionClass.declarations.singleOrNull { + it is IrFunction && it.name == SerialEntityNames.SERIALIZER_PROVIDER_NAME && it.valueParameters.size == baseClass.typeParameters.size + } ?: return null + with(serializerProviderFunction as IrFunction) { + // Note that [args] and [typeArgs] may be unused if we short-cut to e.g. SealedClassSerializer + return irInvoke( + irGetObject(companionClass), + symbol, + typeArgs.takeIf { it.size == typeParameters.size }.orEmpty(), + args.takeIf { it.size == valueParameters.size }.orEmpty() + ) + } + } + private fun IrConstructor.lastArgumentIsAnnotationArray(): Boolean { val lastArgType = valueParameters.lastOrNull()?.type return (lastArgType != null && (lastArgType as? IrSimpleType)?.arguments?.firstOrNull()?.typeOrNull?.classFqName?.toString() == "kotlin.Annotation") diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/test/org/jetbrains/kotlinx/serialization/SerializationIrBytecodeListingTestGenerated.java b/plugins/kotlin-serialization/kotlin-serialization-compiler/test/org/jetbrains/kotlinx/serialization/SerializationIrBytecodeListingTestGenerated.java index 296fbecf204..984902f504d 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/test/org/jetbrains/kotlinx/serialization/SerializationIrBytecodeListingTestGenerated.java +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/test/org/jetbrains/kotlinx/serialization/SerializationIrBytecodeListingTestGenerated.java @@ -33,4 +33,9 @@ public class SerializationIrBytecodeListingTestGenerated extends AbstractSeriali public void testBasic() throws Exception { runTest("plugins/kotlin-serialization/kotlin-serialization-compiler/testData/codegen/Basic.kt"); } + + @TestMetadata("Sealed.kt") + public void testSealed() throws Exception { + runTest("plugins/kotlin-serialization/kotlin-serialization-compiler/testData/codegen/Sealed.kt"); + } } diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/test/org/jetbrains/kotlinx/serialization/SerializationPluginBytecodeListingTestGenerated.java b/plugins/kotlin-serialization/kotlin-serialization-compiler/test/org/jetbrains/kotlinx/serialization/SerializationPluginBytecodeListingTestGenerated.java index 43aceead965..1defccadf12 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/test/org/jetbrains/kotlinx/serialization/SerializationPluginBytecodeListingTestGenerated.java +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/test/org/jetbrains/kotlinx/serialization/SerializationPluginBytecodeListingTestGenerated.java @@ -33,4 +33,9 @@ public class SerializationPluginBytecodeListingTestGenerated extends AbstractSer public void testBasic() throws Exception { runTest("plugins/kotlin-serialization/kotlin-serialization-compiler/testData/codegen/Basic.kt"); } + + @TestMetadata("Sealed.kt") + public void testSealed() throws Exception { + runTest("plugins/kotlin-serialization/kotlin-serialization-compiler/testData/codegen/Sealed.kt"); + } } diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/testData/codegen/Sealed.ir.txt b/plugins/kotlin-serialization/kotlin-serialization-compiler/testData/codegen/Sealed.ir.txt new file mode 100644 index 00000000000..8357841871f --- /dev/null +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/testData/codegen/Sealed.ir.txt @@ -0,0 +1,799 @@ +public final class Container$$serializer : java/lang/Object, kotlinx/serialization/internal/GeneratedSerializer { + public final static Container$$serializer INSTANCE + + public final static kotlinx.serialization.descriptors.SerialDescriptor descriptor + + static void () { + NEW + DUP + INVOKESPECIAL (Container$$serializer, , ()V) + PUTSTATIC (INSTANCE, LContainer$$serializer;) + LABEL (L0) + LINENUMBER (12) + NEW + DUP + LDC (Container) + GETSTATIC (INSTANCE, LContainer$$serializer;) + CHECKCAST + ICONST_1 + INVOKESPECIAL (kotlinx/serialization/internal/PluginGeneratedSerialDescriptor, , (Ljava/lang/String;Lkotlinx/serialization/internal/GeneratedSerializer;I)V) + ASTORE (0) + ALOAD (0) + LDC (r) + ICONST_0 + INVOKEVIRTUAL (kotlinx/serialization/internal/PluginGeneratedSerialDescriptor, addElement, (Ljava/lang/String;Z)V) + ALOAD (0) + CHECKCAST + PUTSTATIC (descriptor, Lkotlinx/serialization/descriptors/SerialDescriptor;) + LABEL (L1) + LINENUMBER (13) + RETURN + } + + private void () { + LABEL (L0) + LINENUMBER (12) + ALOAD (0) + INVOKESPECIAL (java/lang/Object, , ()V) + RETURN + LABEL (L1) + } + + public kotlinx.serialization.KSerializer[] childSerializers() { + LABEL (L0) + LINENUMBER (12) + ICONST_1 + ANEWARRAY + ASTORE (1) + ALOAD (1) + ICONST_0 + GETSTATIC (Companion, LResult$Companion;) + INVOKEVIRTUAL (Result$Companion, serializer, ()Lkotlinx/serialization/KSerializer;) + AASTORE + ALOAD (1) + ARETURN + LABEL (L1) + } + + public Container deserialize(kotlinx.serialization.encoding.Decoder decoder) { + LABEL (L0) + ALOAD (1) + LDC (decoder) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + LABEL (L1) + LINENUMBER (12) + ALOAD (0) + INVOKEVIRTUAL (Container$$serializer, getDescriptor, ()Lkotlinx/serialization/descriptors/SerialDescriptor;) + ASTORE (2) + ICONST_1 + ISTORE (3) + ICONST_0 + ISTORE (4) + ICONST_0 + ISTORE (5) + ACONST_NULL + ASTORE (6) + ALOAD (1) + ALOAD (2) + INVOKEINTERFACE (kotlinx/serialization/encoding/Decoder, beginStructure, (Lkotlinx/serialization/descriptors/SerialDescriptor;)Lkotlinx/serialization/encoding/CompositeDecoder;) + ASTORE (7) + ALOAD (7) + INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeSequentially, ()Z) + IFEQ (L2) + ALOAD (7) + ALOAD (2) + ICONST_0 + GETSTATIC (Companion, LResult$Companion;) + INVOKEVIRTUAL (Result$Companion, serializer, ()Lkotlinx/serialization/KSerializer;) + CHECKCAST + ALOAD (6) + INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeSerializableElement, (Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/DeserializationStrategy;Ljava/lang/Object;)Ljava/lang/Object;) + ASTORE (6) + ILOAD (5) + ICONST_1 + IOR + ISTORE (5) + GOTO (L3) + LABEL (L2) + ILOAD (3) + IFEQ (L3) + ALOAD (7) + ALOAD (2) + INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeElementIndex, (Lkotlinx/serialization/descriptors/SerialDescriptor;)I) + ISTORE (4) + ILOAD (4) + TABLESWITCH + LABEL (L4) + ICONST_0 + ISTORE (3) + GOTO (L2) + LABEL (L5) + ALOAD (7) + ALOAD (2) + ICONST_0 + GETSTATIC (Companion, LResult$Companion;) + INVOKEVIRTUAL (Result$Companion, serializer, ()Lkotlinx/serialization/KSerializer;) + CHECKCAST + ALOAD (6) + INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeSerializableElement, (Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/DeserializationStrategy;Ljava/lang/Object;)Ljava/lang/Object;) + ASTORE (6) + ILOAD (5) + ICONST_1 + IOR + ISTORE (5) + GOTO (L2) + LABEL (L6) + NEW + DUP + ILOAD (4) + INVOKESPECIAL (kotlinx/serialization/UnknownFieldException, , (I)V) + ATHROW + LABEL (L3) + ALOAD (7) + ALOAD (2) + INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, endStructure, (Lkotlinx/serialization/descriptors/SerialDescriptor;)V) + NEW + DUP + ILOAD (5) + ALOAD (6) + CHECKCAST + ACONST_NULL + INVOKESPECIAL (Container, , (ILResult;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V) + ARETURN + LABEL (L7) + } + + public java.lang.Object deserialize(kotlinx.serialization.encoding.Decoder decoder) { + LABEL (L0) + LINENUMBER (12) + ALOAD (0) + ALOAD (1) + INVOKEVIRTUAL (Container$$serializer, deserialize, (Lkotlinx/serialization/encoding/Decoder;)LContainer;) + ARETURN + LABEL (L1) + } + + public kotlinx.serialization.descriptors.SerialDescriptor getDescriptor() + + public void serialize(kotlinx.serialization.encoding.Encoder encoder, Container value) + + public void serialize(kotlinx.serialization.encoding.Encoder encoder, java.lang.Object value) + + public kotlinx.serialization.KSerializer[] typeParametersSerializers() +} + +public final class Container$Companion : java/lang/Object { + private void () { + LABEL (L0) + LINENUMBER (12) + ALOAD (0) + INVOKESPECIAL (java/lang/Object, , ()V) + RETURN + LABEL (L1) + } + + public void (kotlin.jvm.internal.DefaultConstructorMarker $constructor_marker) { + LABEL (L0) + ALOAD (0) + INVOKESPECIAL (Container$Companion, , ()V) + RETURN + LABEL (L1) + } + + public final kotlinx.serialization.KSerializer serializer() { + LABEL (L0) + LINENUMBER (12) + GETSTATIC (INSTANCE, LContainer$$serializer;) + CHECKCAST + ARETURN + LABEL (L1) + } +} + +public final class Container : java/lang/Object { + public final static Container$Companion Companion + + private final Result r + + static void () { + NEW + DUP + ACONST_NULL + INVOKESPECIAL (Container$Companion, , (Lkotlin/jvm/internal/DefaultConstructorMarker;)V) + PUTSTATIC (Companion, LContainer$Companion;) + RETURN + } + + public void (Result r) { + LABEL (L0) + ALOAD (1) + LDC (r) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + LABEL (L1) + LINENUMBER (12) + ALOAD (0) + INVOKESPECIAL (java/lang/Object, , ()V) + LABEL (L2) + LINENUMBER (13) + ALOAD (0) + ALOAD (1) + PUTFIELD (r, LResult;) + RETURN + LABEL (L3) + } + + public void (int seen1, Result r, kotlinx.serialization.internal.SerializationConstructorMarker serializationConstructorMarker) { + LABEL (L0) + LINENUMBER (12) + ICONST_1 + ICONST_1 + ILOAD (1) + IAND + IF_ICMPEQ (L1) + ILOAD (1) + ICONST_1 + GETSTATIC (INSTANCE, LContainer$$serializer;) + INVOKEVIRTUAL (Container$$serializer, getDescriptor, ()Lkotlinx/serialization/descriptors/SerialDescriptor;) + INVOKESTATIC (kotlinx/serialization/internal/PluginExceptionsKt, throwMissingFieldException, (IILkotlinx/serialization/descriptors/SerialDescriptor;)V) + LABEL (L1) + ALOAD (0) + INVOKESPECIAL (java/lang/Object, , ()V) + ALOAD (0) + ALOAD (2) + PUTFIELD (r, LResult;) + RETURN + LABEL (L2) + } + + public final Result getR() + + public final static void write$Self(Container self, kotlinx.serialization.encoding.CompositeEncoder output, kotlinx.serialization.descriptors.SerialDescriptor serialDesc) { + LABEL (L0) + ALOAD (0) + LDC (self) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + ALOAD (1) + LDC (output) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + ALOAD (2) + LDC (serialDesc) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + LABEL (L1) + LINENUMBER (12) + ALOAD (1) + ALOAD (2) + ICONST_0 + GETSTATIC (Companion, LResult$Companion;) + INVOKEVIRTUAL (Result$Companion, serializer, ()Lkotlinx/serialization/KSerializer;) + CHECKCAST + ALOAD (0) + GETFIELD (r, LResult;) + INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeEncoder, encodeSerializableElement, (Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)V) + RETURN + LABEL (L2) + } +} + +final class Result$Companion$$cachedSerializer$delegate$2 : kotlin/jvm/internal/Lambda, kotlin/jvm/functions/Function0 { + public final static Result$Companion$$cachedSerializer$delegate$2 INSTANCE + + static void () { + NEW + DUP + INVOKESPECIAL (Result$Companion$$cachedSerializer$delegate$2, , ()V) + PUTSTATIC (INSTANCE, LResult$Companion$$cachedSerializer$delegate$2;) + RETURN + } + + void () { + LABEL (L0) + ALOAD (0) + ICONST_0 + INVOKESPECIAL (kotlin/jvm/internal/Lambda, , (I)V) + RETURN + LABEL (L1) + } + + public final kotlinx.serialization.KSerializer invoke() { + LABEL (L0) + LINENUMBER (6) + NEW + DUP + LDC (Result) + LDC (LResult;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, getOrCreateKotlinClass, (Ljava/lang/Class;)Lkotlin/reflect/KClass;) + ICONST_2 + ANEWARRAY + ASTORE (1) + ALOAD (1) + ICONST_0 + LDC (LResult$OK;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, getOrCreateKotlinClass, (Ljava/lang/Class;)Lkotlin/reflect/KClass;) + AASTORE + ALOAD (1) + ICONST_1 + LDC (LResult$Err;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, getOrCreateKotlinClass, (Ljava/lang/Class;)Lkotlin/reflect/KClass;) + AASTORE + ALOAD (1) + ICONST_2 + ANEWARRAY + ASTORE (1) + ALOAD (1) + ICONST_0 + GETSTATIC (INSTANCE, LResult$OK$$serializer;) + CHECKCAST + AASTORE + ALOAD (1) + ICONST_1 + NEW + DUP + LDC (Result.Err) + GETSTATIC (INSTANCE, LResult$Err;) + INVOKESPECIAL (kotlinx/serialization/internal/ObjectSerializer, , (Ljava/lang/String;Ljava/lang/Object;)V) + CHECKCAST + AASTORE + ALOAD (1) + INVOKESPECIAL (kotlinx/serialization/SealedClassSerializer, , (Ljava/lang/String;Lkotlin/reflect/KClass;[Lkotlin/reflect/KClass;[Lkotlinx/serialization/KSerializer;)V) + CHECKCAST + ARETURN + LABEL (L1) + } + + public java.lang.Object invoke() { + LABEL (L0) + LINENUMBER (6) + ALOAD (0) + INVOKEVIRTUAL (Result$Companion$$cachedSerializer$delegate$2, invoke, ()Lkotlinx/serialization/KSerializer;) + ARETURN + LABEL (L1) + } +} + +public final class Result$Companion : java/lang/Object { + private void () { + LABEL (L0) + LINENUMBER (6) + ALOAD (0) + INVOKESPECIAL (java/lang/Object, , ()V) + RETURN + LABEL (L1) + } + + public void (kotlin.jvm.internal.DefaultConstructorMarker $constructor_marker) { + LABEL (L0) + ALOAD (0) + INVOKESPECIAL (Result$Companion, , ()V) + RETURN + LABEL (L1) + } + + public final kotlinx.serialization.KSerializer serializer() { + LABEL (L0) + LINENUMBER (6) + INVOKESTATIC (Result, access$get$cachedSerializer$delegate$cp, ()Lkotlin/Lazy;) + INVOKEINTERFACE (kotlin/Lazy, getValue, ()Ljava/lang/Object;) + CHECKCAST + ARETURN + LABEL (L1) + } +} + +final class Result$Err$$cachedSerializer$delegate$2 : kotlin/jvm/internal/Lambda, kotlin/jvm/functions/Function0 { + public final static Result$Err$$cachedSerializer$delegate$2 INSTANCE + + static void () { + NEW + DUP + INVOKESPECIAL (Result$Err$$cachedSerializer$delegate$2, , ()V) + PUTSTATIC (INSTANCE, LResult$Err$$cachedSerializer$delegate$2;) + RETURN + } + + void () { + LABEL (L0) + ALOAD (0) + ICONST_0 + INVOKESPECIAL (kotlin/jvm/internal/Lambda, , (I)V) + RETURN + LABEL (L1) + } + + public final kotlinx.serialization.KSerializer invoke() { + LABEL (L0) + LINENUMBER (9) + NEW + DUP + LDC (Result.Err) + GETSTATIC (INSTANCE, LResult$Err;) + INVOKESPECIAL (kotlinx/serialization/internal/ObjectSerializer, , (Ljava/lang/String;Ljava/lang/Object;)V) + CHECKCAST + ARETURN + LABEL (L1) + } + + public java.lang.Object invoke() { + LABEL (L0) + LINENUMBER (9) + ALOAD (0) + INVOKEVIRTUAL (Result$Err$$cachedSerializer$delegate$2, invoke, ()Lkotlinx/serialization/KSerializer;) + ARETURN + LABEL (L1) + } +} + +public final class Result$Err : Result { + private final static kotlin.Lazy $cachedSerializer$delegate + + public final static Result$Err INSTANCE + + static void () { + NEW + DUP + INVOKESPECIAL (Result$Err, , ()V) + PUTSTATIC (INSTANCE, LResult$Err;) + LABEL (L0) + LINENUMBER (9) + GETSTATIC (PUBLICATION, Lkotlin/LazyThreadSafetyMode;) + GETSTATIC (INSTANCE, LResult$Err$$cachedSerializer$delegate$2;) + CHECKCAST + INVOKESTATIC (kotlin/LazyKt, lazy, (Lkotlin/LazyThreadSafetyMode;Lkotlin/jvm/functions/Function0;)Lkotlin/Lazy;) + PUTSTATIC ($cachedSerializer$delegate, Lkotlin/Lazy;) + RETURN + } + + private void () { + LABEL (L0) + LINENUMBER (9) + ALOAD (0) + ACONST_NULL + INVOKESPECIAL (Result, , (Lkotlin/jvm/internal/DefaultConstructorMarker;)V) + RETURN + LABEL (L1) + } + + public final kotlinx.serialization.KSerializer serializer() { + LABEL (L0) + LINENUMBER (9) + GETSTATIC ($cachedSerializer$delegate, Lkotlin/Lazy;) + INVOKEINTERFACE (kotlin/Lazy, getValue, ()Ljava/lang/Object;) + CHECKCAST + ARETURN + LABEL (L1) + } +} + +public final class Result$OK$$serializer : java/lang/Object, kotlinx/serialization/internal/GeneratedSerializer { + public final static Result$OK$$serializer INSTANCE + + public final static kotlinx.serialization.descriptors.SerialDescriptor descriptor + + static void () { + NEW + DUP + INVOKESPECIAL (Result$OK$$serializer, , ()V) + PUTSTATIC (INSTANCE, LResult$OK$$serializer;) + LABEL (L0) + LINENUMBER (8) + NEW + DUP + LDC (Result.OK) + GETSTATIC (INSTANCE, LResult$OK$$serializer;) + CHECKCAST + ICONST_1 + INVOKESPECIAL (kotlinx/serialization/internal/PluginGeneratedSerialDescriptor, , (Ljava/lang/String;Lkotlinx/serialization/internal/GeneratedSerializer;I)V) + ASTORE (0) + ALOAD (0) + LDC (s) + ICONST_0 + INVOKEVIRTUAL (kotlinx/serialization/internal/PluginGeneratedSerialDescriptor, addElement, (Ljava/lang/String;Z)V) + ALOAD (0) + CHECKCAST + PUTSTATIC (descriptor, Lkotlinx/serialization/descriptors/SerialDescriptor;) + RETURN + } + + private void () { + LABEL (L0) + LINENUMBER (8) + ALOAD (0) + INVOKESPECIAL (java/lang/Object, , ()V) + RETURN + LABEL (L1) + } + + public kotlinx.serialization.KSerializer[] childSerializers() { + LABEL (L0) + LINENUMBER (8) + ICONST_1 + ANEWARRAY + ASTORE (1) + ALOAD (1) + ICONST_0 + GETSTATIC (INSTANCE, Lkotlinx/serialization/internal/StringSerializer;) + CHECKCAST + AASTORE + ALOAD (1) + ARETURN + LABEL (L1) + } + + public Result$OK deserialize(kotlinx.serialization.encoding.Decoder decoder) { + LABEL (L0) + ALOAD (1) + LDC (decoder) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + LABEL (L1) + LINENUMBER (8) + ALOAD (0) + INVOKEVIRTUAL (Result$OK$$serializer, getDescriptor, ()Lkotlinx/serialization/descriptors/SerialDescriptor;) + ASTORE (2) + ICONST_1 + ISTORE (3) + ICONST_0 + ISTORE (4) + ICONST_0 + ISTORE (5) + ACONST_NULL + ASTORE (6) + ALOAD (1) + ALOAD (2) + INVOKEINTERFACE (kotlinx/serialization/encoding/Decoder, beginStructure, (Lkotlinx/serialization/descriptors/SerialDescriptor;)Lkotlinx/serialization/encoding/CompositeDecoder;) + ASTORE (7) + ALOAD (7) + INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeSequentially, ()Z) + IFEQ (L2) + ALOAD (7) + ALOAD (2) + ICONST_0 + INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeStringElement, (Lkotlinx/serialization/descriptors/SerialDescriptor;I)Ljava/lang/String;) + ASTORE (6) + ILOAD (5) + ICONST_1 + IOR + ISTORE (5) + GOTO (L3) + LABEL (L2) + ILOAD (3) + IFEQ (L3) + ALOAD (7) + ALOAD (2) + INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeElementIndex, (Lkotlinx/serialization/descriptors/SerialDescriptor;)I) + ISTORE (4) + ILOAD (4) + TABLESWITCH + LABEL (L4) + ICONST_0 + ISTORE (3) + GOTO (L2) + LABEL (L5) + ALOAD (7) + ALOAD (2) + ICONST_0 + INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeStringElement, (Lkotlinx/serialization/descriptors/SerialDescriptor;I)Ljava/lang/String;) + ASTORE (6) + ILOAD (5) + ICONST_1 + IOR + ISTORE (5) + GOTO (L2) + LABEL (L6) + NEW + DUP + ILOAD (4) + INVOKESPECIAL (kotlinx/serialization/UnknownFieldException, , (I)V) + ATHROW + LABEL (L3) + ALOAD (7) + ALOAD (2) + INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, endStructure, (Lkotlinx/serialization/descriptors/SerialDescriptor;)V) + NEW + DUP + ILOAD (5) + ALOAD (6) + ACONST_NULL + INVOKESPECIAL (Result$OK, , (ILjava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V) + ARETURN + LABEL (L7) + } + + public java.lang.Object deserialize(kotlinx.serialization.encoding.Decoder decoder) { + LABEL (L0) + LINENUMBER (8) + ALOAD (0) + ALOAD (1) + INVOKEVIRTUAL (Result$OK$$serializer, deserialize, (Lkotlinx/serialization/encoding/Decoder;)LResult$OK;) + ARETURN + LABEL (L1) + } + + public kotlinx.serialization.descriptors.SerialDescriptor getDescriptor() + + public void serialize(kotlinx.serialization.encoding.Encoder encoder, Result$OK value) + + public void serialize(kotlinx.serialization.encoding.Encoder encoder, java.lang.Object value) + + public kotlinx.serialization.KSerializer[] typeParametersSerializers() +} + +public final class Result$OK$Companion : java/lang/Object { + private void () { + LABEL (L0) + LINENUMBER (8) + ALOAD (0) + INVOKESPECIAL (java/lang/Object, , ()V) + RETURN + LABEL (L1) + } + + public void (kotlin.jvm.internal.DefaultConstructorMarker $constructor_marker) { + LABEL (L0) + ALOAD (0) + INVOKESPECIAL (Result$OK$Companion, , ()V) + RETURN + LABEL (L1) + } + + public final kotlinx.serialization.KSerializer serializer() { + LABEL (L0) + LINENUMBER (8) + GETSTATIC (INSTANCE, LResult$OK$$serializer;) + CHECKCAST + ARETURN + LABEL (L1) + } +} + +public final class Result$OK : Result { + public final static Result$OK$Companion Companion + + private final java.lang.String s + + static void () { + NEW + DUP + ACONST_NULL + INVOKESPECIAL (Result$OK$Companion, , (Lkotlin/jvm/internal/DefaultConstructorMarker;)V) + PUTSTATIC (Companion, LResult$OK$Companion;) + RETURN + } + + public void (java.lang.String s) { + LABEL (L0) + ALOAD (1) + LDC (s) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + LABEL (L1) + LINENUMBER (8) + ALOAD (0) + ACONST_NULL + INVOKESPECIAL (Result, , (Lkotlin/jvm/internal/DefaultConstructorMarker;)V) + ALOAD (0) + ALOAD (1) + PUTFIELD (s, Ljava/lang/String;) + RETURN + LABEL (L2) + } + + public void (int seen1, java.lang.String s, kotlinx.serialization.internal.SerializationConstructorMarker serializationConstructorMarker) { + LABEL (L0) + LINENUMBER (8) + ICONST_1 + ICONST_1 + ILOAD (1) + IAND + IF_ICMPEQ (L1) + ILOAD (1) + ICONST_1 + GETSTATIC (INSTANCE, LResult$OK$$serializer;) + INVOKEVIRTUAL (Result$OK$$serializer, getDescriptor, ()Lkotlinx/serialization/descriptors/SerialDescriptor;) + INVOKESTATIC (kotlinx/serialization/internal/PluginExceptionsKt, throwMissingFieldException, (IILkotlinx/serialization/descriptors/SerialDescriptor;)V) + LABEL (L1) + ALOAD (0) + ILOAD (1) + ALOAD (3) + INVOKESPECIAL (Result, , (ILkotlinx/serialization/internal/SerializationConstructorMarker;)V) + ALOAD (0) + ALOAD (2) + PUTFIELD (s, Ljava/lang/String;) + RETURN + LABEL (L2) + } + + public final java.lang.String getS() + + public final static void write$Self(Result$OK self, kotlinx.serialization.encoding.CompositeEncoder output, kotlinx.serialization.descriptors.SerialDescriptor serialDesc) { + LABEL (L0) + ALOAD (0) + LDC (self) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + ALOAD (1) + LDC (output) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + ALOAD (2) + LDC (serialDesc) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + LABEL (L1) + LINENUMBER (8) + ALOAD (0) + CHECKCAST + ALOAD (1) + ALOAD (2) + INVOKESTATIC (Result, write$Self, (LResult;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V) + ALOAD (1) + ALOAD (2) + ICONST_0 + ALOAD (0) + GETFIELD (s, Ljava/lang/String;) + INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeEncoder, encodeStringElement, (Lkotlinx/serialization/descriptors/SerialDescriptor;ILjava/lang/String;)V) + RETURN + LABEL (L2) + } +} + +public abstract class Result : java/lang/Object { + private final static kotlin.Lazy $cachedSerializer$delegate + + public final static Result$Companion Companion + + static void () { + NEW + DUP + ACONST_NULL + INVOKESPECIAL (Result$Companion, , (Lkotlin/jvm/internal/DefaultConstructorMarker;)V) + PUTSTATIC (Companion, LResult$Companion;) + LABEL (L0) + LINENUMBER (6) + GETSTATIC (PUBLICATION, Lkotlin/LazyThreadSafetyMode;) + GETSTATIC (INSTANCE, LResult$Companion$$cachedSerializer$delegate$2;) + CHECKCAST + INVOKESTATIC (kotlin/LazyKt, lazy, (Lkotlin/LazyThreadSafetyMode;Lkotlin/jvm/functions/Function0;)Lkotlin/Lazy;) + PUTSTATIC ($cachedSerializer$delegate, Lkotlin/Lazy;) + RETURN + } + + private void () { + LABEL (L0) + LINENUMBER (6) + ALOAD (0) + INVOKESPECIAL (java/lang/Object, , ()V) + LABEL (L1) + LINENUMBER (7) + RETURN + LABEL (L2) + } + + public void (int seen1, kotlinx.serialization.internal.SerializationConstructorMarker serializationConstructorMarker) { + LABEL (L0) + LINENUMBER (6) + ALOAD (0) + INVOKESPECIAL (java/lang/Object, , ()V) + RETURN + LABEL (L1) + } + + public void (kotlin.jvm.internal.DefaultConstructorMarker $constructor_marker) { + LABEL (L0) + ALOAD (0) + INVOKESPECIAL (Result, , ()V) + RETURN + LABEL (L1) + } + + public final static kotlin.Lazy access$get$cachedSerializer$delegate$cp() + + public final static void write$Self(Result self, kotlinx.serialization.encoding.CompositeEncoder output, kotlinx.serialization.descriptors.SerialDescriptor serialDesc) { + LABEL (L0) + ALOAD (0) + LDC (self) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + ALOAD (1) + LDC (output) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + ALOAD (2) + LDC (serialDesc) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + RETURN + LABEL (L1) + } +} diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/testData/codegen/Sealed.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/testData/codegen/Sealed.kt new file mode 100644 index 00000000000..cd6b5f96fad --- /dev/null +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/testData/codegen/Sealed.kt @@ -0,0 +1,14 @@ +// CURIOUS_ABOUT deserialize, write$Self, childSerializers, , , invoke, serializer +// WITH_RUNTIME + +import kotlinx.serialization.* + +// do not forget to update this test with custom serialinfo annotation when serialization 1.3.0 is released +@Serializable +sealed class Result { + @Serializable class OK(val s: String): Result() + @Serializable object Err: Result() +} + +@Serializable +class Container(val r: Result) \ No newline at end of file diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/testData/codegen/Sealed.txt b/plugins/kotlin-serialization/kotlin-serialization-compiler/testData/codegen/Sealed.txt new file mode 100644 index 00000000000..10c919ade27 --- /dev/null +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/testData/codegen/Sealed.txt @@ -0,0 +1,868 @@ +public final class Container$$serializer : java/lang/Object, kotlinx/serialization/internal/GeneratedSerializer { + private final static kotlinx.serialization.descriptors.SerialDescriptor $$serialDesc + + public final static Container$$serializer INSTANCE + + static void () { + LABEL (L0) + LINENUMBER (13) + NEW + DUP + INVOKESPECIAL (Container$$serializer, , ()V) + ASTORE (0) + ALOAD (0) + PUTSTATIC (INSTANCE, LContainer$$serializer;) + NEW + DUP + LDC (Container) + GETSTATIC (INSTANCE, LContainer$$serializer;) + CHECKCAST + LDC (1) + INVOKESPECIAL (kotlinx/serialization/internal/PluginGeneratedSerialDescriptor, , (Ljava/lang/String;Lkotlinx/serialization/internal/GeneratedSerializer;I)V) + ASTORE (0) + ALOAD (0) + LDC (r) + ICONST_0 + INVOKEVIRTUAL (kotlinx/serialization/internal/PluginGeneratedSerialDescriptor, addElement, (Ljava/lang/String;Z)V) + ALOAD (0) + PUTSTATIC ($$serialDesc, Lkotlinx/serialization/descriptors/SerialDescriptor;) + RETURN + } + + private void () { + LABEL (L0) + LINENUMBER (13) + ALOAD (0) + INVOKESPECIAL (java/lang/Object, , ()V) + RETURN + LABEL (L1) + } + + public kotlinx.serialization.KSerializer[] childSerializers() { + LABEL (L0) + ICONST_1 + ANEWARRAY + DUP + ICONST_0 + NEW + DUP + LDC (Result) + LDC (LResult;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, getOrCreateKotlinClass, (Ljava/lang/Class;)Lkotlin/reflect/KClass;) + ICONST_2 + ANEWARRAY + DUP + ICONST_0 + LDC (LResult$OK;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, getOrCreateKotlinClass, (Ljava/lang/Class;)Lkotlin/reflect/KClass;) + AASTORE + DUP + ICONST_1 + LDC (LResult$Err;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, getOrCreateKotlinClass, (Ljava/lang/Class;)Lkotlin/reflect/KClass;) + AASTORE + ICONST_2 + ANEWARRAY + DUP + ICONST_0 + GETSTATIC (INSTANCE, LResult$OK$$serializer;) + CHECKCAST + AASTORE + DUP + ICONST_1 + NEW + DUP + LDC (Result.Err) + GETSTATIC (INSTANCE, LResult$Err;) + INVOKESPECIAL (kotlinx/serialization/internal/ObjectSerializer, , (Ljava/lang/String;Ljava/lang/Object;)V) + AASTORE + INVOKESPECIAL (kotlinx/serialization/SealedClassSerializer, , (Ljava/lang/String;Lkotlin/reflect/KClass;[Lkotlin/reflect/KClass;[Lkotlinx/serialization/KSerializer;)V) + AASTORE + ARETURN + LABEL (L1) + } + + public Container deserialize(kotlinx.serialization.encoding.Decoder decoder) { + LABEL (L0) + ALOAD (1) + LDC (decoder) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + GETSTATIC ($$serialDesc, Lkotlinx/serialization/descriptors/SerialDescriptor;) + ASTORE (2) + ICONST_0 + ISTORE (4) + ACONST_NULL + ASTORE (5) + ALOAD (1) + ALOAD (2) + INVOKEINTERFACE (kotlinx/serialization/encoding/Decoder, beginStructure, (Lkotlinx/serialization/descriptors/SerialDescriptor;)Lkotlinx/serialization/encoding/CompositeDecoder;) + ASTORE (1) + ALOAD (1) + INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeSequentially, ()Z) + IFEQ (L1) + ALOAD (1) + ALOAD (2) + ICONST_0 + NEW + DUP + LDC (Result) + LDC (LResult;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, getOrCreateKotlinClass, (Ljava/lang/Class;)Lkotlin/reflect/KClass;) + ICONST_2 + ANEWARRAY + DUP + ICONST_0 + LDC (LResult$OK;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, getOrCreateKotlinClass, (Ljava/lang/Class;)Lkotlin/reflect/KClass;) + AASTORE + DUP + ICONST_1 + LDC (LResult$Err;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, getOrCreateKotlinClass, (Ljava/lang/Class;)Lkotlin/reflect/KClass;) + AASTORE + ICONST_2 + ANEWARRAY + DUP + ICONST_0 + GETSTATIC (INSTANCE, LResult$OK$$serializer;) + CHECKCAST + AASTORE + DUP + ICONST_1 + NEW + DUP + LDC (Result.Err) + GETSTATIC (INSTANCE, LResult$Err;) + INVOKESPECIAL (kotlinx/serialization/internal/ObjectSerializer, , (Ljava/lang/String;Ljava/lang/Object;)V) + AASTORE + INVOKESPECIAL (kotlinx/serialization/SealedClassSerializer, , (Ljava/lang/String;Lkotlin/reflect/KClass;[Lkotlin/reflect/KClass;[Lkotlinx/serialization/KSerializer;)V) + ALOAD (5) + INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeSerializableElement, (Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/DeserializationStrategy;Ljava/lang/Object;)Ljava/lang/Object;) + CHECKCAST + ASTORE (5) + LDC (2147483647) + ISTORE (4) + GOTO (L2) + LABEL (L1) + ALOAD (1) + ALOAD (2) + INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeElementIndex, (Lkotlinx/serialization/descriptors/SerialDescriptor;)I) + ISTORE (3) + ILOAD (3) + TABLESWITCH + LABEL (L3) + ALOAD (1) + ALOAD (2) + ICONST_0 + NEW + DUP + LDC (Result) + LDC (LResult;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, getOrCreateKotlinClass, (Ljava/lang/Class;)Lkotlin/reflect/KClass;) + ICONST_2 + ANEWARRAY + DUP + ICONST_0 + LDC (LResult$OK;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, getOrCreateKotlinClass, (Ljava/lang/Class;)Lkotlin/reflect/KClass;) + AASTORE + DUP + ICONST_1 + LDC (LResult$Err;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, getOrCreateKotlinClass, (Ljava/lang/Class;)Lkotlin/reflect/KClass;) + AASTORE + ICONST_2 + ANEWARRAY + DUP + ICONST_0 + GETSTATIC (INSTANCE, LResult$OK$$serializer;) + CHECKCAST + AASTORE + DUP + ICONST_1 + NEW + DUP + LDC (Result.Err) + GETSTATIC (INSTANCE, LResult$Err;) + INVOKESPECIAL (kotlinx/serialization/internal/ObjectSerializer, , (Ljava/lang/String;Ljava/lang/Object;)V) + AASTORE + INVOKESPECIAL (kotlinx/serialization/SealedClassSerializer, , (Ljava/lang/String;Lkotlin/reflect/KClass;[Lkotlin/reflect/KClass;[Lkotlinx/serialization/KSerializer;)V) + ALOAD (5) + INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeSerializableElement, (Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/DeserializationStrategy;Ljava/lang/Object;)Ljava/lang/Object;) + CHECKCAST + ASTORE (5) + ILOAD (4) + ICONST_1 + IOR + ISTORE (4) + GOTO (L1) + LABEL (L2) + ALOAD (1) + ALOAD (2) + INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, endStructure, (Lkotlinx/serialization/descriptors/SerialDescriptor;)V) + NEW + DUP + ILOAD (4) + ALOAD (5) + ACONST_NULL + INVOKESPECIAL (Container, , (ILResult;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V) + ARETURN + LABEL (L4) + NEW + DUP + ILOAD (3) + INVOKESPECIAL (kotlinx/serialization/UnknownFieldException, , (I)V) + CHECKCAST + ATHROW + LABEL (L5) + } + + public java.lang.Object deserialize(kotlinx.serialization.encoding.Decoder p0) { + LABEL (L0) + LINENUMBER (13) + ALOAD (0) + ALOAD (1) + INVOKEVIRTUAL (Container$$serializer, deserialize, (Lkotlinx/serialization/encoding/Decoder;)LContainer;) + ARETURN + } + + public kotlinx.serialization.descriptors.SerialDescriptor getDescriptor() + + public void serialize(kotlinx.serialization.encoding.Encoder encoder, Container value) + + public void serialize(kotlinx.serialization.encoding.Encoder p0, java.lang.Object p1) + + public kotlinx.serialization.KSerializer[] typeParametersSerializers() +} + +public final class Container$Companion : java/lang/Object { + private void () { + LABEL (L0) + LINENUMBER (13) + ALOAD (0) + INVOKESPECIAL (java/lang/Object, , ()V) + RETURN + LABEL (L1) + } + + public void (kotlin.jvm.internal.DefaultConstructorMarker $constructor_marker) { + LABEL (L0) + LINENUMBER (13) + ALOAD (0) + INVOKESPECIAL (Container$Companion, , ()V) + RETURN + LABEL (L1) + } + + public final kotlinx.serialization.KSerializer serializer() { + LABEL (L0) + GETSTATIC (INSTANCE, LContainer$$serializer;) + CHECKCAST + ARETURN + LABEL (L1) + } +} + +public final class Container : java/lang/Object { + public final static Container$Companion Companion + + private final Result r + + static void () { + NEW + DUP + ACONST_NULL + INVOKESPECIAL (Container$Companion, , (Lkotlin/jvm/internal/DefaultConstructorMarker;)V) + PUTSTATIC (Companion, LContainer$Companion;) + RETURN + } + + public void (Result r) { + LABEL (L0) + ALOAD (1) + LDC (r) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + LABEL (L1) + LINENUMBER (13) + ALOAD (0) + INVOKESPECIAL (java/lang/Object, , ()V) + ALOAD (0) + ALOAD (1) + PUTFIELD (r, LResult;) + RETURN + LABEL (L2) + } + + public void (int seen1, Result r, kotlinx.serialization.internal.SerializationConstructorMarker serializationConstructorMarker) { + LABEL (L0) + ICONST_1 + DUP + ILOAD (1) + IAND + IF_ICMPEQ (L1) + ILOAD (1) + ICONST_1 + GETSTATIC (INSTANCE, LContainer$$serializer;) + CHECKCAST + INVOKEINTERFACE (kotlinx/serialization/KSerializer, getDescriptor, ()Lkotlinx/serialization/descriptors/SerialDescriptor;) + INVOKESTATIC (kotlinx/serialization/internal/PluginExceptionsKt, throwMissingFieldException, (IILkotlinx/serialization/descriptors/SerialDescriptor;)V) + LABEL (L1) + ALOAD (0) + INVOKESPECIAL (java/lang/Object, , ()V) + ALOAD (0) + ALOAD (2) + PUTFIELD (r, LResult;) + RETURN + LABEL (L2) + } + + public final Result getR() + + public final static void write$Self(Container self, kotlinx.serialization.encoding.CompositeEncoder output, kotlinx.serialization.descriptors.SerialDescriptor serialDesc) { + LABEL (L0) + ALOAD (0) + LDC (self) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + ALOAD (1) + LDC (output) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + ALOAD (2) + LDC (serialDesc) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + ALOAD (1) + ALOAD (2) + ICONST_0 + NEW + DUP + LDC (Result) + LDC (LResult;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, getOrCreateKotlinClass, (Ljava/lang/Class;)Lkotlin/reflect/KClass;) + ICONST_2 + ANEWARRAY + DUP + ICONST_0 + LDC (LResult$OK;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, getOrCreateKotlinClass, (Ljava/lang/Class;)Lkotlin/reflect/KClass;) + AASTORE + DUP + ICONST_1 + LDC (LResult$Err;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, getOrCreateKotlinClass, (Ljava/lang/Class;)Lkotlin/reflect/KClass;) + AASTORE + ICONST_2 + ANEWARRAY + DUP + ICONST_0 + GETSTATIC (INSTANCE, LResult$OK$$serializer;) + CHECKCAST + AASTORE + DUP + ICONST_1 + NEW + DUP + LDC (Result.Err) + GETSTATIC (INSTANCE, LResult$Err;) + INVOKESPECIAL (kotlinx/serialization/internal/ObjectSerializer, , (Ljava/lang/String;Ljava/lang/Object;)V) + AASTORE + INVOKESPECIAL (kotlinx/serialization/SealedClassSerializer, , (Ljava/lang/String;Lkotlin/reflect/KClass;[Lkotlin/reflect/KClass;[Lkotlinx/serialization/KSerializer;)V) + ALOAD (0) + GETFIELD (r, LResult;) + INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeEncoder, encodeSerializableElement, (Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)V) + RETURN + LABEL (L1) + } +} + +final class Result$Companion$serializer$1 : kotlin/jvm/internal/Lambda, kotlin/jvm/functions/Function0 { + public final static Result$Companion$serializer$1 INSTANCE + + static void () { + NEW + DUP + INVOKESPECIAL (Result$Companion$serializer$1, , ()V) + PUTSTATIC (INSTANCE, LResult$Companion$serializer$1;) + RETURN + } + + public void () { + LABEL (L0) + ALOAD (0) + ICONST_0 + INVOKESPECIAL (kotlin/jvm/internal/Lambda, , (I)V) + RETURN + LABEL (L1) + } + + public final kotlinx.serialization.KSerializer invoke() { + LABEL (L0) + NEW + DUP + LDC (Result) + LDC (LResult;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, getOrCreateKotlinClass, (Ljava/lang/Class;)Lkotlin/reflect/KClass;) + ICONST_2 + ANEWARRAY + DUP + ICONST_0 + LDC (LResult$OK;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, getOrCreateKotlinClass, (Ljava/lang/Class;)Lkotlin/reflect/KClass;) + AASTORE + DUP + ICONST_1 + LDC (LResult$Err;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, getOrCreateKotlinClass, (Ljava/lang/Class;)Lkotlin/reflect/KClass;) + AASTORE + ICONST_2 + ANEWARRAY + DUP + ICONST_0 + GETSTATIC (INSTANCE, LResult$OK$$serializer;) + CHECKCAST + AASTORE + DUP + ICONST_1 + NEW + DUP + LDC (Result.Err) + GETSTATIC (INSTANCE, LResult$Err;) + INVOKESPECIAL (kotlinx/serialization/internal/ObjectSerializer, , (Ljava/lang/String;Ljava/lang/Object;)V) + AASTORE + INVOKESPECIAL (kotlinx/serialization/SealedClassSerializer, , (Ljava/lang/String;Lkotlin/reflect/KClass;[Lkotlin/reflect/KClass;[Lkotlinx/serialization/KSerializer;)V) + ARETURN + LABEL (L1) + } + + public final java.lang.Object invoke() { + LABEL (L0) + ALOAD (0) + INVOKEVIRTUAL (Result$Companion$serializer$1, invoke, ()Lkotlinx/serialization/KSerializer;) + ARETURN + LABEL (L1) + } +} + +public final class Result$Companion : java/lang/Object { + private final static kotlin.Lazy $cachedSerializer$delegate + + static void () { + GETSTATIC (PUBLICATION, Lkotlin/LazyThreadSafetyMode;) + GETSTATIC (INSTANCE, LResult$Companion$serializer$1;) + CHECKCAST + INVOKESTATIC (kotlin/LazyKt, lazy, (Lkotlin/LazyThreadSafetyMode;Lkotlin/jvm/functions/Function0;)Lkotlin/Lazy;) + PUTSTATIC ($cachedSerializer$delegate, Lkotlin/Lazy;) + RETURN + } + + private void () { + LABEL (L0) + LINENUMBER (7) + ALOAD (0) + INVOKESPECIAL (java/lang/Object, , ()V) + RETURN + LABEL (L1) + } + + public void (kotlin.jvm.internal.DefaultConstructorMarker $constructor_marker) { + LABEL (L0) + LINENUMBER (7) + ALOAD (0) + INVOKESPECIAL (Result$Companion, , ()V) + RETURN + LABEL (L1) + } + + public final kotlinx.serialization.KSerializer serializer() { + LABEL (L0) + GETSTATIC ($cachedSerializer$delegate, Lkotlin/Lazy;) + INVOKEINTERFACE (kotlin/Lazy, getValue, ()Ljava/lang/Object;) + CHECKCAST + ARETURN + LABEL (L1) + } +} + +final class Result$Err$serializer$1 : kotlin/jvm/internal/Lambda, kotlin/jvm/functions/Function0 { + public final static Result$Err$serializer$1 INSTANCE + + static void () { + NEW + DUP + INVOKESPECIAL (Result$Err$serializer$1, , ()V) + PUTSTATIC (INSTANCE, LResult$Err$serializer$1;) + RETURN + } + + public void () { + LABEL (L0) + ALOAD (0) + ICONST_0 + INVOKESPECIAL (kotlin/jvm/internal/Lambda, , (I)V) + RETURN + LABEL (L1) + } + + public final kotlinx.serialization.KSerializer invoke() { + LABEL (L0) + NEW + DUP + LDC (Result.Err) + GETSTATIC (INSTANCE, LResult$Err;) + INVOKESPECIAL (kotlinx/serialization/internal/ObjectSerializer, , (Ljava/lang/String;Ljava/lang/Object;)V) + ARETURN + LABEL (L1) + } + + public final java.lang.Object invoke() { + LABEL (L0) + ALOAD (0) + INVOKEVIRTUAL (Result$Err$serializer$1, invoke, ()Lkotlinx/serialization/KSerializer;) + ARETURN + LABEL (L1) + } +} + +public final class Result$Err : Result { + private final static kotlin.Lazy $cachedSerializer$delegate + + public final static Result$Err INSTANCE + + static void () { + LABEL (L0) + LINENUMBER (9) + NEW + DUP + INVOKESPECIAL (Result$Err, , ()V) + ASTORE (0) + ALOAD (0) + PUTSTATIC (INSTANCE, LResult$Err;) + GETSTATIC (PUBLICATION, Lkotlin/LazyThreadSafetyMode;) + GETSTATIC (INSTANCE, LResult$Err$serializer$1;) + CHECKCAST + INVOKESTATIC (kotlin/LazyKt, lazy, (Lkotlin/LazyThreadSafetyMode;Lkotlin/jvm/functions/Function0;)Lkotlin/Lazy;) + PUTSTATIC ($cachedSerializer$delegate, Lkotlin/Lazy;) + RETURN + } + + private void () { + LABEL (L0) + LINENUMBER (9) + ALOAD (0) + ACONST_NULL + LABEL (L1) + LINENUMBER (9) + INVOKESPECIAL (Result, , (Lkotlin/jvm/internal/DefaultConstructorMarker;)V) + RETURN + LABEL (L2) + } + + public final kotlinx.serialization.KSerializer serializer() { + LABEL (L0) + GETSTATIC ($cachedSerializer$delegate, Lkotlin/Lazy;) + INVOKEINTERFACE (kotlin/Lazy, getValue, ()Ljava/lang/Object;) + CHECKCAST + ARETURN + LABEL (L1) + } +} + +public final class Result$OK$$serializer : java/lang/Object, kotlinx/serialization/internal/GeneratedSerializer { + private final static kotlinx.serialization.descriptors.SerialDescriptor $$serialDesc + + public final static Result$OK$$serializer INSTANCE + + static void () { + LABEL (L0) + LINENUMBER (8) + NEW + DUP + INVOKESPECIAL (Result$OK$$serializer, , ()V) + ASTORE (0) + ALOAD (0) + PUTSTATIC (INSTANCE, LResult$OK$$serializer;) + NEW + DUP + LDC (Result.OK) + GETSTATIC (INSTANCE, LResult$OK$$serializer;) + CHECKCAST + LDC (1) + INVOKESPECIAL (kotlinx/serialization/internal/PluginGeneratedSerialDescriptor, , (Ljava/lang/String;Lkotlinx/serialization/internal/GeneratedSerializer;I)V) + ASTORE (0) + ALOAD (0) + LDC (s) + ICONST_0 + INVOKEVIRTUAL (kotlinx/serialization/internal/PluginGeneratedSerialDescriptor, addElement, (Ljava/lang/String;Z)V) + ALOAD (0) + PUTSTATIC ($$serialDesc, Lkotlinx/serialization/descriptors/SerialDescriptor;) + RETURN + } + + private void () { + LABEL (L0) + LINENUMBER (8) + ALOAD (0) + INVOKESPECIAL (java/lang/Object, , ()V) + RETURN + LABEL (L1) + } + + public kotlinx.serialization.KSerializer[] childSerializers() { + LABEL (L0) + ICONST_1 + ANEWARRAY + DUP + ICONST_0 + GETSTATIC (INSTANCE, Lkotlinx/serialization/internal/StringSerializer;) + CHECKCAST + AASTORE + ARETURN + LABEL (L1) + } + + public Result$OK deserialize(kotlinx.serialization.encoding.Decoder decoder) { + LABEL (L0) + ALOAD (1) + LDC (decoder) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + GETSTATIC ($$serialDesc, Lkotlinx/serialization/descriptors/SerialDescriptor;) + ASTORE (2) + ICONST_0 + ISTORE (4) + ACONST_NULL + ASTORE (5) + ALOAD (1) + ALOAD (2) + INVOKEINTERFACE (kotlinx/serialization/encoding/Decoder, beginStructure, (Lkotlinx/serialization/descriptors/SerialDescriptor;)Lkotlinx/serialization/encoding/CompositeDecoder;) + ASTORE (1) + ALOAD (1) + INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeSequentially, ()Z) + IFEQ (L1) + ALOAD (1) + ALOAD (2) + ICONST_0 + INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeStringElement, (Lkotlinx/serialization/descriptors/SerialDescriptor;I)Ljava/lang/String;) + ASTORE (5) + LDC (2147483647) + ISTORE (4) + GOTO (L2) + LABEL (L1) + ALOAD (1) + ALOAD (2) + INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeElementIndex, (Lkotlinx/serialization/descriptors/SerialDescriptor;)I) + ISTORE (3) + ILOAD (3) + TABLESWITCH + LABEL (L3) + ALOAD (1) + ALOAD (2) + ICONST_0 + INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, decodeStringElement, (Lkotlinx/serialization/descriptors/SerialDescriptor;I)Ljava/lang/String;) + ASTORE (5) + ILOAD (4) + ICONST_1 + IOR + ISTORE (4) + GOTO (L1) + LABEL (L2) + ALOAD (1) + ALOAD (2) + INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeDecoder, endStructure, (Lkotlinx/serialization/descriptors/SerialDescriptor;)V) + NEW + DUP + ILOAD (4) + ALOAD (5) + ACONST_NULL + INVOKESPECIAL (Result$OK, , (ILjava/lang/String;Lkotlinx/serialization/internal/SerializationConstructorMarker;)V) + ARETURN + LABEL (L4) + NEW + DUP + ILOAD (3) + INVOKESPECIAL (kotlinx/serialization/UnknownFieldException, , (I)V) + CHECKCAST + ATHROW + LABEL (L5) + } + + public java.lang.Object deserialize(kotlinx.serialization.encoding.Decoder p0) { + LABEL (L0) + LINENUMBER (8) + ALOAD (0) + ALOAD (1) + INVOKEVIRTUAL (Result$OK$$serializer, deserialize, (Lkotlinx/serialization/encoding/Decoder;)LResult$OK;) + ARETURN + } + + public kotlinx.serialization.descriptors.SerialDescriptor getDescriptor() + + public void serialize(kotlinx.serialization.encoding.Encoder encoder, Result$OK value) + + public void serialize(kotlinx.serialization.encoding.Encoder p0, java.lang.Object p1) + + public kotlinx.serialization.KSerializer[] typeParametersSerializers() +} + +public final class Result$OK$Companion : java/lang/Object { + private void () { + LABEL (L0) + LINENUMBER (8) + ALOAD (0) + INVOKESPECIAL (java/lang/Object, , ()V) + RETURN + LABEL (L1) + } + + public void (kotlin.jvm.internal.DefaultConstructorMarker $constructor_marker) { + LABEL (L0) + LINENUMBER (8) + ALOAD (0) + INVOKESPECIAL (Result$OK$Companion, , ()V) + RETURN + LABEL (L1) + } + + public final kotlinx.serialization.KSerializer serializer() { + LABEL (L0) + GETSTATIC (INSTANCE, LResult$OK$$serializer;) + CHECKCAST + ARETURN + LABEL (L1) + } +} + +public final class Result$OK : Result { + public final static Result$OK$Companion Companion + + private final java.lang.String s + + static void () { + NEW + DUP + ACONST_NULL + INVOKESPECIAL (Result$OK$Companion, , (Lkotlin/jvm/internal/DefaultConstructorMarker;)V) + PUTSTATIC (Companion, LResult$OK$Companion;) + RETURN + } + + public void (java.lang.String s) { + LABEL (L0) + ALOAD (1) + LDC (s) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + LABEL (L1) + LINENUMBER (8) + ALOAD (0) + ACONST_NULL + INVOKESPECIAL (Result, , (Lkotlin/jvm/internal/DefaultConstructorMarker;)V) + ALOAD (0) + ALOAD (1) + PUTFIELD (s, Ljava/lang/String;) + RETURN + LABEL (L2) + } + + public void (int seen1, java.lang.String s, kotlinx.serialization.internal.SerializationConstructorMarker serializationConstructorMarker) { + LABEL (L0) + ICONST_1 + DUP + ILOAD (1) + IAND + IF_ICMPEQ (L1) + ILOAD (1) + ICONST_1 + GETSTATIC (INSTANCE, LResult$OK$$serializer;) + CHECKCAST + INVOKEINTERFACE (kotlinx/serialization/KSerializer, getDescriptor, ()Lkotlinx/serialization/descriptors/SerialDescriptor;) + INVOKESTATIC (kotlinx/serialization/internal/PluginExceptionsKt, throwMissingFieldException, (IILkotlinx/serialization/descriptors/SerialDescriptor;)V) + LABEL (L1) + ALOAD (0) + ILOAD (1) + ACONST_NULL + INVOKESPECIAL (Result, , (ILkotlinx/serialization/internal/SerializationConstructorMarker;)V) + ALOAD (0) + ALOAD (2) + PUTFIELD (s, Ljava/lang/String;) + RETURN + LABEL (L2) + } + + public final java.lang.String getS() + + public final static void write$Self(Result$OK self, kotlinx.serialization.encoding.CompositeEncoder output, kotlinx.serialization.descriptors.SerialDescriptor serialDesc) { + LABEL (L0) + ALOAD (0) + LDC (self) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + ALOAD (1) + LDC (output) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + ALOAD (2) + LDC (serialDesc) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + ALOAD (0) + ALOAD (1) + ALOAD (2) + INVOKESTATIC (Result, write$Self, (LResult;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V) + ALOAD (1) + ALOAD (2) + ICONST_0 + ALOAD (0) + GETFIELD (s, Ljava/lang/String;) + INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeEncoder, encodeStringElement, (Lkotlinx/serialization/descriptors/SerialDescriptor;ILjava/lang/String;)V) + RETURN + LABEL (L1) + } +} + +public abstract class Result : java/lang/Object { + public final static Result$Companion Companion + + static void () { + NEW + DUP + ACONST_NULL + INVOKESPECIAL (Result$Companion, , (Lkotlin/jvm/internal/DefaultConstructorMarker;)V) + PUTSTATIC (Companion, LResult$Companion;) + RETURN + } + + private void () { + LABEL (L0) + LINENUMBER (7) + ALOAD (0) + INVOKESPECIAL (java/lang/Object, , ()V) + RETURN + LABEL (L1) + } + + public void (kotlin.jvm.internal.DefaultConstructorMarker $constructor_marker) { + LABEL (L0) + LINENUMBER (7) + ALOAD (0) + INVOKESPECIAL (Result, , ()V) + RETURN + LABEL (L1) + } + + public void (int seen1, kotlinx.serialization.internal.SerializationConstructorMarker serializationConstructorMarker) { + LABEL (L0) + ALOAD (0) + INVOKESPECIAL (java/lang/Object, , ()V) + RETURN + LABEL (L1) + } + + public final static void write$Self(Result self, kotlinx.serialization.encoding.CompositeEncoder output, kotlinx.serialization.descriptors.SerialDescriptor serialDesc) { + LABEL (L0) + ALOAD (0) + LDC (self) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + ALOAD (1) + LDC (output) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + ALOAD (2) + LDC (serialDesc) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + RETURN + LABEL (L1) + } +}