From 13af0360247a8b8a234ccf4585162564031700c6 Mon Sep 17 00:00:00 2001 From: Leonid Startsev Date: Tue, 4 Dec 2018 13:58:31 +0300 Subject: [PATCH] Fix problem with `encodeUnitElement` : Unit instance is not needed in Native IR --- .../backend/ir/SerializerIrGenerator.kt | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializerIrGenerator.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializerIrGenerator.kt index 06150494f76..b20b40da889 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializerIrGenerator.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/SerializerIrGenerator.kt @@ -193,28 +193,31 @@ class SerializerIrGenerator(val irClass: IrClass, override val compilerContext: for ((index, property) in orderedProperties.filter { !it.transient }.withIndex()) { // output.writeXxxElementValue(classDesc, index, value) val sti = getSerialTypeInfo(property) - val innerSerial = serializerInstance(this@SerializerIrGenerator, serializableDescriptor, sti.serializer, property.module, property.type, property.genericIndex) - val elementCall = if (innerSerial == null) { - val writeFunc = + val innerSerial = serializerInstance( + this@SerializerIrGenerator, + serializableDescriptor, + sti.serializer, + property.module, + property.type, + property.genericIndex + ) + val (writeFunc, args: List) = if (innerSerial == null) { + val f = kOutputClass.referenceMethod("${CallingConventions.encode}${sti.elementMethodPrefix}${CallingConventions.elementPostfix}") - irInvoke( - irGet(localOutput), - writeFunc, - irGet(localSerialDesc), - irInt(index), - property.irGet() - ) + val args = mutableListOf(irGet(localSerialDesc), irInt(index)) + if (sti.elementMethodPrefix != "Unit") args += property.irGet() + f to args } else { - val writeFunc = kOutputClass.referenceMethod("${CallingConventions.encode}${sti.elementMethodPrefix}Serializable${CallingConventions.elementPostfix}") - irInvoke( - irGet(localOutput), - writeFunc, + val f = + kOutputClass.referenceMethod("${CallingConventions.encode}${sti.elementMethodPrefix}Serializable${CallingConventions.elementPostfix}") + f to listOf( irGet(localSerialDesc), irInt(index), innerSerial, property.irGet() ) } + val elementCall = irInvoke(irGet(localOutput), writeFunc, *args.toTypedArray()) // check for call to .shouldEncodeElementDefault if (!property.optional) {