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;
|
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 --------------------------------------------- */
|
||||||
|
|
||||||
|
|||||||
+8
-4
@@ -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()) {
|
||||||
|
|||||||
Reference in New Issue
Block a user