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;
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 --------------------------------------------- */
@@ -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()) {