From 37f34e16f0be1452926251a119d006decfc12747 Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Tue, 30 Mar 2021 09:46:42 +0900 Subject: [PATCH] Improve KotlinJsonAdapter performance by invoke KFunction by "call". (#1286) --- .../moshi/kotlin/reflect/KotlinJsonAdapter.kt | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/kotlin/reflect/src/main/java/com/squareup/moshi/kotlin/reflect/KotlinJsonAdapter.kt b/kotlin/reflect/src/main/java/com/squareup/moshi/kotlin/reflect/KotlinJsonAdapter.kt index 222f66d..d49415d 100644 --- a/kotlin/reflect/src/main/java/com/squareup/moshi/kotlin/reflect/KotlinJsonAdapter.kt +++ b/kotlin/reflect/src/main/java/com/squareup/moshi/kotlin/reflect/KotlinJsonAdapter.kt @@ -94,21 +94,27 @@ internal class KotlinJsonAdapter( reader.endObject() // Confirm all parameters are present, optional, or nullable. + var isFullInitialized = allBindings.size == constructorSize for (i in 0 until constructorSize) { - if (values[i] === ABSENT_VALUE && !constructor.parameters[i].isOptional) { - if (!constructor.parameters[i].type.isMarkedNullable) { - throw Util.missingProperty( + if (values[i] === ABSENT_VALUE) { + when { + constructor.parameters[i].isOptional -> isFullInitialized = false + constructor.parameters[i].type.isMarkedNullable -> values[i] = null // Replace absent with null. + else -> throw Util.missingProperty( constructor.parameters[i].name, allBindings[i]?.jsonName, reader ) } - values[i] = null // Replace absent with null. } } // Call the constructor using a Map so that absent optionals get defaults. - val result = constructor.callBy(IndexedParameterMap(constructor.parameters, values)) + val result = if (isFullInitialized) { + constructor.call(*values) + } else { + constructor.callBy(IndexedParameterMap(constructor.parameters, values)) + } // Set remaining properties. for (i in constructorSize until allBindings.size) {