Also support intrinsification for SerializersModule.serializer<T>()

method that fallbacks to module.getContextual().
This commit is contained in:
Leonid Startsev
2022-08-25 17:38:43 +02:00
committed by Space
parent a59f5f407b
commit aac9a06474
14 changed files with 844 additions and 117 deletions
@@ -298,7 +298,7 @@ class ReifiedTypeInliner<KT : KotlinTypeMarker>(
return true
}
inline private fun rewriteNextTypeInsn(
private inline fun rewriteNextTypeInsn(
marker: MethodInsnNode,
expectedNextOpcode: Int,
rewrite: (AbstractInsnNode) -> Boolean
@@ -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"))
@@ -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<IrType, IrClassSymbol?>, 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<IrType, IrClassSymbol?>, 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
@@ -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(
+15 -12
View File
@@ -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<out T>(val boxed: T)
@Serializable
object SerializableObject {}
inline fun <reified T : Any> getSer(): KSerializer<T> {
return serializer<T>()
val module = SerializersModule {}
inline fun <reified T: Any> getSer(module: SerializersModule): KSerializer<T> {
return module.serializer<T>()
}
inline fun <reified T : Any> getBoxSer(): KSerializer<Box<T>> {
return serializer<Box<T>>()
inline fun <reified T : Any> getBoxSer(module: SerializersModule): KSerializer<Box<T>> {
return module.serializer<Box<T>>()
}
inline fun <reified T : Any> listSer(): KSerializer<List<T>> {
return serializer<List<T>>()
inline fun <reified T : Any> listSer(module: SerializersModule): KSerializer<List<T>> {
return module.serializer<List<T>>()
}
fun SerialDescriptor.recursiveToString(): String {
@@ -46,17 +49,17 @@ fun assertHasSerializers(kSerializer: KSerializer<*>, list: List<String>) {
fun box(): String {
assertHasSerializers(serializer<Simple>(), listOf("Simple"))
assertHasSerializers(getSer<Simple>(), listOf("Simple"))
assertHasSerializers(getSer<Simple>(module), listOf("Simple"))
assertHasSerializers(getSer<Box<Simple>>(), listOf("Box", "Simple"))
assertHasSerializers(getBoxSer<Simple>(), listOf("Box", "Simple"))
assertHasSerializers(getSer<Box<Simple>>(module), listOf("Box", "Simple"))
assertHasSerializers(getBoxSer<Simple>(module), listOf("Box", "Simple"))
assertHasSerializers(listSer<Simple>(), listOf("ArrayList", "Simple"))
assertHasSerializers(listSer<Simple>(module), listOf("ArrayList", "Simple"))
assertHasSerializers(serializer<Box<List<Simple>>>(), listOf("Box", "ArrayList", "Simple"))
assertHasSerializers(listSer<Box<List<Simple>>>(), listOf("ArrayList", "Box", "ArrayList", "Simple"))
assertHasSerializers(listSer<Box<List<Simple>>>(module), listOf("ArrayList", "Box", "ArrayList", "Simple"))
assertHasSerializers(serializer<Int>(), listOf("Int"))
assertHasSerializers(serializer<SerializableObject>(), listOf("SerializableObject"))
assertHasSerializers(listSer<List<Box<Int>>>(), listOf("ArrayList", "ArrayList", "Box", "Int"))
assertHasSerializers(listSer<List<Box<Int>>>(module), listOf("ArrayList", "ArrayList", "Box", "Int"))
return "OK"
}
@@ -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, <init>, (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, <init>, (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, <init>, (Lkotlinx/serialization/KSerializer;)V)
INVOKESPECIAL (kotlinx/serialization/internal/ArrayListSerializer, <init>, (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)
}
}
@@ -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<T of kotlinx.serialization.internal.Platform_commonKt.cast>)
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<T of kotlinx.serialization.internal.Platform_commonKt.cast>)
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<T of kotlinx.serialization.internal.Platform_commonKt.cast>)
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<T of kotlinx.serialization.internal.Platform_commonKt.cast>)
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<T of kotlinx.serialization.internal.Platform_commonKt.cast>)
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<T of kotlinx.serialization.internal.Platform_commonKt.cast>)
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<T of kotlinx.serialization.internal.Platform_commonKt.cast>)
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<T of kotlinx.serialization.internal.Platform_commonKt.cast>)
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<T of kotlinx.serialization.internal.Platform_commonKt.cast>)
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<T of kotlinx.serialization.internal.Platform_commonKt.cast>)
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)
@@ -1,4 +1,4 @@
// CURIOUS_ABOUT test
// CURIOUS_ABOUT: test
// WITH_STDLIB
import kotlinx.serialization.*
@@ -0,0 +1,203 @@
public final class IntrinsicsAdvancedKt : java/lang/Object {
private final static kotlinx.serialization.modules.SerializersModule module
static void <clinit>()
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, <init>, (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, <init>, (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 <init>()
}
public final class NoSerGeneric : java/lang/Object {
public void <init>()
}
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 <clinit>()
private void <init>()
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 <init>()
public void <init>(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 <clinit>()
public void <init>(java.lang.String firstName, java.lang.String lastName)
public void <init>(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)
}
@@ -0,0 +1,372 @@
public final class IntrinsicsAdvancedKt : java/lang/Object {
private final static kotlinx.serialization.modules.SerializersModule module
static void <clinit>()
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<T of kotlinx.serialization.internal.Platform_commonKt.cast>)
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<T of kotlinx.serialization.internal.Platform_commonKt.cast>)
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<T of kotlinx.serialization.internal.Platform_commonKt.cast>)
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<T of kotlinx.serialization.internal.Platform_commonKt.cast>)
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<T of kotlinx.serialization.internal.Platform_commonKt.cast>)
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<T of kotlinx.serialization.internal.Platform_commonKt.cast>)
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<T of kotlinx.serialization.internal.Platform_commonKt.cast>)
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<T of kotlinx.serialization.internal.Platform_commonKt.cast>)
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<T of kotlinx.serialization.internal.Platform_commonKt.cast>)
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 <init>()
}
public final class NoSerGeneric : java/lang/Object {
public void <init>()
}
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 <clinit>()
private void <init>()
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 <init>()
public void <init>(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 <clinit>()
public void <init>(java.lang.String firstName, java.lang.String lastName)
public void <init>(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)
}
@@ -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<T>
val module = SerializersModule {}
inline fun <reified T: Any> getSer(module: SerializersModule): KSerializer<T> {
return module.serializer()
}
fun test() {
module.serializer<Simple>()
module.serializer<NoSer>()
module.serializer<List<Simple>>()
module.serializer<List<NoSer>>()
getSer<Simple>(module)
getSer<NoSer>(module)
getSer<NoSerGeneric<Simple>>(module)
getSer<NoSerGeneric<NoSer>>(module)
}
@@ -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 {
@@ -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 {
@@ -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 {