Support static final write$Self method inside serializable classes on IR

to properly serialize class hierarchies with/or private fields.
JVM only for now, because Native/JS do not have private fields.
Update tests and test data and rebase fix.
Unify formEncodeDecodePropertyCall functions.
Fix incorrect reference to object in writeSelf,
so properties dependent on other properties would be correctly compared
with defaults.
This commit is contained in:
Leonid Startsev
2021-03-02 19:09:09 +03:00
parent 9be5421e7c
commit 3b789448a3
22 changed files with 387 additions and 167 deletions
@@ -182,18 +182,10 @@ public final class ListOfUsers$$serializer : java/lang/Object, kotlinx/serializa
ALOAD (3)
INVOKEINTERFACE (kotlinx/serialization/encoding/Encoder, beginStructure, (Lkotlinx/serialization/descriptors/SerialDescriptor;)Lkotlinx/serialization/encoding/CompositeEncoder;)
ASTORE (4)
ALOAD (2)
ALOAD (4)
ALOAD (3)
ICONST_0
NEW
DUP
GETSTATIC (INSTANCE, LUser$$serializer;)
CHECKCAST
INVOKESPECIAL (kotlinx/serialization/internal/ArrayListSerializer, <init>, (Lkotlinx/serialization/KSerializer;)V)
CHECKCAST
ALOAD (2)
INVOKEVIRTUAL (ListOfUsers, getList, ()Ljava/util/List;)
INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeEncoder, encodeSerializableElement, (Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)V)
INVOKESTATIC (ListOfUsers, write$Self, (LListOfUsers;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V)
ALOAD (4)
ALOAD (3)
INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeEncoder, endStructure, (Lkotlinx/serialization/descriptors/SerialDescriptor;)V)
@@ -293,6 +285,35 @@ public final class ListOfUsers : java/lang/Object {
}
public final java.util.List getList()
public final static void write$Self(ListOfUsers self, kotlinx.serialization.encoding.CompositeEncoder output, kotlinx.serialization.descriptors.SerialDescriptor serialDesc) {
LABEL (L0)
ALOAD (0)
LDC (self)
INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V)
ALOAD (1)
LDC (output)
INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V)
ALOAD (2)
LDC (serialDesc)
INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V)
LABEL (L1)
LINENUMBER (12)
ALOAD (1)
ALOAD (2)
ICONST_0
NEW
DUP
GETSTATIC (INSTANCE, LUser$$serializer;)
CHECKCAST
INVOKESPECIAL (kotlinx/serialization/internal/ArrayListSerializer, <init>, (Lkotlinx/serialization/KSerializer;)V)
CHECKCAST
ALOAD (0)
GETFIELD (list, Ljava/util/List;)
INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeEncoder, encodeSerializableElement, (Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)V)
RETURN
LABEL (L2)
}
}
public final class OptionalUser$$serializer : java/lang/Object, kotlinx/serialization/internal/GeneratedSerializer {
@@ -467,47 +488,15 @@ public final class OptionalUser$$serializer : java/lang/Object, kotlinx/serializ
ALOAD (3)
INVOKEINTERFACE (kotlinx/serialization/encoding/Encoder, beginStructure, (Lkotlinx/serialization/descriptors/SerialDescriptor;)Lkotlinx/serialization/encoding/CompositeEncoder;)
ASTORE (4)
ALOAD (2)
ALOAD (4)
ALOAD (3)
ICONST_0
INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeEncoder, shouldEncodeElementDefault, (Lkotlinx/serialization/descriptors/SerialDescriptor;I)Z)
IFEQ (L2)
ICONST_1
GOTO (L3)
LABEL (L2)
ALOAD (2)
INVOKEVIRTUAL (OptionalUser, getUser, ()LUser;)
LABEL (L4)
LINENUMBER (10)
NEW
DUP
LDC ()
LDC ()
INVOKESPECIAL (User, <init>, (Ljava/lang/String;Ljava/lang/String;)V)
INVOKESTATIC (kotlin/jvm/internal/Intrinsics, areEqual, (Ljava/lang/Object;Ljava/lang/Object;)Z)
IFNE (L5)
ICONST_1
GOTO (L3)
LABEL (L5)
ICONST_0
LABEL (L3)
IFEQ (L6)
LABEL (L7)
LINENUMBER (9)
ALOAD (4)
ALOAD (3)
ICONST_0
GETSTATIC (INSTANCE, LUser$$serializer;)
CHECKCAST
ALOAD (2)
INVOKEVIRTUAL (OptionalUser, getUser, ()LUser;)
INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeEncoder, encodeSerializableElement, (Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)V)
LABEL (L6)
INVOKESTATIC (OptionalUser, write$Self, (LOptionalUser;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V)
ALOAD (4)
ALOAD (3)
INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeEncoder, endStructure, (Lkotlinx/serialization/descriptors/SerialDescriptor;)V)
RETURN
LABEL (L8)
LABEL (L2)
}
public void serialize(kotlinx.serialization.encoding.Encoder encoder, java.lang.Object value) {
@@ -650,6 +639,59 @@ public final class OptionalUser : java/lang/Object {
}
public final User getUser()
public final static void write$Self(OptionalUser self, kotlinx.serialization.encoding.CompositeEncoder output, kotlinx.serialization.descriptors.SerialDescriptor serialDesc) {
LABEL (L0)
ALOAD (0)
LDC (self)
INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V)
ALOAD (1)
LDC (output)
INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V)
ALOAD (2)
LDC (serialDesc)
INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V)
LABEL (L1)
LINENUMBER (9)
ALOAD (1)
ALOAD (2)
ICONST_0
INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeEncoder, shouldEncodeElementDefault, (Lkotlinx/serialization/descriptors/SerialDescriptor;I)Z)
IFEQ (L2)
ICONST_1
GOTO (L3)
LABEL (L2)
ALOAD (0)
GETFIELD (user, LUser;)
LABEL (L4)
LINENUMBER (10)
NEW
DUP
LDC ()
LDC ()
INVOKESPECIAL (User, <init>, (Ljava/lang/String;Ljava/lang/String;)V)
INVOKESTATIC (kotlin/jvm/internal/Intrinsics, areEqual, (Ljava/lang/Object;Ljava/lang/Object;)Z)
IFNE (L5)
ICONST_1
GOTO (L3)
LABEL (L5)
ICONST_0
LABEL (L3)
IFEQ (L6)
LABEL (L7)
LINENUMBER (9)
ALOAD (1)
ALOAD (2)
ICONST_0
GETSTATIC (INSTANCE, LUser$$serializer;)
CHECKCAST
ALOAD (0)
GETFIELD (user, LUser;)
INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeEncoder, encodeSerializableElement, (Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)V)
LABEL (L6)
RETURN
LABEL (L8)
}
}
public final class User$$serializer : java/lang/Object, kotlinx/serialization/internal/GeneratedSerializer {
@@ -849,18 +891,10 @@ public final class User$$serializer : java/lang/Object, kotlinx/serialization/in
ALOAD (3)
INVOKEINTERFACE (kotlinx/serialization/encoding/Encoder, beginStructure, (Lkotlinx/serialization/descriptors/SerialDescriptor;)Lkotlinx/serialization/encoding/CompositeEncoder;)
ASTORE (4)
ALOAD (2)
ALOAD (4)
ALOAD (3)
ICONST_0
ALOAD (2)
INVOKEVIRTUAL (User, getFirstName, ()Ljava/lang/String;)
INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeEncoder, encodeStringElement, (Lkotlinx/serialization/descriptors/SerialDescriptor;ILjava/lang/String;)V)
ALOAD (4)
ALOAD (3)
ICONST_1
ALOAD (2)
INVOKEVIRTUAL (User, getLastName, ()Ljava/lang/String;)
INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeEncoder, encodeStringElement, (Lkotlinx/serialization/descriptors/SerialDescriptor;ILjava/lang/String;)V)
INVOKESTATIC (User, write$Self, (LUser;Lkotlinx/serialization/encoding/CompositeEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)V)
ALOAD (4)
ALOAD (3)
INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeEncoder, endStructure, (Lkotlinx/serialization/descriptors/SerialDescriptor;)V)
@@ -973,4 +1007,33 @@ public final class User : java/lang/Object {
public final java.lang.String getFirstName()
public final java.lang.String getLastName()
public final static void write$Self(User self, kotlinx.serialization.encoding.CompositeEncoder output, kotlinx.serialization.descriptors.SerialDescriptor serialDesc) {
LABEL (L0)
ALOAD (0)
LDC (self)
INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V)
ALOAD (1)
LDC (output)
INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V)
ALOAD (2)
LDC (serialDesc)
INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkNotNullParameter, (Ljava/lang/Object;Ljava/lang/String;)V)
LABEL (L1)
LINENUMBER (6)
ALOAD (1)
ALOAD (2)
ICONST_0
ALOAD (0)
GETFIELD (firstName, Ljava/lang/String;)
INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeEncoder, encodeStringElement, (Lkotlinx/serialization/descriptors/SerialDescriptor;ILjava/lang/String;)V)
ALOAD (1)
ALOAD (2)
ICONST_1
ALOAD (0)
GETFIELD (lastName, Ljava/lang/String;)
INVOKEINTERFACE (kotlinx/serialization/encoding/CompositeEncoder, encodeStringElement, (Lkotlinx/serialization/descriptors/SerialDescriptor;ILjava/lang/String;)V)
RETURN
LABEL (L2)
}
}