From 89c5f78a8e685043cb2d663ac889bfb053399dc6 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Sat, 2 Sep 2017 00:01:20 +0300 Subject: [PATCH] Parcelable: Use Parcel methods for reading-writing primitive types (KT-20020) --- .../parcel/serializers/ParcelSerializer.kt | 8 ++++++ .../parcel/serializers/ParcelSerializers.kt | 26 +++++++++++++++++++ 2 files changed, 34 insertions(+) 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 b833af257d1..c0263917ac0 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 @@ -64,6 +64,14 @@ interface ParcelSerializer { fun strict() = strict && !type.annotations.hasAnnotation(RAWVALUE_ANNOTATION_FQNAME) return when { + asmType.descriptor == "[I" + || asmType.descriptor == "[Z" + || asmType.descriptor == "[B" + || asmType.descriptor == "[C" + || asmType.descriptor == "[D" + || asmType.descriptor == "[F" + || asmType.descriptor == "[L" -> PrimitiveArrayParcelSerializer(asmType) + asmType.sort == Type.ARRAY -> { val elementType = type.builtIns.getArrayElementType(type) val elementSerializer = get(elementType, typeMapper.mapTypeSafe(elementType), context, strict = strict()) 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 c43af3f05c4..058534212bc 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 @@ -494,6 +494,32 @@ internal class NullAwareParcelSerializerWrapper(val delegate: ParcelSerializer) } } +internal class PrimitiveArrayParcelSerializer( + override val asmType: Type +) : ParcelSerializer { + private val methodNameBase = when (asmType.elementType) { + Type.INT_TYPE -> "Int" + Type.BOOLEAN_TYPE -> "Boolean" + Type.BYTE_TYPE -> "Byte" + Type.CHAR_TYPE -> "Char" + Type.DOUBLE_TYPE -> "Double" + Type.FLOAT_TYPE -> "Float" + Type.LONG_TYPE -> "Long" + else -> error("Unsupported type ${asmType.elementType.descriptor}") + } + + private val writeMethod = Method("write${methodNameBase}Array", "(${asmType.descriptor})V") + private val createArrayMethod = Method("create${methodNameBase}Array", "()${asmType.descriptor}") + + override fun writeValue(v: InstructionAdapter) { + v.invokevirtual(PARCEL_TYPE.internalName, writeMethod.name, writeMethod.signature, false) + } + + override fun readValue(v: InstructionAdapter) { + v.invokevirtual(PARCEL_TYPE.internalName, createArrayMethod.name, createArrayMethod.signature, false) + } +} + /** write...() and get...() methods in Android should support passing `null` values. */ internal class NullCompliantObjectParcelSerializer( override val asmType: Type,