Parcelable: Support CharSequence, IBinder/IInterface, objects, enums. Serialize Parcelable efficiently if possible

This commit is contained in:
Yan Zhulanow
2017-06-30 22:39:30 +03:00
parent 19eb30b3ae
commit 4200629347
23 changed files with 442 additions and 94 deletions
@@ -0,0 +1,25 @@
// WITH_RUNTIME
@file:JvmName("TestKt")
package test
import kotlinx.android.parcel.*
import android.os.Parcel
import android.os.Parcelable
import android.text.SpannableString
@MagicParcel
data class Test(val simple: CharSequence, val spanned: CharSequence) : Parcelable
fun box() = parcelTest { parcel ->
val test = Test("John", SpannableString("Smith"))
test.writeToParcel(parcel, 0)
val bytes = parcel.marshall()
parcel.unmarshall(bytes, 0, bytes.size)
val test2 = readFromParcel<Test>(parcel)
assert(test.simple.toString() == test2.simple.toString())
assert(test.spanned.toString() == test2.spanned.toString())
}
@@ -0,0 +1,26 @@
// WITH_RUNTIME
@file:JvmName("TestKt")
package test
import kotlinx.android.parcel.*
import android.os.Parcel
import android.os.Parcelable
enum class Color {
BLACK, WHITE
}
@MagicParcel
data class Test(val name: String, val color: Color) : Parcelable
fun box() = parcelTest { parcel ->
val test = Test("John", Color.WHITE)
test.writeToParcel(parcel, 0)
val bytes = parcel.marshall()
parcel.unmarshall(bytes, 0, bytes.size)
val test2 = readFromParcel<Test>(parcel)
assert(test == test2)
}
@@ -0,0 +1,33 @@
// WITH_RUNTIME
@file:JvmName("TestKt")
package test
import kotlinx.android.parcel.*
import android.os.Parcel
import android.os.Parcelable
// Starts with A, should be loaded before other classes
abstract class AParcelable : Parcelable
@MagicParcel
data class P1(val a: String) : AParcelable()
sealed class Sealed : AParcelable()
@MagicParcel
data class Sealed1(val a: Int) : Sealed()
@MagicParcel
data class Test(val a: P1, val b: AParcelable, val c: Sealed, val d: Sealed1) : Parcelable
fun box() = parcelTest { parcel ->
val test = Test(P1(""), P1("My"), Sealed1(1), Sealed1(5))
test.writeToParcel(parcel, 0)
val bytes = parcel.marshall()
parcel.unmarshall(bytes, 0, bytes.size)
val test2 = readFromParcel<Test>(parcel)
assert(test == test2)
}
@@ -0,0 +1,30 @@
// WITH_RUNTIME
@file:JvmName("TestKt")
package test
import kotlinx.android.parcel.*
import android.os.Parcel
import android.os.Parcelable
object Obj1 {
object Obj2
}
@MagicParcel
data class Test(val o1: Obj1, val o2: Obj1.Obj2, val com: Com) : Parcelable {
companion object Com {
}
}
fun box() = parcelTest { parcel ->
val test = Test(Obj1, Obj1.Obj2, Test.Com)
test.writeToParcel(parcel, 0)
val bytes = parcel.marshall()
parcel.unmarshall(bytes, 0, bytes.size)
val test2 = readFromParcel<Test>(parcel)
assert(test == test2)
}
@@ -0,0 +1,9 @@
// CURIOUS_ABOUT writeToParcel, createFromParcel
import kotlinx.android.parcel.*
import android.os.Parcelable
import android.os.IBinder
import android.os.IInterface
@MagicParcel
class User(val binder: IBinder, val intf: IInterface?) : Parcelable
@@ -0,0 +1,56 @@
public static class User$Creator : java/lang/Object, android/os/Parcelable$Creator {
public void <init>()
public final java.lang.Object createFromParcel(android.os.Parcel p0) {
LABEL (L0)
ALOAD (1)
LDC (in)
INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkParameterIsNotNull, (Ljava/lang/Object;Ljava/lang/String;)V)
NEW
DUP
ALOAD (1)
INVOKEVIRTUAL (android/os/Parcel, readStrongBinder, ()Landroid/os/IBinder;)
ALOAD (1)
INVOKEVIRTUAL (android/os/Parcel, readStrongInterface, ()Landroid/os/IInterface;)
INVOKESPECIAL (User, <init>, (Landroid/os/IBinder;Landroid/os/IInterface;)V)
ARETURN
LABEL (L1)
}
public final User[] newArray(int p0)
}
public final class User : java/lang/Object, android/os/Parcelable {
public final static User$Creator CREATOR
private final android.os.IBinder binder
private final android.os.IInterface intf
static void <clinit>()
public void <init>(android.os.IBinder p0, android.os.IInterface p1)
public final int describeContents()
public final android.os.IBinder getBinder()
public final android.os.IInterface getIntf()
public final void writeToParcel(android.os.Parcel p0, int p1) {
LABEL (L0)
ALOAD (1)
LDC (parcel)
INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkParameterIsNotNull, (Ljava/lang/Object;Ljava/lang/String;)V)
ALOAD (1)
ALOAD (0)
GETFIELD (binder, Landroid/os/IBinder;)
INVOKEVIRTUAL (android/os/Parcel, writeStrongBinder, (Landroid/os/IBinder;)V)
ALOAD (1)
ALOAD (0)
GETFIELD (intf, Landroid/os/IInterface;)
INVOKEVIRTUAL (android/os/Parcel, writeStrongInterface, (Landroid/os/IInterface;)V)
RETURN
LABEL (L1)
}
}
@@ -1,13 +1,13 @@
public static class User$CREATOR : java/lang/Object, android/os/Parcelable$Creator {
public static class User$Creator : java/lang/Object, android/os/Parcelable$Creator {
public void <init>()
public final User createFromParcel(android.os.Parcel p0)
public final java.lang.Object createFromParcel(android.os.Parcel p0)
public final User[] newArray(int p0)
}
public final class User : java/lang/Object, android/os/Parcelable {
public final static User$CREATOR CREATOR
public final static User$Creator CREATOR
private final int age
@@ -1,27 +1,3 @@
public static class User$CREATOR : java/lang/Object, android/os/Parcelable$Creator {
public void <init>()
public final User createFromParcel(android.os.Parcel p0) {
LABEL (L0)
ALOAD (1)
LDC (in)
INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkParameterIsNotNull, (Ljava/lang/Object;Ljava/lang/String;)V)
GETSTATIC (Companion, LUser$Companion;)
ALOAD (1)
INVOKEVIRTUAL (User$Companion, create, (Landroid/os/Parcel;)LUser;)
ARETURN
LABEL (L1)
}
public final User[] newArray(int p0) {
LABEL (L0)
ILOAD (1)
ANEWARRAY
ARETURN
LABEL (L1)
}
}
final class User$Companion : java/lang/Object, kotlinx/android/parcel/Parceler {
private void <init>()
@@ -57,8 +33,32 @@ final class User$Companion : java/lang/Object, kotlinx/android/parcel/Parceler {
public void write(android.os.Parcelable p0, android.os.Parcel p1, int p2)
}
public static class User$Creator : java/lang/Object, android/os/Parcelable$Creator {
public void <init>()
public final java.lang.Object createFromParcel(android.os.Parcel p0) {
LABEL (L0)
ALOAD (1)
LDC (in)
INVOKESTATIC (kotlin/jvm/internal/Intrinsics, checkParameterIsNotNull, (Ljava/lang/Object;Ljava/lang/String;)V)
GETSTATIC (Companion, LUser$Companion;)
ALOAD (1)
INVOKEVIRTUAL (User$Companion, create, (Landroid/os/Parcel;)Landroid/os/Parcelable;)
ARETURN
LABEL (L1)
}
public final User[] newArray(int p0) {
LABEL (L0)
ILOAD (1)
ANEWARRAY
ARETURN
LABEL (L1)
}
}
public final class User : java/lang/Object, android/os/Parcelable {
public final static User$CREATOR CREATOR
public final static User$Creator CREATOR
public final static User$Companion Companion
@@ -1,18 +1,3 @@
public static class User$CREATOR : java/lang/Object, android/os/Parcelable$Creator {
public void <init>()
public final User createFromParcel(android.os.Parcel p0)
public final User[] newArray(int p0) {
LABEL (L0)
GETSTATIC (Companion, LUser$Companion;)
ILOAD (1)
INVOKEVIRTUAL (User$Companion, newArray, (I)[LUser;)
ARETURN
LABEL (L1)
}
}
final class User$Companion : java/lang/Object, kotlinx/android/parcel/Parceler {
private void <init>()
@@ -46,8 +31,23 @@ final class User$Companion : java/lang/Object, kotlinx/android/parcel/Parceler {
public void write(android.os.Parcelable p0, android.os.Parcel p1, int p2)
}
public static class User$Creator : java/lang/Object, android/os/Parcelable$Creator {
public void <init>()
public final java.lang.Object createFromParcel(android.os.Parcel p0)
public final User[] newArray(int p0) {
LABEL (L0)
GETSTATIC (Companion, LUser$Companion;)
ILOAD (1)
INVOKEVIRTUAL (User$Companion, newArray, (I)[LUser;)
ARETURN
LABEL (L1)
}
}
public final class User : java/lang/Object, android/os/Parcelable {
public final static User$CREATOR CREATOR
public final static User$Creator CREATOR
public final static User$Companion Companion
@@ -1,11 +1,3 @@
public static class User$CREATOR : java/lang/Object, android/os/Parcelable$Creator {
public void <init>()
public final User createFromParcel(android.os.Parcel p0)
public final User[] newArray(int p0)
}
public final class User$Companion : java/lang/Object {
private void <init>()
@@ -18,8 +10,16 @@ public final class User$Companion : java/lang/Object {
private static void test$annotations()
}
public static class User$Creator : java/lang/Object, android/os/Parcelable$Creator {
public void <init>()
public final java.lang.Object createFromParcel(android.os.Parcel p0)
public final User[] newArray(int p0)
}
public final class User : java/lang/Object, android/os/Parcelable {
public final static User$CREATOR CREATOR
public final static User$Creator CREATOR
public final static User$Companion Companion
@@ -41,8 +41,8 @@ public final class User : java/lang/Object, android/os/Parcelable {
PUTSTATIC (test, Ljava/lang/StringBuilder;)
NEW
DUP
INVOKESPECIAL (User$CREATOR, <init>, ()V)
PUTSTATIC (CREATOR, LUser$CREATOR;)
INVOKESPECIAL (User$Creator, <init>, ()V)
PUTSTATIC (CREATOR, LUser$Creator;)
RETURN
}
@@ -1,13 +1,13 @@
public static class Test$CREATOR : java/lang/Object, android/os/Parcelable$Creator {
public static class Test$Creator : java/lang/Object, android/os/Parcelable$Creator {
public void <init>()
public final Test createFromParcel(android.os.Parcel p0)
public final java.lang.Object createFromParcel(android.os.Parcel p0)
public final Test[] newArray(int p0)
}
public final class Test : java/lang/Object {
public final static Test$CREATOR CREATOR
public final static Test$Creator CREATOR
private final java.util.List names
@@ -1,13 +1,13 @@
public static class TestNotNull$CREATOR : java/lang/Object, android/os/Parcelable$Creator {
public static class TestNotNull$Creator : java/lang/Object, android/os/Parcelable$Creator {
public void <init>()
public final TestNotNull createFromParcel(android.os.Parcel p0)
public final java.lang.Object createFromParcel(android.os.Parcel p0)
public final TestNotNull[] newArray(int p0)
}
public final class TestNotNull : java/lang/Object {
public final static TestNotNull$CREATOR CREATOR
public final static TestNotNull$Creator CREATOR
private final android.util.Size a
@@ -33,16 +33,16 @@ public final class TestNotNull : java/lang/Object {
}
}
public static class TestNullable$CREATOR : java/lang/Object, android/os/Parcelable$Creator {
public static class TestNullable$Creator : java/lang/Object, android/os/Parcelable$Creator {
public void <init>()
public final TestNullable createFromParcel(android.os.Parcel p0)
public final java.lang.Object createFromParcel(android.os.Parcel p0)
public final TestNullable[] newArray(int p0)
}
public final class TestNullable : java/lang/Object {
public final static TestNullable$CREATOR CREATOR
public final static TestNullable$Creator CREATOR
private final android.util.Size a
@@ -10,10 +10,10 @@ public final class SerializableSimple : java/lang/Object, java/io/Serializable {
public final java.lang.String getB()
}
public static class User$CREATOR : java/lang/Object, android/os/Parcelable$Creator {
public static class User$Creator : java/lang/Object, android/os/Parcelable$Creator {
public void <init>()
public final User createFromParcel(android.os.Parcel p0) {
public final java.lang.Object createFromParcel(android.os.Parcel p0) {
LABEL (L0)
ALOAD (1)
LDC (in)
@@ -33,7 +33,7 @@ public static class User$CREATOR : java/lang/Object, android/os/Parcelable$Creat
}
public final class User : java/lang/Object, android/os/Parcelable {
public final static User$CREATOR CREATOR
public final static User$Creator CREATOR
private final SerializableSimple notNull
@@ -42,8 +42,8 @@ public final class User : java/lang/Object, android/os/Parcelable {
static void <clinit>() {
NEW
DUP
INVOKESPECIAL (User$CREATOR, <init>, ()V)
PUTSTATIC (CREATOR, LUser$CREATOR;)
INVOKESPECIAL (User$Creator, <init>, ()V)
PUTSTATIC (CREATOR, LUser$Creator;)
RETURN
}
@@ -1,7 +1,7 @@
public static class User$CREATOR : java/lang/Object, android/os/Parcelable$Creator {
public static class User$Creator : java/lang/Object, android/os/Parcelable$Creator {
public void <init>()
public final User createFromParcel(android.os.Parcel p0) {
public final java.lang.Object createFromParcel(android.os.Parcel p0) {
LABEL (L0)
ALOAD (1)
LDC (in)
@@ -25,7 +25,7 @@ public static class User$CREATOR : java/lang/Object, android/os/Parcelable$Creat
}
public final class User : java/lang/Object, android/os/Parcelable {
public final static User$CREATOR CREATOR
public final static User$Creator CREATOR
private final int age
@@ -38,8 +38,8 @@ public final class User : java/lang/Object, android/os/Parcelable {
static void <clinit>() {
NEW
DUP
INVOKESPECIAL (User$CREATOR, <init>, ()V)
PUTSTATIC (CREATOR, LUser$CREATOR;)
INVOKESPECIAL (User$Creator, <init>, ()V)
PUTSTATIC (CREATOR, LUser$Creator;)
RETURN
}
@@ -1,13 +1,13 @@
public static class Test$CREATOR : java/lang/Object, android/os/Parcelable$Creator {
public static class Test$Creator : java/lang/Object, android/os/Parcelable$Creator {
public void <init>()
public final Test createFromParcel(android.os.Parcel p0)
public final java.lang.Object createFromParcel(android.os.Parcel p0)
public final Test[] newArray(int p0)
}
public final class Test : java/lang/Object {
public final static Test$CREATOR CREATOR
public final static Test$Creator CREATOR
private final java.util.List names
@@ -1,7 +1,7 @@
public static class Test$CREATOR : java/lang/Object, android/os/Parcelable$Creator {
public static class Test$Creator : java/lang/Object, android/os/Parcelable$Creator {
public void <init>()
public final Test createFromParcel(android.os.Parcel p0) {
public final java.lang.Object createFromParcel(android.os.Parcel p0) {
LABEL (L0)
ALOAD (1)
LDC (in)
@@ -29,7 +29,7 @@ public static class Test$CREATOR : java/lang/Object, android/os/Parcelable$Creat
}
public final class Test : java/lang/Object, android/os/Parcelable {
public final static Test$CREATOR CREATOR
public final static Test$Creator CREATOR
private final android.util.Size nullable
@@ -88,10 +88,10 @@ public final class Test : java/lang/Object, android/os/Parcelable {
}
}
public static class TestF$CREATOR : java/lang/Object, android/os/Parcelable$Creator {
public static class TestF$Creator : java/lang/Object, android/os/Parcelable$Creator {
public void <init>()
public final TestF createFromParcel(android.os.Parcel p0) {
public final java.lang.Object createFromParcel(android.os.Parcel p0) {
LABEL (L0)
ALOAD (1)
LDC (in)
@@ -119,7 +119,7 @@ public static class TestF$CREATOR : java/lang/Object, android/os/Parcelable$Crea
}
public final class TestF : java/lang/Object, android/os/Parcelable {
public final static TestF$CREATOR CREATOR
public final static TestF$Creator CREATOR
private final android.util.SizeF nullable