Pass actual serializable properties count in the generated code

to SerialClassDescImpl.
This is needed to optimize space allocation.
This commit is contained in:
Leonid Startsev
2020-01-17 20:12:31 +03:00
parent 9558538d15
commit db4273d677
7 changed files with 14 additions and 8 deletions
@@ -76,6 +76,7 @@ class SerializerForEnumsGenerator(
return irInvoke(
null, ctor,
irString(serialName),
irInt(serializableDescriptor.enumEntries().size),
typeHint = ctor.descriptor.returnType.toIrType()
)
}
@@ -110,7 +110,7 @@ open class SerializerIrGenerator(val irClass: IrClass, final override val compil
val serialClassDescImplCtor = compilerContext.symbolTable.referenceConstructor(serialDescImplConstructor)
return irInvoke(
null, serialClassDescImplCtor,
irString(serialName), if (isGeneratedSerializer) correctThis else irNull()
irString(serialName), if (isGeneratedSerializer) correctThis else irNull(), irInt(serializableProperties.size)
)
}
@@ -53,7 +53,7 @@ class SerializerForEnumsTranslator(
val ctor = serialDescForEnums.unsubstitutedPrimaryConstructor!!
return JsNew(
context.getInnerReference(ctor),
listOf(JsStringLiteral(serialName))
listOf(JsStringLiteral(serialName), JsIntLiteral(serializableDescriptor.enumEntries().size))
)
}
@@ -83,7 +83,7 @@ open class SerializerJsTranslator(
val serialDescImplConstructor = baseSerialDescImplClass.unsubstitutedPrimaryConstructor!!
return JsNew(
context.getInnerReference(serialDescImplConstructor),
listOf(JsStringLiteral(serialName), if (isGeneratedSerializer) correctThis else JsNullLiteral())
listOf(JsStringLiteral(serialName), if (isGeneratedSerializer) correctThis else JsNullLiteral(), JsIntLiteral(serializableProperties.size))
)
}
@@ -110,7 +110,8 @@ open class SerializerCodegenImpl(
} else {
load(0, serializerAsmType)
}
invokespecial(descImplType.internalName, "<init>", "(Ljava/lang/String;${generatedSerializerType.descriptor})V", false)
aconst(serializableProperties.size)
invokespecial(descImplType.internalName, "<init>", "(Ljava/lang/String;${generatedSerializerType.descriptor}I)V", false)
}
protected open fun ExpressionCodegen.addElementsContentToDescriptor(descriptorVar: Int) = with(v) {
@@ -46,7 +46,8 @@ class SerializerForEnumsCodegen(
anew(descriptorForEnumsType)
dup()
aconst(serialName)
invokespecial(descriptorForEnumsType.internalName, "<init>", "(Ljava/lang/String;)V", false)
aconst(serializableDescriptor.enumEntries().size)
invokespecial(descriptorForEnumsType.internalName, "<init>", "(Ljava/lang/String;I)V", false)
checkcast(descImplType)
}
@@ -17,7 +17,8 @@ public final class ListOfUsers$$serializer : java/lang/Object, kotlinx/serializa
LDC (ListOfUsers)
GETSTATIC (INSTANCE, LListOfUsers$$serializer;)
CHECKCAST
INVOKESPECIAL (kotlinx/serialization/internal/SerialClassDescImpl, <init>, (Ljava/lang/String;Lkotlinx/serialization/internal/GeneratedSerializer;)V)
LDC (1)
INVOKESPECIAL (kotlinx/serialization/internal/SerialClassDescImpl, <init>, (Ljava/lang/String;Lkotlinx/serialization/internal/GeneratedSerializer;I)V)
ASTORE (0)
ALOAD (0)
LDC (list)
@@ -317,7 +318,8 @@ public final class OptionalUser$$serializer : java/lang/Object, kotlinx/serializ
LDC (OptionalUser)
GETSTATIC (INSTANCE, LOptionalUser$$serializer;)
CHECKCAST
INVOKESPECIAL (kotlinx/serialization/internal/SerialClassDescImpl, <init>, (Ljava/lang/String;Lkotlinx/serialization/internal/GeneratedSerializer;)V)
LDC (1)
INVOKESPECIAL (kotlinx/serialization/internal/SerialClassDescImpl, <init>, (Ljava/lang/String;Lkotlinx/serialization/internal/GeneratedSerializer;I)V)
ASTORE (0)
ALOAD (0)
LDC (user)
@@ -659,7 +661,8 @@ public final class User$$serializer : java/lang/Object, kotlinx/serialization/in
LDC (User)
GETSTATIC (INSTANCE, LUser$$serializer;)
CHECKCAST
INVOKESPECIAL (kotlinx/serialization/internal/SerialClassDescImpl, <init>, (Ljava/lang/String;Lkotlinx/serialization/internal/GeneratedSerializer;)V)
LDC (2)
INVOKESPECIAL (kotlinx/serialization/internal/SerialClassDescImpl, <init>, (Ljava/lang/String;Lkotlinx/serialization/internal/GeneratedSerializer;I)V)
ASTORE (0)
ALOAD (0)
LDC (firstName)