Don't skip absent args during function serialization.
So that we can recover an explicit null value correctly.
This commit is contained in:
committed by
alexander-gorshenev
parent
f78bd00e80
commit
07c5b2201c
+5
-1
@@ -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 --------------------------------------------- */
|
||||
|
||||
|
||||
+8
-4
@@ -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()) {
|
||||
|
||||
Reference in New Issue
Block a user