[JS IR BE] Support IrDynamicExpression in proto and deserializer
This commit is contained in:
+1826
File diff suppressed because it is too large
Load Diff
+57
@@ -566,6 +566,59 @@ abstract class IrModuleDeserializer(
|
|||||||
return loop
|
return loop
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun deserializeDynamicMemberExpression(proto: IrKlibProtoBuf.IrDynamicMemberExpression, start: Int, end: Int, type: IrType) =
|
||||||
|
IrDynamicMemberExpressionImpl(start, end, type, deserializeString(proto.memberName), deserializeExpression(proto.receiver))
|
||||||
|
|
||||||
|
private fun deserializeDynamicOperatorExpression(proto: IrKlibProtoBuf.IrDynamicOperatorExpression, start: Int, end: Int, type: IrType) =
|
||||||
|
IrDynamicOperatorExpressionImpl(start, end, type, deserializeDynamicOperator(proto.operator)).apply {
|
||||||
|
receiver = deserializeExpression(proto.receiver)
|
||||||
|
proto.argumentList.mapTo(arguments) { deserializeExpression(it) }
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun deserializeDynamicOperator(operator: IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator) = when (operator) {
|
||||||
|
IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.UNARY_PLUS -> IrDynamicOperator.UNARY_PLUS
|
||||||
|
IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.UNARY_MINUS -> IrDynamicOperator.UNARY_MINUS
|
||||||
|
|
||||||
|
IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.EXCL -> IrDynamicOperator.EXCL
|
||||||
|
|
||||||
|
IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.PREFIX_INCREMENT -> IrDynamicOperator.PREFIX_INCREMENT
|
||||||
|
IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.PREFIX_DECREMENT -> IrDynamicOperator.PREFIX_DECREMENT
|
||||||
|
|
||||||
|
IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.POSTFIX_INCREMENT -> IrDynamicOperator.POSTFIX_INCREMENT
|
||||||
|
IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.POSTFIX_DECREMENT -> IrDynamicOperator.POSTFIX_DECREMENT
|
||||||
|
|
||||||
|
IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.BINARY_PLUS -> IrDynamicOperator.BINARY_PLUS
|
||||||
|
IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.BINARY_MINUS -> IrDynamicOperator.BINARY_MINUS
|
||||||
|
IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.MUL -> IrDynamicOperator.MUL
|
||||||
|
IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.DIV -> IrDynamicOperator.DIV
|
||||||
|
IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.MOD -> IrDynamicOperator.MOD
|
||||||
|
|
||||||
|
IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.GT -> IrDynamicOperator.GT
|
||||||
|
IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.LT -> IrDynamicOperator.LT
|
||||||
|
IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.GE -> IrDynamicOperator.GE
|
||||||
|
IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.LE -> IrDynamicOperator.LE
|
||||||
|
|
||||||
|
IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.EQEQ -> IrDynamicOperator.EQEQ
|
||||||
|
IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.EXCLEQ -> IrDynamicOperator.EXCLEQ
|
||||||
|
|
||||||
|
IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.EQEQEQ -> IrDynamicOperator.EQEQEQ
|
||||||
|
IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.EXCLEQEQ -> IrDynamicOperator.EXCLEQEQ
|
||||||
|
|
||||||
|
IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.ANDAND -> IrDynamicOperator.ANDAND
|
||||||
|
IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.OROR -> IrDynamicOperator.OROR
|
||||||
|
|
||||||
|
IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.EQ -> IrDynamicOperator.EQ
|
||||||
|
IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.PLUSEQ -> IrDynamicOperator.PLUSEQ
|
||||||
|
IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.MINUSEQ -> IrDynamicOperator.MINUSEQ
|
||||||
|
IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.MULEQ -> IrDynamicOperator.MULEQ
|
||||||
|
IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.DIVEQ -> IrDynamicOperator.DIVEQ
|
||||||
|
IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.MODEQ -> IrDynamicOperator.MODEQ
|
||||||
|
|
||||||
|
IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.ARRAY_ACCESS -> IrDynamicOperator.ARRAY_ACCESS
|
||||||
|
|
||||||
|
IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.INVOKE -> IrDynamicOperator.INVOKE
|
||||||
|
}
|
||||||
|
|
||||||
private fun deserializeBreak(proto: IrKlibProtoBuf.IrBreak, start: Int, end: Int, type: IrType): IrBreak {
|
private fun deserializeBreak(proto: IrKlibProtoBuf.IrBreak, start: Int, end: Int, type: IrType): IrBreak {
|
||||||
val label = if (proto.hasLabel()) deserializeString(proto.label) else null
|
val label = if (proto.hasLabel()) deserializeString(proto.label) else null
|
||||||
val loopId = proto.loopId
|
val loopId = proto.loopId
|
||||||
@@ -670,6 +723,10 @@ abstract class IrModuleDeserializer(
|
|||||||
-> deserializeWhen(proto.`when`, start, end, type)
|
-> deserializeWhen(proto.`when`, start, end, type)
|
||||||
WHILE
|
WHILE
|
||||||
-> deserializeWhile(proto.`while`, start, end, type)
|
-> deserializeWhile(proto.`while`, start, end, type)
|
||||||
|
DYNAMIC_MEMBER
|
||||||
|
-> deserializeDynamicMemberExpression(proto.dynamicMember, start, end, type)
|
||||||
|
DYNAMIC_OPERATOR
|
||||||
|
-> deserializeDynamicOperatorExpression(proto.dynamicOperator, start, end, type)
|
||||||
OPERATION_NOT_SET
|
OPERATION_NOT_SET
|
||||||
-> error("Expression deserialization not implemented: ${proto.operationCase}")
|
-> error("Expression deserialization not implemented: ${proto.operationCase}")
|
||||||
}
|
}
|
||||||
|
|||||||
+64
@@ -668,6 +668,68 @@ internal class IrModuleSerializer(
|
|||||||
return proto.build()
|
return proto.build()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun serializeDynamicMemberExpression(expression: IrDynamicMemberExpression): IrKlibProtoBuf.IrDynamicMemberExpression {
|
||||||
|
val proto = IrKlibProtoBuf.IrDynamicMemberExpression.newBuilder()
|
||||||
|
.setMemberName(serializeString(expression.memberName))
|
||||||
|
.setReceiver(serializeExpression(expression.receiver))
|
||||||
|
|
||||||
|
return proto.build()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun serializeDynamicOperatorExpression(expression: IrDynamicOperatorExpression): IrKlibProtoBuf.IrDynamicOperatorExpression {
|
||||||
|
val proto = IrKlibProtoBuf.IrDynamicOperatorExpression.newBuilder()
|
||||||
|
.setOperator(serializeDynamicOperator(expression.operator))
|
||||||
|
.setReceiver(serializeExpression(expression.receiver))
|
||||||
|
|
||||||
|
expression.arguments.forEach { proto.addArgument(serializeExpression(it)) }
|
||||||
|
|
||||||
|
return proto.build()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun serializeDynamicOperator(operator: IrDynamicOperator) = when (operator) {
|
||||||
|
IrDynamicOperator.UNARY_PLUS -> IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.UNARY_PLUS
|
||||||
|
IrDynamicOperator.UNARY_MINUS -> IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.UNARY_MINUS
|
||||||
|
|
||||||
|
IrDynamicOperator.EXCL -> IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.EXCL
|
||||||
|
|
||||||
|
IrDynamicOperator.PREFIX_INCREMENT -> IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.PREFIX_INCREMENT
|
||||||
|
IrDynamicOperator.PREFIX_DECREMENT -> IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.PREFIX_DECREMENT
|
||||||
|
|
||||||
|
IrDynamicOperator.POSTFIX_INCREMENT -> IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.POSTFIX_INCREMENT
|
||||||
|
IrDynamicOperator.POSTFIX_DECREMENT -> IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.POSTFIX_DECREMENT
|
||||||
|
|
||||||
|
IrDynamicOperator.BINARY_PLUS -> IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.BINARY_PLUS
|
||||||
|
IrDynamicOperator.BINARY_MINUS -> IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.BINARY_MINUS
|
||||||
|
IrDynamicOperator.MUL -> IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.MUL
|
||||||
|
IrDynamicOperator.DIV -> IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.DIV
|
||||||
|
IrDynamicOperator.MOD -> IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.MOD
|
||||||
|
|
||||||
|
IrDynamicOperator.GT -> IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.GT
|
||||||
|
IrDynamicOperator.LT -> IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.LT
|
||||||
|
IrDynamicOperator.GE -> IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.GE
|
||||||
|
IrDynamicOperator.LE -> IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.LE
|
||||||
|
|
||||||
|
IrDynamicOperator.EQEQ -> IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.EQEQ
|
||||||
|
IrDynamicOperator.EXCLEQ -> IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.EXCLEQ
|
||||||
|
|
||||||
|
IrDynamicOperator.EQEQEQ -> IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.EQEQEQ
|
||||||
|
IrDynamicOperator.EXCLEQEQ -> IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.EXCLEQEQ
|
||||||
|
|
||||||
|
IrDynamicOperator.ANDAND -> IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.ANDAND
|
||||||
|
IrDynamicOperator.OROR -> IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.OROR
|
||||||
|
|
||||||
|
IrDynamicOperator.EQ -> IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.EQ
|
||||||
|
IrDynamicOperator.PLUSEQ -> IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.PLUSEQ
|
||||||
|
IrDynamicOperator.MINUSEQ -> IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.MINUSEQ
|
||||||
|
IrDynamicOperator.MULEQ -> IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.MULEQ
|
||||||
|
IrDynamicOperator.DIVEQ -> IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.DIVEQ
|
||||||
|
IrDynamicOperator.MODEQ -> IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.MODEQ
|
||||||
|
|
||||||
|
IrDynamicOperator.ARRAY_ACCESS -> IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.ARRAY_ACCESS
|
||||||
|
|
||||||
|
IrDynamicOperator.INVOKE -> IrKlibProtoBuf.IrDynamicOperatorExpression.IrDynamicOperator.INVOKE
|
||||||
|
}
|
||||||
|
|
||||||
private fun serializeBreak(expression: IrBreak): IrKlibProtoBuf.IrBreak {
|
private fun serializeBreak(expression: IrBreak): IrKlibProtoBuf.IrBreak {
|
||||||
val proto = IrKlibProtoBuf.IrBreak.newBuilder()
|
val proto = IrKlibProtoBuf.IrBreak.newBuilder()
|
||||||
val label = expression.label?.let { serializeString(it) }
|
val label = expression.label?.let { serializeString(it) }
|
||||||
@@ -743,6 +805,8 @@ internal class IrModuleSerializer(
|
|||||||
is IrVararg -> operationProto.vararg = serializeVararg(expression)
|
is IrVararg -> operationProto.vararg = serializeVararg(expression)
|
||||||
is IrWhen -> operationProto.`when` = serializeWhen(expression)
|
is IrWhen -> operationProto.`when` = serializeWhen(expression)
|
||||||
is IrWhileLoop -> operationProto.`while` = serializeWhile(expression)
|
is IrWhileLoop -> operationProto.`while` = serializeWhile(expression)
|
||||||
|
is IrDynamicMemberExpression -> operationProto.dynamicMember = serializeDynamicMemberExpression(expression)
|
||||||
|
is IrDynamicOperatorExpression -> operationProto.dynamicOperator = serializeDynamicOperatorExpression(expression)
|
||||||
else -> {
|
else -> {
|
||||||
TODO("Expression serialization not implemented yet: ${ir2string(expression)}.")
|
TODO("Expression serialization not implemented yet: ${ir2string(expression)}.")
|
||||||
}
|
}
|
||||||
|
|||||||
+50
@@ -394,6 +394,54 @@ message IrWhile {
|
|||||||
required Loop loop = 1;
|
required Loop loop = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ------ Dynamic expression --------------------------------------------- */
|
||||||
|
|
||||||
|
message IrDynamicMemberExpression {
|
||||||
|
required String memberName = 1;
|
||||||
|
required IrExpression receiver = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message IrDynamicOperatorExpression {
|
||||||
|
enum IrDynamicOperator {
|
||||||
|
UNARY_PLUS = 1;
|
||||||
|
UNARY_MINUS = 2;
|
||||||
|
EXCL = 3;
|
||||||
|
PREFIX_INCREMENT = 4;
|
||||||
|
POSTFIX_INCREMENT = 5;
|
||||||
|
PREFIX_DECREMENT = 6;
|
||||||
|
POSTFIX_DECREMENT = 7;
|
||||||
|
|
||||||
|
BINARY_PLUS = 8;
|
||||||
|
BINARY_MINUS = 9;
|
||||||
|
MUL = 10;
|
||||||
|
DIV = 11;
|
||||||
|
MOD = 12;
|
||||||
|
GT = 13;
|
||||||
|
LT = 14;
|
||||||
|
GE = 15;
|
||||||
|
LE = 16;
|
||||||
|
EQEQ = 17;
|
||||||
|
EXCLEQ = 18;
|
||||||
|
EQEQEQ = 19;
|
||||||
|
EXCLEQEQ = 20;
|
||||||
|
ANDAND = 21;
|
||||||
|
OROR = 22;
|
||||||
|
|
||||||
|
EQ = 23;
|
||||||
|
PLUSEQ = 24;
|
||||||
|
MINUSEQ = 25;
|
||||||
|
MULEQ = 26;
|
||||||
|
DIVEQ = 27;
|
||||||
|
MODEQ = 28;
|
||||||
|
|
||||||
|
ARRAY_ACCESS = 29;
|
||||||
|
INVOKE = 30;
|
||||||
|
}
|
||||||
|
required IrDynamicOperator operator = 1;
|
||||||
|
required IrExpression receiver = 2;
|
||||||
|
repeated IrExpression argument = 3;
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: we need an extension mechanism to accomodate new
|
// TODO: we need an extension mechanism to accomodate new
|
||||||
// IR operators in upcoming releases.
|
// IR operators in upcoming releases.
|
||||||
message IrOperation {
|
message IrOperation {
|
||||||
@@ -426,6 +474,8 @@ message IrOperation {
|
|||||||
IrVararg vararg = 26;
|
IrVararg vararg = 26;
|
||||||
IrWhen when = 27;
|
IrWhen when = 27;
|
||||||
IrWhile while = 28;
|
IrWhile while = 28;
|
||||||
|
IrDynamicMemberExpression dynamic_member = 29;
|
||||||
|
IrDynamicOperatorExpression dynamic_operator = 30;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user