From 07c5b2201cba40cb270318b3b901a32313355c9a Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Tue, 27 Feb 2018 15:58:54 +0300 Subject: [PATCH] Don't skip absent args during function serialization. So that we can recover an explicit null value correctly. --- .../kotlin/backend/konan/serialization/KonanIr.proto | 6 +++++- .../backend/konan/serialization/SerializeIr.kt | 12 ++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIr.proto b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIr.proto index f78166a7f4a..090ddf2c912 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIr.proto +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/KonanIr.proto @@ -94,7 +94,7 @@ message MemberAccessCommon { required TypeMap type_map = 3; optional IrExpression dispatch_receiver = 5; optional IrExpression extension_receiver = 6; - repeated IrExpression value_argument = 7; + repeated NullableIrExpression value_argument = 8; } message IrCall { @@ -306,6 +306,10 @@ message IrExpression { required Coordinates coordinates = 3; } +message NullableIrExpression { + optional IrExpression expression = 1; +} + /* ------ Declarations --------------------------------------------- */ diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/SerializeIr.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/SerializeIr.kt index 50de2291e1d..8fd5a2e8ed3 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/SerializeIr.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/serialization/SerializeIr.kt @@ -195,6 +195,7 @@ internal class IrSerializer(val context: Context, call.descriptor.valueParameters.forEach { val actual = call.getValueArgument(it.index) + val argOrNull = KonanIr.NullableIrExpression.newBuilder() if (actual == null) { // Am I observing an IR generation regression? // I see a lack of arg for an empty vararg, @@ -202,9 +203,9 @@ internal class IrSerializer(val context: Context, assert(it.varargElementType != null || it.declaresDefaultValue()) } else { - val argProto = serializeExpression(actual) - proto.addValueArgument(argProto) + argOrNull.expression = serializeExpression(actual) } + proto.addValueArgument(argOrNull) } return proto.build() } @@ -809,8 +810,11 @@ internal class IrDeserializer(val context: Context, private fun deserializeMemberAccessCommon(access: IrMemberAccessExpression, proto: KonanIr.MemberAccessCommon) { - proto.valueArgumentList.mapIndexed { i, expr -> - access.putValueArgument(i, deserializeExpression(expr)) + proto.valueArgumentList.mapIndexed { i, arg -> + val exprOrNull = if (arg.hasExpression()) + deserializeExpression(arg.expression) + else null + access.putValueArgument(i, exprOrNull) } if (proto.hasDispatchReceiver()) {