Don't skip absent args during function serialization.

So that we can recover an explicit null value correctly.
This commit is contained in:
Alexander Gorshenev
2018-02-27 15:58:54 +03:00
committed by alexander-gorshenev
parent f78bd00e80
commit 07c5b2201c
2 changed files with 13 additions and 5 deletions
@@ -94,7 +94,7 @@ message MemberAccessCommon {
required TypeMap type_map = 3; required TypeMap type_map = 3;
optional IrExpression dispatch_receiver = 5; optional IrExpression dispatch_receiver = 5;
optional IrExpression extension_receiver = 6; optional IrExpression extension_receiver = 6;
repeated IrExpression value_argument = 7; repeated NullableIrExpression value_argument = 8;
} }
message IrCall { message IrCall {
@@ -306,6 +306,10 @@ message IrExpression {
required Coordinates coordinates = 3; required Coordinates coordinates = 3;
} }
message NullableIrExpression {
optional IrExpression expression = 1;
}
/* ------ Declarations --------------------------------------------- */ /* ------ Declarations --------------------------------------------- */
@@ -195,6 +195,7 @@ internal class IrSerializer(val context: Context,
call.descriptor.valueParameters.forEach { call.descriptor.valueParameters.forEach {
val actual = call.getValueArgument(it.index) val actual = call.getValueArgument(it.index)
val argOrNull = KonanIr.NullableIrExpression.newBuilder()
if (actual == null) { if (actual == null) {
// Am I observing an IR generation regression? // Am I observing an IR generation regression?
// I see a lack of arg for an empty vararg, // I see a lack of arg for an empty vararg,
@@ -202,9 +203,9 @@ internal class IrSerializer(val context: Context,
assert(it.varargElementType != null || assert(it.varargElementType != null ||
it.declaresDefaultValue()) it.declaresDefaultValue())
} else { } else {
val argProto = serializeExpression(actual) argOrNull.expression = serializeExpression(actual)
proto.addValueArgument(argProto)
} }
proto.addValueArgument(argOrNull)
} }
return proto.build() return proto.build()
} }
@@ -809,8 +810,11 @@ internal class IrDeserializer(val context: Context,
private fun deserializeMemberAccessCommon(access: IrMemberAccessExpression, proto: KonanIr.MemberAccessCommon) { private fun deserializeMemberAccessCommon(access: IrMemberAccessExpression, proto: KonanIr.MemberAccessCommon) {
proto.valueArgumentList.mapIndexed { i, expr -> proto.valueArgumentList.mapIndexed { i, arg ->
access.putValueArgument(i, deserializeExpression(expr)) val exprOrNull = if (arg.hasExpression())
deserializeExpression(arg.expression)
else null
access.putValueArgument(i, exprOrNull)
} }
if (proto.hasDispatchReceiver()) { if (proto.hasDispatchReceiver()) {