Parcelable: newArray() result type should be Object[] (KT-20717)

This commit is contained in:
Yan Zhulanow
2017-10-18 23:49:30 +03:00
parent 26005751d8
commit e28cffd0ad
19 changed files with 53 additions and 22 deletions
@@ -296,7 +296,7 @@ open class ParcelableCodegenExtension : ExpressionCodegenExtension {
val parcelableAsmType = codegen.typeMapper.mapType(parcelableClass)
createMethod(creatorClass, NEW_ARRAY,
builtIns.getArrayType(Variance.INVARIANT, parcelableClass.defaultType),
builtIns.getArrayType(Variance.INVARIANT, builtIns.anyType),
"size" to builtIns.intType
).write(codegen) {
if (parcelerObject != null) {
@@ -315,8 +315,8 @@ open class ParcelableCodegenExtension : ExpressionCodegenExtension {
v.getstatic(containerAsmType.internalName, companionFieldName, companionAsmType.descriptor)
v.load(1, Type.INT_TYPE)
v.invokevirtual(companionAsmType.internalName, "newArray", "(I)[${containerAsmType.descriptor}", false)
v.areturn(Type.getType("[L$parcelableAsmType;"))
v.invokevirtual(companionAsmType.internalName, "newArray", "(I)[Ljava/lang/Object;", false)
v.areturn(Type.getType("[Ljava/lang/Object;"))
return@write
}
@@ -155,7 +155,7 @@ abstract class AbstractParcelBoxTest : CodegenTestCase() {
process.waitFor(3, TimeUnit.MINUTES)
if (process.exitValue() != 0) {
throw AssertionError(classFileFactory.createText())
throw AssertionError("Process exited with exit code ${process.exitValue()} \n" + classFileFactory.createText())
}
} finally {
if (!dirForTestClasses.deleteRecursively()) {
@@ -53,6 +53,7 @@ class ParcelBoxTest : AbstractParcelBoxTest() {
fun testCustomSerializerSimple() = doTest("customSerializerSimple")
fun testCustomSerializerWriteWith() = doTest("customSerializerWriteWith")
fun testCustomSerializerBoxing() = doTest("customSerializerBoxing")
fun testKt20717() = doTest("kt20717")
}
class ParcelBoxTestWithSerializableLikeExtension : AbstractParcelBoxTest() {
@@ -0,0 +1,30 @@
// WITH_RUNTIME
@file:JvmName("TestKt")
package test
import kotlinx.android.parcel.*
import android.os.Parcel
import android.os.Parcelable
fun box() = doTest { creator ->
assert(creator.newArray(5) != null)
}
fun doTest(work: (Parcelable.Creator<DummyParcelable>) -> Unit): String {
val dummy = DummyParcelable(42)
val clazz = dummy.javaClass
val field = clazz.getDeclaredField("CREATOR")
val creator = field.get(dummy) as Parcelable.Creator<DummyParcelable>
val parcel = Parcel.obtain()
dummy.writeToParcel(parcel, 0)
parcel.setDataPosition(0)
work(creator)
return "OK"
}
@Parcelize
data class DummyParcelable(val int: Int): Parcelable
@@ -47,7 +47,7 @@ public final class User$Creator : java/lang/Object, android/os/Parcelable$Creato
LABEL (L4)
}
public final User[] newArray(int p0)
public final java.lang.Object[] newArray(int p0)
}
public final class User : java/lang/Object, android/os/Parcelable {
@@ -3,7 +3,7 @@ public final class User$Creator : java/lang/Object, android/os/Parcelable$Creato
public final java.lang.Object createFromParcel(android.os.Parcel p0)
public final User[] newArray(int p0)
public final java.lang.Object[] newArray(int p0)
}
public final class User : java/lang/Object, android/os/Parcelable {
@@ -18,7 +18,7 @@ public final class test/Foo$Creator : java/lang/Object, android/os/Parcelable$Cr
LABEL (L1)
}
public final test.Foo[] newArray(int p0)
public final java.lang.Object[] newArray(int p0)
}
public final class test/Foo : java/lang/Object, android/os/Parcelable {
@@ -121,7 +121,7 @@ public final class test/Foo$Creator : java/lang/Object, android/os/Parcelable$Cr
LABEL (L1)
}
public final test.Foo[] newArray(int p0)
public final java.lang.Object[] newArray(int p0)
}
public final class test/Foo : java/lang/Object, android/os/Parcelable {
@@ -48,7 +48,7 @@ public final class User$Creator : java/lang/Object, android/os/Parcelable$Creato
LABEL (L1)
}
public final User[] newArray(int p0) {
public final java.lang.Object[] newArray(int p0) {
LABEL (L0)
ILOAD (1)
ANEWARRAY
@@ -36,11 +36,11 @@ public final class User$Creator : java/lang/Object, android/os/Parcelable$Creato
public final java.lang.Object createFromParcel(android.os.Parcel p0)
public final User[] newArray(int p0) {
public final java.lang.Object[] newArray(int p0) {
LABEL (L0)
GETSTATIC (Companion, LUser$Companion;)
ILOAD (1)
INVOKEVIRTUAL (User$Companion, newArray, (I)[LUser;)
INVOKEVIRTUAL (User$Companion, newArray, (I)[Ljava/lang/Object;)
ARETURN
LABEL (L1)
}
@@ -15,7 +15,7 @@ public final class User$Creator : java/lang/Object, android/os/Parcelable$Creato
public final java.lang.Object createFromParcel(android.os.Parcel p0)
public final User[] newArray(int p0)
public final java.lang.Object[] newArray(int p0)
}
public final class User : AbstractUser {
@@ -15,7 +15,7 @@ public final class User$Creator : java/lang/Object, android/os/Parcelable$Creato
public final java.lang.Object createFromParcel(android.os.Parcel p0)
public final User[] newArray(int p0)
public final java.lang.Object[] newArray(int p0)
}
public final class User : java/lang/Object, android/os/Parcelable {
@@ -3,7 +3,7 @@ public final class Test$Creator : java/lang/Object, android/os/Parcelable$Creato
public final java.lang.Object createFromParcel(android.os.Parcel p0)
public final Test[] newArray(int p0)
public final java.lang.Object[] newArray(int p0)
}
public final class Test : java/lang/Object {
@@ -3,7 +3,7 @@ public final class TestNotNull$Creator : java/lang/Object, android/os/Parcelable
public final java.lang.Object createFromParcel(android.os.Parcel p0)
public final TestNotNull[] newArray(int p0)
public final java.lang.Object[] newArray(int p0)
}
public final class TestNotNull : java/lang/Object {
@@ -38,7 +38,7 @@ public final class TestNullable$Creator : java/lang/Object, android/os/Parcelabl
public final java.lang.Object createFromParcel(android.os.Parcel p0)
public final TestNullable[] newArray(int p0)
public final java.lang.Object[] newArray(int p0)
}
public final class TestNullable : java/lang/Object {
@@ -17,7 +17,7 @@ public final class test/Foo$Creator : java/lang/Object, android/os/Parcelable$Cr
LABEL (L1)
}
public final test.Foo[] newArray(int p0)
public final java.lang.Object[] newArray(int p0)
}
public final class test/Foo : java/lang/Object, android/os/Parcelable {
@@ -31,7 +31,7 @@ public final class User$Creator : java/lang/Object, android/os/Parcelable$Creato
LABEL (L1)
}
public final User[] newArray(int p0)
public final java.lang.Object[] newArray(int p0)
}
public final class User : java/lang/Object, android/os/Parcelable {
@@ -25,7 +25,7 @@ public final class User$Creator : java/lang/Object, android/os/Parcelable$Creato
in: Landroid/os/Parcel;
}
public final User[] newArray(int p0)
public final java.lang.Object[] newArray(int p0)
}
public final class User : java/lang/Object, android/os/Parcelable {
@@ -3,7 +3,7 @@ public final class Test$Creator : java/lang/Object, android/os/Parcelable$Creato
public final java.lang.Object createFromParcel(android.os.Parcel p0)
public final Test[] newArray(int p0)
public final java.lang.Object[] newArray(int p0)
}
public final class Test : java/lang/Object {
@@ -25,7 +25,7 @@ public final class Test$Creator : java/lang/Object, android/os/Parcelable$Creato
LABEL (L4)
}
public final Test[] newArray(int p0)
public final java.lang.Object[] newArray(int p0)
}
public final class Test : java/lang/Object, android/os/Parcelable {
@@ -115,7 +115,7 @@ public final class TestF$Creator : java/lang/Object, android/os/Parcelable$Creat
LABEL (L4)
}
public final TestF[] newArray(int p0)
public final java.lang.Object[] newArray(int p0)
}
public final class TestF : java/lang/Object, android/os/Parcelable {