diff --git a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/serializers/ParcelSerializer.kt b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/serializers/ParcelSerializer.kt index 83fa01f1bef..759252aa3e4 100644 --- a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/serializers/ParcelSerializer.kt +++ b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/serializers/ParcelSerializer.kt @@ -201,7 +201,7 @@ interface ParcelSerializer { if (strict && !type.annotations.hasAnnotation(RAWVALUE_ANNOTATION_FQNAME)) throw IllegalArgumentException("Illegal type") else - GenericParcelSerializer + GenericParcelSerializer(asmType) } } } diff --git a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/serializers/ParcelSerializers.kt b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/serializers/ParcelSerializers.kt index e95d14e8a62..b311852cde5 100644 --- a/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/serializers/ParcelSerializers.kt +++ b/plugins/android-extensions/android-extensions-compiler/src/org/jetbrains/kotlin/android/parcel/serializers/ParcelSerializers.kt @@ -25,9 +25,7 @@ import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter internal val PARCEL_TYPE = Type.getObjectType("android/os/Parcel") -internal object GenericParcelSerializer : ParcelSerializer { - override val asmType: Type = Type.getObjectType("java/lang/Object") - +internal class GenericParcelSerializer(override val asmType: Type) : ParcelSerializer { override fun writeValue(v: InstructionAdapter) { v.invokevirtual(PARCEL_TYPE.internalName, "writeValue", "(Ljava/lang/Object;)V", false) } @@ -36,6 +34,7 @@ internal object GenericParcelSerializer : ParcelSerializer { v.aconst(asmType) // -> parcel, type v.invokevirtual("java/lang/Class", "getClassLoader", "()Ljava/lang/ClassLoader;", false) // -> parcel, classloader v.invokevirtual(PARCEL_TYPE.internalName, "readValue", "(Ljava/lang/ClassLoader;)Ljava/lang/Object;", false) + v.castIfNeeded(asmType) } } diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/box/kt19747.kt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/box/kt19747.kt new file mode 100644 index 00000000000..e84fda179cc --- /dev/null +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/box/kt19747.kt @@ -0,0 +1,35 @@ +// WITH_RUNTIME + +@file:JvmName("TestKt") +package test + +import kotlinx.android.parcel.* +import android.os.Parcel +import android.os.Parcelable +import java.io.Serializable + +class JHelp(var j1: String) { + val j2 = 9 +} + +@Parcelize +class J(val j: @RawValue JHelp) : Parcelable + +fun box() = parcelTest { parcel -> + val test = J(JHelp("A")) + + var exceptionCaught = false + try { + test.writeToParcel(parcel, 0) + } catch (e: RuntimeException) { + if (e.message!!.contains("Parcel: unable to marshal value test.JHelp")) { + exceptionCaught = true + } else { + throw e + } + } + + if (!exceptionCaught) { + error("Exception should be thrown") + } +} \ No newline at end of file diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/box/kt19747_2.kt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/box/kt19747_2.kt new file mode 100644 index 00000000000..4db7a2b0828 --- /dev/null +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/box/kt19747_2.kt @@ -0,0 +1,32 @@ +// WITH_RUNTIME + +@file:JvmName("TestKt") +package test + +import kotlinx.android.parcel.* +import android.os.Parcel +import android.os.Parcelable +import java.io.Serializable + +interface IJHelp { + val j1: String +} + +class JHelp(override var j1: String): IJHelp, Serializable { + val j2 = 9 +} + +@Parcelize +class J(val j: @RawValue JHelp) : Parcelable + +fun box() = parcelTest { parcel -> + val test = J(JHelp("A")) + test.writeToParcel(parcel, 0) + + val bytes = parcel.marshall() + parcel.unmarshall(bytes, 0, bytes.size) + + val test2 = readFromParcel(parcel) + + assert(test.j.j1 == test2.j.j1) +} \ No newline at end of file diff --git a/plugins/plugins-tests/tests/org/jetbrains/kotlin/android/parcel/ParcelBoxTest.kt b/plugins/plugins-tests/tests/org/jetbrains/kotlin/android/parcel/ParcelBoxTest.kt index 00680da66bc..90ed700df31 100644 --- a/plugins/plugins-tests/tests/org/jetbrains/kotlin/android/parcel/ParcelBoxTest.kt +++ b/plugins/plugins-tests/tests/org/jetbrains/kotlin/android/parcel/ParcelBoxTest.kt @@ -47,4 +47,6 @@ class ParcelBoxTest : AbstractParcelBoxTest() { fun testObjects() = doTest("objects") fun testNestedParcelable() = doTest("nestedParcelable") fun testKt19749() = doTest("kt19749") + fun testKt19747() = doTest("kt19747") + fun testKt19747_2() = doTest("kt19747_2") } \ No newline at end of file