Parcelable: Use ClassLoader from the container class to load Parcelable (KT-20027)

When the parameter type is just "Parcelable", we would not pick the wrong (system) class loader anymore.
This commit is contained in:
Yan Zhulanow
2017-09-01 22:28:04 +03:00
committed by Yan Zhulanow
parent c9ec1a2511
commit 3587a2a08e
7 changed files with 111 additions and 15 deletions
@@ -0,0 +1,9 @@
// CURIOUS_ABOUT writeToParcel, createFromParcel, <clinit>
package test
import kotlinx.android.parcel.*
import android.os.Parcelable
@Parcelize
class Foo(val parcelable: Parcelable): Parcelable
@@ -0,0 +1,68 @@
public final class test/Foo$Companion : java/lang/Object {
private void <init>()
public void <init>(kotlin.jvm.internal.DefaultConstructorMarker p0)
}
public static class test/Foo$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)
LDC (Ltest/Foo;)
INVOKEVIRTUAL (java/lang/Class, getClassLoader, ()Ljava/lang/ClassLoader;)
INVOKEVIRTUAL (android/os/Parcel, readParcelable, (Ljava/lang/ClassLoader;)Landroid/os/Parcelable;)
INVOKESPECIAL (test/Foo, <init>, (Landroid/os/Parcelable;)V)
ARETURN
LABEL (L1)
}
public final test.Foo[] newArray(int p0)
}
public final class test/Foo : java/lang/Object, android/os/Parcelable {
public final static test.Foo$Creator CREATOR
public final static test.Foo$Companion Companion
private final android.os.Parcelable parcelable
static void <clinit>() {
NEW
DUP
ACONST_NULL
INVOKESPECIAL (test/Foo$Companion, <init>, (Lkotlin/jvm/internal/DefaultConstructorMarker;)V)
PUTSTATIC (Companion, Ltest/Foo$Companion;)
NEW
DUP
INVOKESPECIAL (test/Foo$Creator, <init>, ()V)
PUTSTATIC (CREATOR, Ltest/Foo$Creator;)
RETURN
}
public void <init>(android.os.Parcelable p0)
public final int describeContents()
public final android.os.Parcelable getParcelable()
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 (parcelable, Landroid/os/Parcelable;)
LDC (0)
INVOKEVIRTUAL (android/os/Parcel, writeParcelable, (Landroid/os/Parcelable;I)V)
RETURN
LABEL (L1)
}
}