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 b311852cde5..a764c44a613 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 @@ -62,11 +62,11 @@ internal class ArrayParcelSerializer(override val asmType: Type, private val ele v.dupX2() // -> length, arr, index, length v.pop() // -> length, arr, index v.dup2() // -> length, arr, index, arr, index - v.aload(elementSerializer.asmType) // -> length, arr, index, obj + v.load(1, PARCEL_TYPE) // -> length, arr, index, arr, index, parcel + v.dupX2() // -> length, arr, index, parcel, arr, index, parcel + v.pop() // -> length, arr, index, parcel, arr, index + v.aload(elementSerializer.asmType) // -> length, arr, index, parcel, obj v.castIfNeeded(elementSerializer.asmType) - - v.load(1, PARCEL_TYPE) // -> length, arr, index, obj, parcel - v.swap() // -> length, arr, index, parcel, obj elementSerializer.writeValue(v) // -> length, arr, index v.aconst(1) // -> length, arr, index, (1) @@ -255,10 +255,11 @@ abstract internal class AbstractCollectionParcelSerializer( v.ifeq(labelReturn) // -> iterator v.dup() // -> iterator, iterator - v.invokeinterface("java/util/Iterator", "next", "()Ljava/lang/Object;") // -> iterator, obj - v.load(1, PARCEL_TYPE) // -> iterator, obj, parcel - v.swap() // -> iterator, parcel, obj + v.load(1, PARCEL_TYPE) // iterator, iterator, parcel + v.swap() // iterator, parcel, iterator + v.invokeinterface("java/util/Iterator", "next", "()Ljava/lang/Object;") // -> iterator, parcel, obj + doWriteValue(v) // -> iterator v.goTo(labelIteratorLoop) diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/box/kt20002.kt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/box/kt20002.kt new file mode 100644 index 00000000000..1d5ac06ddc1 --- /dev/null +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/box/kt20002.kt @@ -0,0 +1,39 @@ +// WITH_RUNTIME + +@file:JvmName("TestKt") +package test + +import kotlinx.android.parcel.* +import android.os.Parcel +import android.os.Parcelable +import java.util.Arrays + +@Parcelize +data class Test(val a: LongArray, val b: List) : Parcelable { + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other?.javaClass != javaClass) return false + + other as Test + + if (!Arrays.equals(a, other.a)) return false + if (b != other.b) return false + + return true + } + + override fun hashCode() = Arrays.hashCode(a) +} + +fun box() = parcelTest { parcel -> + val first = Test(longArrayOf(1, 2, 3, 4, 5), listOf(1, 2, 3, 4)) + + first.writeToParcel(parcel, 0) + + val bytes = parcel.marshall() + parcel.unmarshall(bytes, 0, bytes.size) + + val first2 = readFromParcel(parcel) + + assert(first == first2) +} \ No newline at end of file diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/listInsideList.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/listInsideList.txt index 75b8ec06748..0c2bd5c5890 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/listInsideList.txt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/listInsideList.txt @@ -36,9 +36,9 @@ public final class Test : java/lang/Object { INVOKEINTERFACE (java/util/Iterator, hasNext, ()Z) IFEQ (L2) DUP - INVOKEINTERFACE (java/util/Iterator, next, ()Ljava/lang/Object;) ALOAD (1) SWAP + INVOKEINTERFACE (java/util/Iterator, next, ()Ljava/lang/Object;) CHECKCAST DUP_X1 INVOKEINTERFACE (java/util/Collection, size, ()I) @@ -49,9 +49,9 @@ public final class Test : java/lang/Object { INVOKEINTERFACE (java/util/Iterator, hasNext, ()Z) IFEQ (L4) DUP - INVOKEINTERFACE (java/util/Iterator, next, ()Ljava/lang/Object;) ALOAD (1) SWAP + INVOKEINTERFACE (java/util/Iterator, next, ()Ljava/lang/Object;) CHECKCAST DUP_X1 INVOKEINTERFACE (java/util/Collection, size, ()I) @@ -62,9 +62,9 @@ public final class Test : java/lang/Object { INVOKEINTERFACE (java/util/Iterator, hasNext, ()Z) IFEQ (L6) DUP - INVOKEINTERFACE (java/util/Iterator, next, ()Ljava/lang/Object;) ALOAD (1) SWAP + INVOKEINTERFACE (java/util/Iterator, next, ()Ljava/lang/Object;) CHECKCAST INVOKEVIRTUAL (android/os/Parcel, writeString, (Ljava/lang/String;)V) GOTO (L5) diff --git a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/simpleList.txt b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/simpleList.txt index 152ac15976f..1d411580473 100644 --- a/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/simpleList.txt +++ b/plugins/android-extensions/android-extensions-compiler/testData/parcel/codegen/simpleList.txt @@ -36,9 +36,9 @@ public final class Test : java/lang/Object { INVOKEINTERFACE (java/util/Iterator, hasNext, ()Z) IFEQ (L2) DUP - INVOKEINTERFACE (java/util/Iterator, next, ()Ljava/lang/Object;) ALOAD (1) SWAP + INVOKEINTERFACE (java/util/Iterator, next, ()Ljava/lang/Object;) CHECKCAST INVOKEVIRTUAL (android/os/Parcel, writeString, (Ljava/lang/String;)V) GOTO (L1) 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 90ed700df31..cd0d8d9afce 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 @@ -49,4 +49,5 @@ class ParcelBoxTest : AbstractParcelBoxTest() { fun testKt19749() = doTest("kt19749") fun testKt19747() = doTest("kt19747") fun testKt19747_2() = doTest("kt19747_2") + fun test20002() = doTest("kt20002") } \ No newline at end of file