From aac9a064747525697b8d6133e98e05369eda4181 Mon Sep 17 00:00:00 2001 From: Leonid Startsev Date: Thu, 25 Aug 2022 17:38:43 +0200 Subject: [PATCH] Also support intrinsification for SerializersModule.serializer() method that fallbacks to module.getContextual(). --- .../codegen/inline/ReifiedTypeInliner.kt | 2 +- .../kotlinx-serialization/build.gradle.kts | 4 + .../ir/SerializationJvmIrIntrinsicSupport.kt | 200 +++++++--- .../SerializationLoweringExtension.kt | 3 +- .../testData/boxIr/intrinsicsBox.kt | 27 +- ...ntrinsics.ir.txt => Intrinsics.asm.ir.txt} | 14 +- .../{Intrinsics.txt => Intrinsics.asm.txt} | 84 ++-- .../testData/codegen/Intrinsics.kt | 2 +- .../codegen/IntrinsicsAdvanced.asm.ir.txt | 203 ++++++++++ .../codegen/IntrinsicsAdvanced.asm.txt | 372 ++++++++++++++++++ .../testData/codegen/IntrinsicsAdvanced.kt | 32 ++ ...mLikeInstructionsListingTestGenerated.java | 6 + ...SerializationFirBlackBoxTestGenerated.java | 6 + ...mLikeInstructionsListingTestGenerated.java | 6 + 14 files changed, 844 insertions(+), 117 deletions(-) rename plugins/kotlinx-serialization/testData/codegen/{Intrinsics.ir.txt => Intrinsics.asm.ir.txt} (99%) rename plugins/kotlinx-serialization/testData/codegen/{Intrinsics.txt => Intrinsics.asm.txt} (98%) create mode 100644 plugins/kotlinx-serialization/testData/codegen/IntrinsicsAdvanced.asm.ir.txt create mode 100644 plugins/kotlinx-serialization/testData/codegen/IntrinsicsAdvanced.asm.txt create mode 100644 plugins/kotlinx-serialization/testData/codegen/IntrinsicsAdvanced.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/ReifiedTypeInliner.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/ReifiedTypeInliner.kt index d24a8e9f0b4..8753f5e933e 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/ReifiedTypeInliner.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/ReifiedTypeInliner.kt @@ -298,7 +298,7 @@ class ReifiedTypeInliner( return true } - inline private fun rewriteNextTypeInsn( + private inline fun rewriteNextTypeInsn( marker: MethodInsnNode, expectedNextOpcode: Int, rewrite: (AbstractInsnNode) -> Boolean diff --git a/plugins/kotlinx-serialization/build.gradle.kts b/plugins/kotlinx-serialization/build.gradle.kts index 38ff7df9e8d..c4faaaed065 100644 --- a/plugins/kotlinx-serialization/build.gradle.kts +++ b/plugins/kotlinx-serialization/build.gradle.kts @@ -5,6 +5,10 @@ plugins { id("jps-compatible") } +repositories { + mavenLocal() +} + dependencies { embedded(project(":kotlinx-serialization-compiler-plugin.common")) embedded(project(":kotlinx-serialization-compiler-plugin.k1")) diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializationJvmIrIntrinsicSupport.kt b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializationJvmIrIntrinsicSupport.kt index fe472511b79..e7683332477 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializationJvmIrIntrinsicSupport.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializationJvmIrIntrinsicSupport.kt @@ -7,10 +7,7 @@ package org.jetbrains.kotlinx.serialization.compiler.backend.ir import org.jetbrains.kotlin.backend.common.extensions.FirIncompatiblePluginAPI import org.jetbrains.kotlin.backend.jvm.JvmBackendContext -import org.jetbrains.kotlin.backend.jvm.codegen.BlockInfo -import org.jetbrains.kotlin.backend.jvm.codegen.ExpressionCodegen -import org.jetbrains.kotlin.backend.jvm.codegen.MaterialValue -import org.jetbrains.kotlin.backend.jvm.codegen.PromisedValue +import org.jetbrains.kotlin.backend.jvm.codegen.* import org.jetbrains.kotlin.backend.jvm.intrinsics.IntrinsicMethod import org.jetbrains.kotlin.backend.jvm.ir.representativeUpperBound import org.jetbrains.kotlin.backend.jvm.mapping.mapClass @@ -50,20 +47,41 @@ import org.jetbrains.kotlinx.serialization.compiler.resolve.getClassFromSerializ import org.jetbrains.org.objectweb.asm.Opcodes import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter +import org.jetbrains.org.objectweb.asm.tree.AbstractInsnNode import org.jetbrains.org.objectweb.asm.tree.InsnList import org.jetbrains.org.objectweb.asm.tree.MethodInsnNode +import org.jetbrains.org.objectweb.asm.tree.VarInsnNode class SerializationJvmIrIntrinsicSupport(val jvmBackendContext: JvmBackendContext) : SerializationBaseContext { - companion object { - fun isSerializerReifiedFunction(targetFunction: IrFunction): Boolean = - targetFunction.fqNameWhenAvailable?.asString() == "kotlinx.serialization.SerializersKt.serializer" - && targetFunction.valueParameters.isEmpty() - && targetFunction.typeParameters.size == 1 - && targetFunction.dispatchReceiverParameter == null - && targetFunction.extensionReceiverParameter == null + sealed class IntrinsicType(val methodDescriptor: String) { + object Simple : IntrinsicType(stubCallDescriptor) + + class WithModule(val storedIndex: Int) : + IntrinsicType(stubCallDescriptorWithModule) { + } } - object ReifiedSerializerMethod : IntrinsicMethod() { + companion object { + fun intrinsicForMethod(method: IrFunction): IntrinsicMethod? { + if (method.fqNameWhenAvailable?.asString() != "kotlinx.serialization.SerializersKt.serializer" + || method.dispatchReceiverParameter != null + || method.typeParameters.size != 1 + || method.valueParameters.isNotEmpty() + ) return null + return ReifiedSerializerMethod(method.extensionReceiverParameter != null) + } + + val serializersModuleType: Type = Type.getObjectType("kotlinx/serialization/modules/SerializersModule") + + val stubCallDescriptorWithModule = "(${serializersModuleType.descriptor})${kSerializerType.descriptor}" + val stubCallDescriptor = "()${kSerializerType.descriptor}" + const val serializersKtInternalName = "kotlinx/serialization/SerializersKt" + const val callMethodName = "serializer" + const val noCompiledSerializerMethodName = "noCompiledSerializer" + + } + + class ReifiedSerializerMethod(private val withModule: Boolean) : IntrinsicMethod() { override fun invoke( expression: IrFunctionAccessExpression, codegen: ExpressionCodegen, @@ -71,10 +89,21 @@ class SerializationJvmIrIntrinsicSupport(val jvmBackendContext: JvmBackendContex ): PromisedValue { with(codegen) { val argument = expression.getTypeArgument(0)!! + val intrinsicType = if (withModule) { + val moduleReceiver = expression.extensionReceiver!! + val materialVal = moduleReceiver.accept(codegen, data).materializedAt(moduleReceiver.type) + val storedIndex = frameMap.enterTemp(materialVal.type) + mv.store(storedIndex, materialVal.type) + IntrinsicType.WithModule(storedIndex) + } else IntrinsicType.Simple SerializationJvmIrIntrinsicSupport(codegen.context).generateSerializerForType( argument, - mv + mv, + intrinsicType ) + if (withModule) { + frameMap.leaveTemp(serializersModuleType) + } return MaterialValue(codegen, kSerializerType, expression.type) } } @@ -115,17 +144,50 @@ class SerializationJvmIrIntrinsicSupport(val jvmBackendContext: JvmBackendContex instructions: InsnList, type: IrType, ): Int { + val intrinsicType = getOperationTypeFromInsn(insn) ?: return -1 val newMethodNode = newMethodNodeWithCorrectStackSize { - generateSerializerForType(type, it) + generateSerializerForType(type, it, intrinsicType) } - instructions.remove(insn.next) + when (intrinsicType) { + is IntrinsicType.Simple -> instructions.remove(insn.next) + is IntrinsicType.WithModule -> { + instructions.remove(insn.next.next) + instructions.remove(insn.next) + } + } instructions.insert(insn, newMethodNode.instructions) return newMethodNode.maxStack } - private fun InstructionAdapter.putReifyMarkerIfNeeded(type: KotlinTypeMarker): Boolean = + private fun getOperationTypeFromInsn(insn: MethodInsnNode): IntrinsicType? { + // insn is reification marker + // insn.next is serializer() OR load(module) + // insn.next.next is serializer(module) if insn.next was load(module) + val mayBeSerializerModuleCall: AbstractInsnNode? = insn.next?.next + val next = insn.next ?: error("Reification marker cannot be the last instruction in method") + if ( + mayBeSerializerModuleCall is MethodInsnNode + && mayBeSerializerModuleCall.opcode == Opcodes.INVOKESTATIC + && mayBeSerializerModuleCall.owner == serializersKtInternalName + && mayBeSerializerModuleCall.name == callMethodName + && mayBeSerializerModuleCall.desc == stubCallDescriptorWithModule + ) { + val loadIns = next as? VarInsnNode ?: error("Expected load(SerializersModule) instruction") + // It's possible to also check opcode, but that doesn't seem necessary + return IntrinsicType.WithModule(loadIns.`var`) + } else if (next is MethodInsnNode + && next.opcode == Opcodes.INVOKESTATIC + && next.owner == serializersKtInternalName + && next.name == callMethodName + && next.desc == stubCallDescriptor + ) { + return IntrinsicType.Simple + } else return null // May be reification marker from other plugin + } + + private fun InstructionAdapter.putReifyMarkerIfNeeded(type: KotlinTypeMarker, intrinsicType: IntrinsicType): Boolean = with(typeSystemContext) { val typeDescriptor = type.typeConstructor().getTypeParameterClassifier() if (typeDescriptor != null) { // need further reification @@ -136,7 +198,10 @@ class SerializationJvmIrIntrinsicSupport(val jvmBackendContext: JvmBackendContex this@putReifyMarkerIfNeeded, typeSystemContext ) - invokestatic("kotlinx/serialization/SerializersKt", "serializer", "()Lkotlinx/serialization/KSerializer;", false) + if (intrinsicType is IntrinsicType.WithModule) { + load(intrinsicType.storedIndex, serializersModuleType) + } + invokestatic(serializersKtInternalName, callMethodName, intrinsicType.methodDescriptor, false) return true } return false @@ -144,10 +209,11 @@ class SerializationJvmIrIntrinsicSupport(val jvmBackendContext: JvmBackendContex fun generateSerializerForType( type: IrType, - adapter: InstructionAdapter + adapter: InstructionAdapter, + intrinsicType: IntrinsicType ) { with(typeSystemContext) { - if (adapter.putReifyMarkerIfNeeded(type)) return + if (adapter.putReifyMarkerIfNeeded(type, intrinsicType)) return val typeDescriptor: IrClass = type.classOrNull!!.owner val support = this@SerializationJvmIrIntrinsicSupport @@ -158,7 +224,7 @@ class SerializationJvmIrIntrinsicSupport(val jvmBackendContext: JvmBackendContex val companionType = if (typeDescriptor.isSerializableObject) typeDescriptor else typeDescriptor.companionObject()!! support.instantiateObject(adapter, companionType.symbol) val args = type.getArguments().map { it.getType() } - args.forEach { generateSerializerForType(it, adapter) } + args.forEach { generateSerializerForType(it, adapter, intrinsicType) } val signature = kSerializerType.descriptor.repeat(args.size) adapter.invokevirtual( typeMapper.mapClass(companionType).internalName, @@ -172,9 +238,10 @@ class SerializationJvmIrIntrinsicSupport(val jvmBackendContext: JvmBackendContex support.stackValueSerializerInstance( type, serializer, - adapter + adapter, + intrinsicType ) { genericArg -> - assert(putReifyMarkerIfNeeded(genericArg)) + assert(putReifyMarkerIfNeeded(genericArg, intrinsicType)) } if (type.isMarkedNullable()) adapter.wrapStackValueIntoNullableSerializer() } @@ -183,30 +250,31 @@ class SerializationJvmIrIntrinsicSupport(val jvmBackendContext: JvmBackendContex private fun stackValueSerializerInstance( kType: IrType, maybeSerializer: IrClassSymbol?, - iv: InstructionAdapter?, + iv: InstructionAdapter, + intrinsicType: IntrinsicType, genericIndex: Int? = null, genericSerializerFieldGetter: (InstructionAdapter.(IrType) -> Unit)? = null, ): Boolean = with(typeSystemContext) { if (maybeSerializer == null && genericIndex != null) { // get field from serializer object - iv?.run { genericSerializerFieldGetter?.invoke(this, kType) } + genericSerializerFieldGetter?.invoke(iv, kType) return true } - val serializer = maybeSerializer ?: run { - iv?.apply { + if (maybeSerializer == null && intrinsicType == IntrinsicType.Simple) { + iv.apply { aconst(kType.classFqName!!.asString()) invokestatic( - "kotlinx/serialization/SerializersKt", - "noCompiledSerializer", - "(Ljava/lang/String;)Lkotlinx/serialization/KSerializer;", + serializersKtInternalName, + noCompiledSerializerMethodName, + "(Ljava/lang/String;)${kSerializerType.descriptor}", false ) } return false } - if (serializer.owner.isObject) { + if (maybeSerializer != null && maybeSerializer.owner.isObject) { // singleton serializer -- just get it - iv?.let { instantiateObject(it, serializer) } + instantiateObject(iv, maybeSerializer) return true } // serializer is not singleton object and shall be instantiated @@ -218,8 +286,50 @@ class SerializationJvmIrIntrinsicSupport(val jvmBackendContext: JvmBackendContex // check if it can be properly serialized with its args recursively Pair(argType, argSerializer) } + + fun instantiate(typeArgument: Pair, signature: StringBuilder?) { + val (argType, argSerializer) = typeArgument + stackValueSerializerInstance( + argType, + argSerializer, + iv, + intrinsicType, + argType.genericIndex, + genericSerializerFieldGetter + ) + // wrap into nullable serializer if argType is nullable + if (argType.isMarkedNullable()) iv.wrapStackValueIntoNullableSerializer() + signature?.append(kSerializerType.descriptor) + } + + val serializer = maybeSerializer ?: iv.run { + require(intrinsicType is IntrinsicType.WithModule) // SIMPLE is covered in previous if + // SerializersModule + load(intrinsicType.storedIndex, serializersModuleType) + // KClass + aconst(typeMapper.mapTypeCommon(kType, TypeMappingMode.GENERIC_ARGUMENT)) + AsmUtil.wrapJavaClassIntoKClass(this) + + val descriptor = StringBuilder("(${serializersModuleType.descriptor}${AsmTypes.K_CLASS_TYPE.descriptor}") + // Generic args (if present) + if (argSerializers.isNotEmpty()) { + fillArray(kSerializerType, argSerializers) { _, serializer -> + instantiate(serializer, null) + } + descriptor.append(kSerializerArrayType.descriptor) + } + descriptor.append(")${kSerializerType.descriptor}") + invokestatic( + serializersKtInternalName, + noCompiledSerializerMethodName, + descriptor.toString(), + false + ) + return false + } + // new serializer if needed - iv?.apply { + iv.apply { val serializerType = typeMapper.mapClass(serializer.owner) if (serializer.owner.classId == enumSerializerId && runtimeHasEnumSerializerFactoryFunctions) { val enumIrClass = kType.classOrNull!!.owner @@ -277,21 +387,6 @@ class SerializationJvmIrIntrinsicSupport(val jvmBackendContext: JvmBackendContex dup() // instantiate all arg serializers on stack val signature = StringBuilder("(") - - fun instantiate(typeArgument: Pair, writeSignature: Boolean = true) { - val (argType, argSerializer) = typeArgument - stackValueSerializerInstance( - argType, - argSerializer, - this, - argType.genericIndex, - genericSerializerFieldGetter - ) - // wrap into nullable serializer if argType is nullable - if (argType.isMarkedNullable()) wrapStackValueIntoNullableSerializer() - if (writeSignature) signature.append(kSerializerType.descriptor) - } - val serialName = kType.serialName() when (serializer.owner.classId) { enumSerializerId -> { @@ -314,13 +409,13 @@ class SerializationJvmIrIntrinsicSupport(val jvmBackendContext: JvmBackendContex // append new additional arguments val fallbackDefaultSerializer = findTypeSerializer(this@SerializationJvmIrIntrinsicSupport, kType) if (fallbackDefaultSerializer != null && fallbackDefaultSerializer != serializer) { - instantiate(kType to fallbackDefaultSerializer, writeSignature = false) + instantiate(kType to fallbackDefaultSerializer, null) } else { aconst(null) } signature.append(kSerializerType.descriptor) fillArray(kSerializerType, argSerializers) { _, serializer -> - instantiate(serializer, writeSignature = false) + instantiate(serializer, null) } signature.append(kSerializerArrayType.descriptor) } @@ -331,7 +426,7 @@ class SerializationJvmIrIntrinsicSupport(val jvmBackendContext: JvmBackendContex AsmUtil.wrapJavaClassIntoKClass(this) signature.append(AsmTypes.K_CLASS_TYPE.descriptor) // Reference array serializer still needs serializer for its argument type - instantiate(argSerializers[0]) + instantiate(argSerializers[0], signature) } sealedSerializerId -> { aconst(serialName) @@ -357,6 +452,7 @@ class SerializationJvmIrIntrinsicSupport(val jvmBackendContext: JvmBackendContex argType, argSerializer, this, + intrinsicType, argType.genericIndex ) { genericType -> // if we encountered generic type parameter in one of subclasses of sealed class, use polymorphism from upper bound @@ -364,7 +460,7 @@ class SerializationJvmIrIntrinsicSupport(val jvmBackendContext: JvmBackendContex stackValueSerializerInstance( (genericType.classifierOrNull as IrTypeParameterSymbol).owner.representativeUpperBound, jvmBackendContext.referenceClass(module.getClassFromSerializationPackage(SpecialBuiltins.polymorphicSerializer)), - this + this, intrinsicType ) ) } @@ -380,7 +476,7 @@ class SerializationJvmIrIntrinsicSupport(val jvmBackendContext: JvmBackendContex signature.append("Ljava/lang/Object;") } // all serializers get arguments with serializers of their generic types - else -> argSerializers.forEach { instantiate(it) } + else -> argSerializers.forEach { instantiate(it, signature) } } signature.append(")V") // invoke constructor diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/extensions/SerializationLoweringExtension.kt b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/extensions/SerializationLoweringExtension.kt index c5220b142ec..09c7e2eee2d 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/extensions/SerializationLoweringExtension.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.backend/src/org/jetbrains/kotlinx/serialization/compiler/extensions/SerializationLoweringExtension.kt @@ -139,8 +139,7 @@ open class SerializationLoweringExtension @JvmOverloads constructor( } override fun retrieveIntrinsic(symbol: IrFunctionSymbol): Any? { - if (!SerializationJvmIrIntrinsicSupport.isSerializerReifiedFunction(symbol.owner)) return null - return SerializationJvmIrIntrinsicSupport.ReifiedSerializerMethod + return SerializationJvmIrIntrinsicSupport.intrinsicForMethod(symbol.owner) } override fun applyPluginDefinedReifiedOperationMarker( diff --git a/plugins/kotlinx-serialization/testData/boxIr/intrinsicsBox.kt b/plugins/kotlinx-serialization/testData/boxIr/intrinsicsBox.kt index c0fdf0e1f73..1b5be590af7 100644 --- a/plugins/kotlinx-serialization/testData/boxIr/intrinsicsBox.kt +++ b/plugins/kotlinx-serialization/testData/boxIr/intrinsicsBox.kt @@ -7,6 +7,7 @@ import kotlinx.serialization.* import kotlinx.serialization.json.* import kotlinx.serialization.internal.* import kotlinx.serialization.descriptors.* +import kotlinx.serialization.modules.* @Serializable class Simple(val firstName: String, val lastName: String) @@ -17,16 +18,18 @@ data class Box(val boxed: T) @Serializable object SerializableObject {} -inline fun getSer(): KSerializer { - return serializer() +val module = SerializersModule {} + +inline fun getSer(module: SerializersModule): KSerializer { + return module.serializer() } -inline fun getBoxSer(): KSerializer> { - return serializer>() +inline fun getBoxSer(module: SerializersModule): KSerializer> { + return module.serializer>() } -inline fun listSer(): KSerializer> { - return serializer>() +inline fun listSer(module: SerializersModule): KSerializer> { + return module.serializer>() } fun SerialDescriptor.recursiveToString(): String { @@ -46,17 +49,17 @@ fun assertHasSerializers(kSerializer: KSerializer<*>, list: List) { fun box(): String { assertHasSerializers(serializer(), listOf("Simple")) - assertHasSerializers(getSer(), listOf("Simple")) + assertHasSerializers(getSer(module), listOf("Simple")) - assertHasSerializers(getSer>(), listOf("Box", "Simple")) - assertHasSerializers(getBoxSer(), listOf("Box", "Simple")) + assertHasSerializers(getSer>(module), listOf("Box", "Simple")) + assertHasSerializers(getBoxSer(module), listOf("Box", "Simple")) - assertHasSerializers(listSer(), listOf("ArrayList", "Simple")) + assertHasSerializers(listSer(module), listOf("ArrayList", "Simple")) assertHasSerializers(serializer>>(), listOf("Box", "ArrayList", "Simple")) - assertHasSerializers(listSer>>(), listOf("ArrayList", "Box", "ArrayList", "Simple")) + assertHasSerializers(listSer>>(module), listOf("ArrayList", "Box", "ArrayList", "Simple")) assertHasSerializers(serializer(), listOf("Int")) assertHasSerializers(serializer(), listOf("SerializableObject")) - assertHasSerializers(listSer>>(), listOf("ArrayList", "ArrayList", "Box", "Int")) + assertHasSerializers(listSer>>(module), listOf("ArrayList", "ArrayList", "Box", "Int")) return "OK" } \ No newline at end of file diff --git a/plugins/kotlinx-serialization/testData/codegen/Intrinsics.ir.txt b/plugins/kotlinx-serialization/testData/codegen/Intrinsics.asm.ir.txt similarity index 99% rename from plugins/kotlinx-serialization/testData/codegen/Intrinsics.ir.txt rename to plugins/kotlinx-serialization/testData/codegen/Intrinsics.asm.ir.txt index e86af1744f2..82faf5bdc64 100644 --- a/plugins/kotlinx-serialization/testData/codegen/Intrinsics.ir.txt +++ b/plugins/kotlinx-serialization/testData/codegen/Intrinsics.asm.ir.txt @@ -85,7 +85,7 @@ public final class IntrinsicsKt : java/lang/Object { GETSTATIC (Simple, Companion, LSimple$Companion;) INVOKEVIRTUAL (Simple$Companion, serializer, ()Lkotlinx/serialization/KSerializer;) LABEL (L2) - LINENUMBER (44) + LINENUMBER (45) NOP LABEL (L3) POP @@ -99,7 +99,7 @@ public final class IntrinsicsKt : java/lang/Object { INVOKEVIRTUAL (Simple$Companion, serializer, ()Lkotlinx/serialization/KSerializer;) INVOKEVIRTUAL (Box$Companion, serializer, (Lkotlinx/serialization/KSerializer;)Lkotlinx/serialization/KSerializer;) LABEL (L6) - LINENUMBER (45) + LINENUMBER (46) NOP LABEL (L7) POP @@ -113,7 +113,7 @@ public final class IntrinsicsKt : java/lang/Object { INVOKEVIRTUAL (Simple$Companion, serializer, ()Lkotlinx/serialization/KSerializer;) INVOKEVIRTUAL (Box$Companion, serializer, (Lkotlinx/serialization/KSerializer;)Lkotlinx/serialization/KSerializer;) LABEL (L10) - LINENUMBER (46) + LINENUMBER (47) NOP LABEL (L11) POP @@ -128,7 +128,7 @@ public final class IntrinsicsKt : java/lang/Object { INVOKEVIRTUAL (Simple$Companion, serializer, ()Lkotlinx/serialization/KSerializer;) INVOKESPECIAL (kotlinx/serialization/internal/ArrayListSerializer, , (Lkotlinx/serialization/KSerializer;)V) LABEL (L14) - LINENUMBER (47) + LINENUMBER (48) NOP LABEL (L15) POP @@ -154,7 +154,7 @@ public final class IntrinsicsKt : java/lang/Object { INVOKEVIRTUAL (Box$Companion, serializer, (Lkotlinx/serialization/KSerializer;)Lkotlinx/serialization/KSerializer;) INVOKESPECIAL (kotlinx/serialization/internal/ArrayListSerializer, , (Lkotlinx/serialization/KSerializer;)V) LABEL (L18) - LINENUMBER (48) + LINENUMBER (49) NOP LABEL (L19) POP @@ -179,7 +179,7 @@ public final class IntrinsicsKt : java/lang/Object { INVOKESPECIAL (kotlinx/serialization/internal/ArrayListSerializer, , (Lkotlinx/serialization/KSerializer;)V) INVOKESPECIAL (kotlinx/serialization/internal/ArrayListSerializer, , (Lkotlinx/serialization/KSerializer;)V) LABEL (L22) - LINENUMBER (49) + LINENUMBER (50) NOP LABEL (L23) POP @@ -265,4 +265,4 @@ public final class Simple : java/lang/Object { public final java.lang.String getLastName() public final static void write$Self(Simple self, kotlinx.serialization.encoding.CompositeEncoder output, kotlinx.serialization.descriptors.SerialDescriptor serialDesc) -} \ No newline at end of file +} diff --git a/plugins/kotlinx-serialization/testData/codegen/Intrinsics.txt b/plugins/kotlinx-serialization/testData/codegen/Intrinsics.asm.txt similarity index 98% rename from plugins/kotlinx-serialization/testData/codegen/Intrinsics.txt rename to plugins/kotlinx-serialization/testData/codegen/Intrinsics.asm.txt index 6ea07e8a4f9..12dfb0a00a5 100644 --- a/plugins/kotlinx-serialization/testData/codegen/Intrinsics.txt +++ b/plugins/kotlinx-serialization/testData/codegen/Intrinsics.asm.txt @@ -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 (50) + LINENUMBER (51) INVOKESTATIC (kotlinx/serialization/SerializersKt, serializer, (Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer;) ASTORE (1) LABEL (L3) ICONST_0 ISTORE (2) LABEL (L4) - LINENUMBER (51) + LINENUMBER (52) ALOAD (1) LDC (null cannot be cast to non-null type kotlinx.serialization.KSerializer) INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNull, (Ljava/lang/Object;Ljava/lang/String;)V) LABEL (L5) - LINENUMBER (50) + LINENUMBER (51) NOP LABEL (L6) LINENUMBER (29) ICONST_0 ISTORE (0) LABEL (L7) - LINENUMBER (52) + LINENUMBER (53) ICONST_0 ISTORE (1) LABEL (L8) LDC (LSimple;) INVOKESTATIC (kotlin/jvm/internal/Reflection, typeOf, (Ljava/lang/Class;)Lkotlin/reflect/KType;) LABEL (L9) - LINENUMBER (53) + LINENUMBER (54) INVOKESTATIC (kotlinx/serialization/SerializersKt, serializer, (Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer;) ASTORE (2) LABEL (L10) ICONST_0 ISTORE (3) LABEL (L11) - LINENUMBER (54) + LINENUMBER (55) ALOAD (2) LDC (null cannot be cast to non-null type kotlinx.serialization.KSerializer) INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNull, (Ljava/lang/Object;Ljava/lang/String;)V) LABEL (L12) - LINENUMBER (53) + LINENUMBER (54) NOP LABEL (L13) - LINENUMBER (52) + LINENUMBER (53) NOP LABEL (L14) LINENUMBER (30) ICONST_0 ISTORE (0) LABEL (L15) - LINENUMBER (55) + LINENUMBER (56) 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 (56) + LINENUMBER (57) INVOKESTATIC (kotlinx/serialization/SerializersKt, serializer, (Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer;) ASTORE (2) LABEL (L18) ICONST_0 ISTORE (3) LABEL (L19) - LINENUMBER (57) + LINENUMBER (58) ALOAD (2) LDC (null cannot be cast to non-null type kotlinx.serialization.KSerializer) INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNull, (Ljava/lang/Object;Ljava/lang/String;)V) LABEL (L20) - LINENUMBER (56) + LINENUMBER (57) NOP LABEL (L21) - LINENUMBER (55) + LINENUMBER (56) NOP LABEL (L22) LINENUMBER (31) ICONST_0 ISTORE (0) LABEL (L23) - LINENUMBER (58) + LINENUMBER (59) 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 (59) + LINENUMBER (60) INVOKESTATIC (kotlinx/serialization/SerializersKt, serializer, (Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer;) ASTORE (2) LABEL (L26) ICONST_0 ISTORE (3) LABEL (L27) - LINENUMBER (60) + LINENUMBER (61) ALOAD (2) LDC (null cannot be cast to non-null type kotlinx.serialization.KSerializer) INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNull, (Ljava/lang/Object;Ljava/lang/String;)V) LABEL (L28) - LINENUMBER (59) + LINENUMBER (60) NOP LABEL (L29) - LINENUMBER (58) + LINENUMBER (59) NOP LABEL (L30) LINENUMBER (32) ICONST_0 ISTORE (0) LABEL (L31) - LINENUMBER (61) + LINENUMBER (62) 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 (62) + LINENUMBER (63) INVOKESTATIC (kotlinx/serialization/SerializersKt, serializer, (Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer;) ASTORE (2) LABEL (L34) ICONST_0 ISTORE (3) LABEL (L35) - LINENUMBER (63) + LINENUMBER (64) ALOAD (2) LDC (null cannot be cast to non-null type kotlinx.serialization.KSerializer) INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNull, (Ljava/lang/Object;Ljava/lang/String;)V) LABEL (L36) - LINENUMBER (62) + LINENUMBER (63) NOP LABEL (L37) - LINENUMBER (61) + LINENUMBER (62) 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 (64) + LINENUMBER (65) INVOKESTATIC (kotlinx/serialization/SerializersKt, serializer, (Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer;) ASTORE (1) LABEL (L41) ICONST_0 ISTORE (2) LABEL (L42) - LINENUMBER (65) + LINENUMBER (66) ALOAD (1) LDC (null cannot be cast to non-null type kotlinx.serialization.KSerializer) INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNull, (Ljava/lang/Object;Ljava/lang/String;)V) LABEL (L43) - LINENUMBER (64) + LINENUMBER (65) NOP LABEL (L44) LINENUMBER (36) ICONST_0 ISTORE (0) LABEL (L45) - LINENUMBER (66) + LINENUMBER (67) 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 (67) + LINENUMBER (68) INVOKESTATIC (kotlinx/serialization/SerializersKt, serializer, (Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer;) ASTORE (2) LABEL (L48) ICONST_0 ISTORE (3) LABEL (L49) - LINENUMBER (68) + LINENUMBER (69) ALOAD (2) LDC (null cannot be cast to non-null type kotlinx.serialization.KSerializer) INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNull, (Ljava/lang/Object;Ljava/lang/String;)V) LABEL (L50) - LINENUMBER (67) + LINENUMBER (68) NOP LABEL (L51) - LINENUMBER (66) + LINENUMBER (67) 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 (69) + LINENUMBER (70) INVOKESTATIC (kotlinx/serialization/SerializersKt, serializer, (Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer;) ASTORE (1) LABEL (L55) ICONST_0 ISTORE (2) LABEL (L56) - LINENUMBER (70) + LINENUMBER (71) ALOAD (1) LDC (null cannot be cast to non-null type kotlinx.serialization.KSerializer) INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNull, (Ljava/lang/Object;Ljava/lang/String;)V) LABEL (L57) - LINENUMBER (69) + LINENUMBER (70) 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 (71) + LINENUMBER (72) INVOKESTATIC (kotlinx/serialization/SerializersKt, serializer, (Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer;) ASTORE (1) LABEL (L61) ICONST_0 ISTORE (2) LABEL (L62) - LINENUMBER (72) + LINENUMBER (73) ALOAD (1) LDC (null cannot be cast to non-null type kotlinx.serialization.KSerializer) INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNull, (Ljava/lang/Object;Ljava/lang/String;)V) LABEL (L63) - LINENUMBER (71) + LINENUMBER (72) NOP LABEL (L64) LINENUMBER (42) ICONST_0 ISTORE (0) LABEL (L65) - LINENUMBER (73) + LINENUMBER (74) ICONST_0 ISTORE (1) LABEL (L66) @@ -357,22 +357,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 (L67) - LINENUMBER (74) + LINENUMBER (75) INVOKESTATIC (kotlinx/serialization/SerializersKt, serializer, (Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer;) ASTORE (2) LABEL (L68) ICONST_0 ISTORE (3) LABEL (L69) - LINENUMBER (75) + LINENUMBER (76) ALOAD (2) LDC (null cannot be cast to non-null type kotlinx.serialization.KSerializer) INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNull, (Ljava/lang/Object;Ljava/lang/String;)V) LABEL (L70) - LINENUMBER (74) + LINENUMBER (75) NOP LABEL (L71) - LINENUMBER (73) + LINENUMBER (74) NOP LABEL (L72) LINENUMBER (43) diff --git a/plugins/kotlinx-serialization/testData/codegen/Intrinsics.kt b/plugins/kotlinx-serialization/testData/codegen/Intrinsics.kt index 6f4e3ad3e00..80f9e52b551 100644 --- a/plugins/kotlinx-serialization/testData/codegen/Intrinsics.kt +++ b/plugins/kotlinx-serialization/testData/codegen/Intrinsics.kt @@ -1,4 +1,4 @@ -// CURIOUS_ABOUT test +// CURIOUS_ABOUT: test // WITH_STDLIB import kotlinx.serialization.* diff --git a/plugins/kotlinx-serialization/testData/codegen/IntrinsicsAdvanced.asm.ir.txt b/plugins/kotlinx-serialization/testData/codegen/IntrinsicsAdvanced.asm.ir.txt new file mode 100644 index 00000000000..2db435ee5b5 --- /dev/null +++ b/plugins/kotlinx-serialization/testData/codegen/IntrinsicsAdvanced.asm.ir.txt @@ -0,0 +1,203 @@ +public final class IntrinsicsAdvancedKt : java/lang/Object { + private final static kotlinx.serialization.modules.SerializersModule module + + static void () + + public final static kotlinx.serialization.modules.SerializersModule getModule() + + public final static kotlinx.serialization.KSerializer getSer(kotlinx.serialization.modules.SerializersModule module) { + LABEL (L0) + ALOAD (0) + LDC (module) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + ICONST_0 + ISTORE (1) + LABEL (L1) + LINENUMBER (18) + ALOAD (0) + ASTORE (2) + BIPUSH (7) + LDC (T) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, reifiedOperationMarker, (ILjava/lang/String;)V) + ALOAD (2) + INVOKESTATIC (kotlinx/serialization/SerializersKt, serializer, (Lkotlinx/serialization/modules/SerializersModule;)Lkotlinx/serialization/KSerializer;) + ARETURN + LABEL (L2) + } + + public final static void test() { + LABEL (L0) + LINENUMBER (22) + GETSTATIC (IntrinsicsAdvancedKt, module, Lkotlinx/serialization/modules/SerializersModule;) + POP + GETSTATIC (Simple, Companion, LSimple$Companion;) + INVOKEVIRTUAL (Simple$Companion, serializer, ()Lkotlinx/serialization/KSerializer;) + POP + LABEL (L1) + LINENUMBER (23) + GETSTATIC (IntrinsicsAdvancedKt, module, Lkotlinx/serialization/modules/SerializersModule;) + LDC (LNoSer;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, getOrCreateKotlinClass, (Ljava/lang/Class;)Lkotlin/reflect/KClass;) + INVOKESTATIC (kotlinx/serialization/SerializersKt, noCompiledSerializer, (Lkotlinx/serialization/modules/SerializersModule;Lkotlin/reflect/KClass;)Lkotlinx/serialization/KSerializer;) + POP + LABEL (L2) + LINENUMBER (24) + GETSTATIC (IntrinsicsAdvancedKt, module, Lkotlinx/serialization/modules/SerializersModule;) + POP + NEW (kotlinx/serialization/internal/ArrayListSerializer) + DUP + GETSTATIC (Simple$$serializer, INSTANCE, LSimple$$serializer;) + INVOKESPECIAL (kotlinx/serialization/internal/ArrayListSerializer, , (Lkotlinx/serialization/KSerializer;)V) + POP + LABEL (L3) + LINENUMBER (25) + GETSTATIC (IntrinsicsAdvancedKt, module, Lkotlinx/serialization/modules/SerializersModule;) + ASTORE (0) + NEW (kotlinx/serialization/internal/ArrayListSerializer) + DUP + ALOAD (0) + LDC (LNoSer;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, getOrCreateKotlinClass, (Ljava/lang/Class;)Lkotlin/reflect/KClass;) + INVOKESTATIC (kotlinx/serialization/SerializersKt, noCompiledSerializer, (Lkotlinx/serialization/modules/SerializersModule;Lkotlin/reflect/KClass;)Lkotlinx/serialization/KSerializer;) + INVOKESPECIAL (kotlinx/serialization/internal/ArrayListSerializer, , (Lkotlinx/serialization/KSerializer;)V) + POP + LABEL (L4) + LINENUMBER (27) + GETSTATIC (IntrinsicsAdvancedKt, module, Lkotlinx/serialization/modules/SerializersModule;) + ASTORE (0) + LABEL (L5) + ICONST_0 + ISTORE (1) + LABEL (L6) + LINENUMBER (34) + GETSTATIC (Simple, Companion, LSimple$Companion;) + INVOKEVIRTUAL (Simple$Companion, serializer, ()Lkotlinx/serialization/KSerializer;) + LABEL (L7) + POP + LABEL (L8) + LINENUMBER (28) + GETSTATIC (IntrinsicsAdvancedKt, module, Lkotlinx/serialization/modules/SerializersModule;) + ASTORE (0) + LABEL (L9) + ICONST_0 + ISTORE (1) + LABEL (L10) + LINENUMBER (35) + ALOAD (0) + LDC (LNoSer;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, getOrCreateKotlinClass, (Ljava/lang/Class;)Lkotlin/reflect/KClass;) + INVOKESTATIC (kotlinx/serialization/SerializersKt, noCompiledSerializer, (Lkotlinx/serialization/modules/SerializersModule;Lkotlin/reflect/KClass;)Lkotlinx/serialization/KSerializer;) + LABEL (L11) + POP + LABEL (L12) + LINENUMBER (30) + GETSTATIC (IntrinsicsAdvancedKt, module, Lkotlinx/serialization/modules/SerializersModule;) + ASTORE (0) + LABEL (L13) + ICONST_0 + ISTORE (1) + LABEL (L14) + LINENUMBER (36) + ALOAD (0) + LDC (LNoSerGeneric;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, getOrCreateKotlinClass, (Ljava/lang/Class;)Lkotlin/reflect/KClass;) + ICONST_1 + ANEWARRAY (kotlinx/serialization/KSerializer) + DUP + ICONST_0 + GETSTATIC (Simple$$serializer, INSTANCE, LSimple$$serializer;) + AASTORE + INVOKESTATIC (kotlinx/serialization/SerializersKt, noCompiledSerializer, (Lkotlinx/serialization/modules/SerializersModule;Lkotlin/reflect/KClass;[Lkotlinx/serialization/KSerializer;)Lkotlinx/serialization/KSerializer;) + LABEL (L15) + POP + LABEL (L16) + LINENUMBER (31) + GETSTATIC (IntrinsicsAdvancedKt, module, Lkotlinx/serialization/modules/SerializersModule;) + ASTORE (0) + LABEL (L17) + ICONST_0 + ISTORE (1) + LABEL (L18) + LINENUMBER (37) + ALOAD (0) + ASTORE (2) + ALOAD (2) + LDC (LNoSerGeneric;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, getOrCreateKotlinClass, (Ljava/lang/Class;)Lkotlin/reflect/KClass;) + ICONST_1 + ANEWARRAY (kotlinx/serialization/KSerializer) + DUP + ICONST_0 + ALOAD (2) + LDC (LNoSer;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, getOrCreateKotlinClass, (Ljava/lang/Class;)Lkotlin/reflect/KClass;) + INVOKESTATIC (kotlinx/serialization/SerializersKt, noCompiledSerializer, (Lkotlinx/serialization/modules/SerializersModule;Lkotlin/reflect/KClass;)Lkotlinx/serialization/KSerializer;) + AASTORE + INVOKESTATIC (kotlinx/serialization/SerializersKt, noCompiledSerializer, (Lkotlinx/serialization/modules/SerializersModule;Lkotlin/reflect/KClass;[Lkotlinx/serialization/KSerializer;)Lkotlinx/serialization/KSerializer;) + LABEL (L19) + POP + LABEL (L20) + LINENUMBER (32) + RETURN + } +} + +public final class NoSer : java/lang/Object { + public void () +} + +public final class NoSerGeneric : java/lang/Object { + public void () +} + +public final class Simple$$serializer : java/lang/Object, kotlinx/serialization/internal/GeneratedSerializer { + public final static Simple$$serializer INSTANCE + + private final static kotlinx.serialization.internal.PluginGeneratedSerialDescriptor descriptor + + static void () + + private void () + + public kotlinx.serialization.KSerializer[] childSerializers() + + public Simple deserialize(kotlinx.serialization.encoding.Decoder decoder) + + public java.lang.Object deserialize(kotlinx.serialization.encoding.Decoder decoder) + + public kotlinx.serialization.descriptors.SerialDescriptor getDescriptor() + + public void serialize(kotlinx.serialization.encoding.Encoder encoder, Simple value) + + public void serialize(kotlinx.serialization.encoding.Encoder encoder, java.lang.Object value) + + public kotlinx.serialization.KSerializer[] typeParametersSerializers() +} + +public final class Simple$Companion : java/lang/Object { + private void () + + public void (kotlin.jvm.internal.DefaultConstructorMarker $constructor_marker) + + public final kotlinx.serialization.KSerializer serializer() +} + +public final class Simple : java/lang/Object { + public final static Simple$Companion Companion + + private final java.lang.String firstName + + private final java.lang.String lastName + + static void () + + public void (java.lang.String firstName, java.lang.String lastName) + + public void (int seen1, java.lang.String firstName, java.lang.String lastName, kotlinx.serialization.internal.SerializationConstructorMarker serializationConstructorMarker) + + public final java.lang.String getFirstName() + + public final java.lang.String getLastName() + + public final static void write$Self(Simple self, kotlinx.serialization.encoding.CompositeEncoder output, kotlinx.serialization.descriptors.SerialDescriptor serialDesc) +} diff --git a/plugins/kotlinx-serialization/testData/codegen/IntrinsicsAdvanced.asm.txt b/plugins/kotlinx-serialization/testData/codegen/IntrinsicsAdvanced.asm.txt new file mode 100644 index 00000000000..d90f27167ac --- /dev/null +++ b/plugins/kotlinx-serialization/testData/codegen/IntrinsicsAdvanced.asm.txt @@ -0,0 +1,372 @@ +public final class IntrinsicsAdvancedKt : java/lang/Object { + private final static kotlinx.serialization.modules.SerializersModule module + + static void () + + public final static kotlinx.serialization.modules.SerializersModule getModule() + + public final static kotlinx.serialization.KSerializer getSer(kotlinx.serialization.modules.SerializersModule module) { + LABEL (L0) + LDC (0) + ISTORE (1) + LABEL (L1) + ALOAD (0) + LDC (module) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V) + LABEL (L2) + LINENUMBER (18) + ALOAD (0) + ASTORE (2) + LABEL (L3) + ICONST_0 + ISTORE (3) + LABEL (L4) + LINENUMBER (34) + ALOAD (2) + BIPUSH (6) + LDC (T) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, reifiedOperationMarker, (ILjava/lang/String;)V) + ACONST_NULL + INVOKESTATIC (kotlinx/serialization/SerializersKt, serializer, (Lkotlinx/serialization/modules/SerializersModule;Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer;) + ASTORE (4) + LABEL (L5) + ICONST_0 + ISTORE (5) + LABEL (L6) + LINENUMBER (35) + ALOAD (4) + LDC (null cannot be cast to non-null type kotlinx.serialization.KSerializer) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNull, (Ljava/lang/Object;Ljava/lang/String;)V) + ALOAD (4) + CHECKCAST (kotlinx/serialization/KSerializer) + LABEL (L7) + LINENUMBER (34) + NOP + LABEL (L8) + LINENUMBER (18) + ARETURN + LABEL (L9) + } + + public final static void test() { + LABEL (L0) + LINENUMBER (22) + GETSTATIC (IntrinsicsAdvancedKt, module, Lkotlinx/serialization/modules/SerializersModule;) + ASTORE (0) + LABEL (L1) + ICONST_0 + ISTORE (1) + LABEL (L2) + LINENUMBER (36) + ALOAD (0) + LDC (LSimple;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, typeOf, (Ljava/lang/Class;)Lkotlin/reflect/KType;) + INVOKESTATIC (kotlinx/serialization/SerializersKt, serializer, (Lkotlinx/serialization/modules/SerializersModule;Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer;) + ASTORE (2) + LABEL (L3) + ICONST_0 + ISTORE (3) + LABEL (L4) + LINENUMBER (37) + ALOAD (2) + LDC (null cannot be cast to non-null type kotlinx.serialization.KSerializer) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNull, (Ljava/lang/Object;Ljava/lang/String;)V) + LABEL (L5) + LINENUMBER (36) + NOP + LABEL (L6) + LINENUMBER (23) + GETSTATIC (IntrinsicsAdvancedKt, module, Lkotlinx/serialization/modules/SerializersModule;) + ASTORE (0) + LABEL (L7) + ICONST_0 + ISTORE (1) + LABEL (L8) + LINENUMBER (38) + ALOAD (0) + LDC (LNoSer;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, typeOf, (Ljava/lang/Class;)Lkotlin/reflect/KType;) + INVOKESTATIC (kotlinx/serialization/SerializersKt, serializer, (Lkotlinx/serialization/modules/SerializersModule;Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer;) + ASTORE (2) + LABEL (L9) + ICONST_0 + ISTORE (3) + LABEL (L10) + LINENUMBER (39) + ALOAD (2) + LDC (null cannot be cast to non-null type kotlinx.serialization.KSerializer) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNull, (Ljava/lang/Object;Ljava/lang/String;)V) + LABEL (L11) + LINENUMBER (38) + NOP + LABEL (L12) + LINENUMBER (24) + GETSTATIC (IntrinsicsAdvancedKt, module, Lkotlinx/serialization/modules/SerializersModule;) + ASTORE (0) + LABEL (L13) + ICONST_0 + ISTORE (1) + LABEL (L14) + LINENUMBER (40) + ALOAD (0) + LDC (Ljava/util/List;) + GETSTATIC (kotlin/reflect/KTypeProjection, Companion, Lkotlin/reflect/KTypeProjection$Companion;) + LDC (LSimple;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, typeOf, (Ljava/lang/Class;)Lkotlin/reflect/KType;) + 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;) + INVOKESTATIC (kotlinx/serialization/SerializersKt, serializer, (Lkotlinx/serialization/modules/SerializersModule;Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer;) + ASTORE (2) + LABEL (L15) + ICONST_0 + ISTORE (3) + LABEL (L16) + LINENUMBER (41) + ALOAD (2) + LDC (null cannot be cast to non-null type kotlinx.serialization.KSerializer) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNull, (Ljava/lang/Object;Ljava/lang/String;)V) + LABEL (L17) + LINENUMBER (40) + NOP + LABEL (L18) + LINENUMBER (25) + GETSTATIC (IntrinsicsAdvancedKt, module, Lkotlinx/serialization/modules/SerializersModule;) + ASTORE (0) + LABEL (L19) + ICONST_0 + ISTORE (1) + LABEL (L20) + LINENUMBER (42) + ALOAD (0) + LDC (Ljava/util/List;) + GETSTATIC (kotlin/reflect/KTypeProjection, Companion, Lkotlin/reflect/KTypeProjection$Companion;) + LDC (LNoSer;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, typeOf, (Ljava/lang/Class;)Lkotlin/reflect/KType;) + 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;) + INVOKESTATIC (kotlinx/serialization/SerializersKt, serializer, (Lkotlinx/serialization/modules/SerializersModule;Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer;) + ASTORE (2) + LABEL (L21) + ICONST_0 + ISTORE (3) + LABEL (L22) + LINENUMBER (43) + ALOAD (2) + LDC (null cannot be cast to non-null type kotlinx.serialization.KSerializer) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNull, (Ljava/lang/Object;Ljava/lang/String;)V) + LABEL (L23) + LINENUMBER (42) + NOP + LABEL (L24) + LINENUMBER (27) + GETSTATIC (IntrinsicsAdvancedKt, module, Lkotlinx/serialization/modules/SerializersModule;) + ASTORE (0) + LABEL (L25) + ICONST_0 + ISTORE (1) + LABEL (L26) + LINENUMBER (44) + ALOAD (0) + ASTORE (2) + LABEL (L27) + ICONST_0 + ISTORE (3) + LABEL (L28) + LINENUMBER (45) + ALOAD (2) + LDC (LSimple;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, typeOf, (Ljava/lang/Class;)Lkotlin/reflect/KType;) + INVOKESTATIC (kotlinx/serialization/SerializersKt, serializer, (Lkotlinx/serialization/modules/SerializersModule;Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer;) + ASTORE (4) + LABEL (L29) + ICONST_0 + ISTORE (5) + LABEL (L30) + LINENUMBER (46) + ALOAD (4) + LDC (null cannot be cast to non-null type kotlinx.serialization.KSerializer) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNull, (Ljava/lang/Object;Ljava/lang/String;)V) + LABEL (L31) + LINENUMBER (45) + NOP + LABEL (L32) + LINENUMBER (44) + NOP + LABEL (L33) + LINENUMBER (28) + GETSTATIC (IntrinsicsAdvancedKt, module, Lkotlinx/serialization/modules/SerializersModule;) + ASTORE (0) + LABEL (L34) + ICONST_0 + ISTORE (1) + LABEL (L35) + LINENUMBER (47) + ALOAD (0) + ASTORE (2) + LABEL (L36) + ICONST_0 + ISTORE (3) + LABEL (L37) + LINENUMBER (48) + ALOAD (2) + LDC (LNoSer;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, typeOf, (Ljava/lang/Class;)Lkotlin/reflect/KType;) + INVOKESTATIC (kotlinx/serialization/SerializersKt, serializer, (Lkotlinx/serialization/modules/SerializersModule;Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer;) + ASTORE (4) + LABEL (L38) + ICONST_0 + ISTORE (5) + LABEL (L39) + LINENUMBER (49) + ALOAD (4) + LDC (null cannot be cast to non-null type kotlinx.serialization.KSerializer) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNull, (Ljava/lang/Object;Ljava/lang/String;)V) + LABEL (L40) + LINENUMBER (48) + NOP + LABEL (L41) + LINENUMBER (47) + NOP + LABEL (L42) + LINENUMBER (30) + GETSTATIC (IntrinsicsAdvancedKt, module, Lkotlinx/serialization/modules/SerializersModule;) + ASTORE (0) + LABEL (L43) + ICONST_0 + ISTORE (1) + LABEL (L44) + LINENUMBER (50) + ALOAD (0) + ASTORE (2) + LABEL (L45) + ICONST_0 + ISTORE (3) + LABEL (L46) + LINENUMBER (51) + ALOAD (2) + LDC (LNoSerGeneric;) + GETSTATIC (kotlin/reflect/KTypeProjection, Companion, Lkotlin/reflect/KTypeProjection$Companion;) + LDC (LSimple;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, typeOf, (Ljava/lang/Class;)Lkotlin/reflect/KType;) + 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;) + INVOKESTATIC (kotlinx/serialization/SerializersKt, serializer, (Lkotlinx/serialization/modules/SerializersModule;Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer;) + ASTORE (4) + LABEL (L47) + ICONST_0 + ISTORE (5) + LABEL (L48) + LINENUMBER (52) + ALOAD (4) + LDC (null cannot be cast to non-null type kotlinx.serialization.KSerializer) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNull, (Ljava/lang/Object;Ljava/lang/String;)V) + LABEL (L49) + LINENUMBER (51) + NOP + LABEL (L50) + LINENUMBER (50) + NOP + LABEL (L51) + LINENUMBER (31) + GETSTATIC (IntrinsicsAdvancedKt, module, Lkotlinx/serialization/modules/SerializersModule;) + ASTORE (0) + LABEL (L52) + ICONST_0 + ISTORE (1) + LABEL (L53) + LINENUMBER (53) + ALOAD (0) + ASTORE (2) + LABEL (L54) + ICONST_0 + ISTORE (3) + LABEL (L55) + LINENUMBER (54) + ALOAD (2) + LDC (LNoSerGeneric;) + GETSTATIC (kotlin/reflect/KTypeProjection, Companion, Lkotlin/reflect/KTypeProjection$Companion;) + LDC (LNoSer;) + INVOKESTATIC (kotlin/jvm/internal/Reflection, typeOf, (Ljava/lang/Class;)Lkotlin/reflect/KType;) + 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;) + INVOKESTATIC (kotlinx/serialization/SerializersKt, serializer, (Lkotlinx/serialization/modules/SerializersModule;Lkotlin/reflect/KType;)Lkotlinx/serialization/KSerializer;) + ASTORE (4) + LABEL (L56) + ICONST_0 + ISTORE (5) + LABEL (L57) + LINENUMBER (55) + ALOAD (4) + LDC (null cannot be cast to non-null type kotlinx.serialization.KSerializer) + INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNull, (Ljava/lang/Object;Ljava/lang/String;)V) + LABEL (L58) + LINENUMBER (54) + NOP + LABEL (L59) + LINENUMBER (53) + NOP + LABEL (L60) + LINENUMBER (32) + RETURN + } +} + +public final class NoSer : java/lang/Object { + public void () +} + +public final class NoSerGeneric : java/lang/Object { + public void () +} + +public final class Simple$$serializer : java/lang/Object, kotlinx/serialization/internal/GeneratedSerializer { + private final static kotlinx.serialization.descriptors.SerialDescriptor $$serialDesc + + public final static Simple$$serializer INSTANCE + + static void () + + private void () + + public kotlinx.serialization.KSerializer[] childSerializers() + + public Simple deserialize(kotlinx.serialization.encoding.Decoder decoder) + + public java.lang.Object deserialize(kotlinx.serialization.encoding.Decoder p0) + + public kotlinx.serialization.descriptors.SerialDescriptor getDescriptor() + + public void serialize(kotlinx.serialization.encoding.Encoder encoder, Simple value) + + public void serialize(kotlinx.serialization.encoding.Encoder p0, java.lang.Object p1) + + public kotlinx.serialization.KSerializer[] typeParametersSerializers() +} + +public final class Simple$Companion : java/lang/Object { + private void () + + public void (kotlin.jvm.internal.DefaultConstructorMarker $constructor_marker) + + public final kotlinx.serialization.KSerializer serializer() +} + +public final class Simple : java/lang/Object { + public final static Simple$Companion Companion + + private final java.lang.String firstName + + private final java.lang.String lastName + + static void () + + public void (java.lang.String firstName, java.lang.String lastName) + + public void (int seen1, java.lang.String firstName, java.lang.String lastName, kotlinx.serialization.internal.SerializationConstructorMarker serializationConstructorMarker) + + public final java.lang.String getFirstName() + + public final java.lang.String getLastName() + + public final static void write$Self(Simple self, kotlinx.serialization.encoding.CompositeEncoder output, kotlinx.serialization.descriptors.SerialDescriptor serialDesc) +} diff --git a/plugins/kotlinx-serialization/testData/codegen/IntrinsicsAdvanced.kt b/plugins/kotlinx-serialization/testData/codegen/IntrinsicsAdvanced.kt new file mode 100644 index 00000000000..a47f022595b --- /dev/null +++ b/plugins/kotlinx-serialization/testData/codegen/IntrinsicsAdvanced.kt @@ -0,0 +1,32 @@ +// CURIOUS_ABOUT: test, getSer +// WITH_STDLIB + +import kotlinx.serialization.* +import kotlinx.serialization.json.* +import kotlinx.serialization.modules.* + +@Serializable +class Simple(val firstName: String, val lastName: String) + +class NoSer + +class NoSerGeneric + +val module = SerializersModule {} + +inline fun getSer(module: SerializersModule): KSerializer { + return module.serializer() +} + +fun test() { + module.serializer() + module.serializer() + module.serializer>() + module.serializer>() + + getSer(module) + getSer(module) + + getSer>(module) + getSer>(module) +} \ No newline at end of file diff --git a/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationAsmLikeInstructionsListingTestGenerated.java b/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationAsmLikeInstructionsListingTestGenerated.java index 780e19e44d3..e5ffcc7a791 100644 --- a/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationAsmLikeInstructionsListingTestGenerated.java +++ b/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationAsmLikeInstructionsListingTestGenerated.java @@ -43,6 +43,12 @@ public class SerializationAsmLikeInstructionsListingTestGenerated extends Abstra runTest("plugins/kotlinx-serialization/testData/codegen/Intrinsics.kt"); } + @Test + @TestMetadata("IntrinsicsAdvanced.kt") + public void testIntrinsicsAdvanced() throws Exception { + runTest("plugins/kotlinx-serialization/testData/codegen/IntrinsicsAdvanced.kt"); + } + @Test @TestMetadata("Sealed.kt") public void testSealed() throws Exception { diff --git a/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirBlackBoxTestGenerated.java b/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirBlackBoxTestGenerated.java index 0dc1428b2b8..073e836120b 100644 --- a/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirBlackBoxTestGenerated.java +++ b/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationFirBlackBoxTestGenerated.java @@ -57,6 +57,12 @@ public class SerializationFirBlackBoxTestGenerated extends AbstractSerialization runTest("plugins/kotlinx-serialization/testData/boxIr/inlineClasses.kt"); } + @Test + @TestMetadata("intrinsicsBox.kt") + public void testIntrinsicsBox() throws Exception { + runTest("plugins/kotlinx-serialization/testData/boxIr/intrinsicsBox.kt"); + } + @Test @TestMetadata("metaSerializable.kt") public void testMetaSerializable() throws Exception { diff --git a/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationIrAsmLikeInstructionsListingTestGenerated.java b/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationIrAsmLikeInstructionsListingTestGenerated.java index 5ae9d3c1538..03a5291e6b4 100644 --- a/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationIrAsmLikeInstructionsListingTestGenerated.java +++ b/plugins/kotlinx-serialization/tests-gen/org/jetbrains/kotlinx/serialization/runners/SerializationIrAsmLikeInstructionsListingTestGenerated.java @@ -43,6 +43,12 @@ public class SerializationIrAsmLikeInstructionsListingTestGenerated extends Abst runTest("plugins/kotlinx-serialization/testData/codegen/Intrinsics.kt"); } + @Test + @TestMetadata("IntrinsicsAdvanced.kt") + public void testIntrinsicsAdvanced() throws Exception { + runTest("plugins/kotlinx-serialization/testData/codegen/IntrinsicsAdvanced.kt"); + } + @Test @TestMetadata("Sealed.kt") public void testSealed() throws Exception {