[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
|
||||
}
|
||||
|
||||
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 {
|
||||
val label = if (proto.hasLabel()) deserializeString(proto.label) else null
|
||||
val loopId = proto.loopId
|
||||
@@ -670,6 +723,10 @@ abstract class IrModuleDeserializer(
|
||||
-> deserializeWhen(proto.`when`, start, end, type)
|
||||
WHILE
|
||||
-> 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
|
||||
-> error("Expression deserialization not implemented: ${proto.operationCase}")
|
||||
}
|
||||
|
||||
+64
@@ -668,6 +668,68 @@ internal class IrModuleSerializer(
|
||||
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 {
|
||||
val proto = IrKlibProtoBuf.IrBreak.newBuilder()
|
||||
val label = expression.label?.let { serializeString(it) }
|
||||
@@ -743,6 +805,8 @@ internal class IrModuleSerializer(
|
||||
is IrVararg -> operationProto.vararg = serializeVararg(expression)
|
||||
is IrWhen -> operationProto.`when` = serializeWhen(expression)
|
||||
is IrWhileLoop -> operationProto.`while` = serializeWhile(expression)
|
||||
is IrDynamicMemberExpression -> operationProto.dynamicMember = serializeDynamicMemberExpression(expression)
|
||||
is IrDynamicOperatorExpression -> operationProto.dynamicOperator = serializeDynamicOperatorExpression(expression)
|
||||
else -> {
|
||||
TODO("Expression serialization not implemented yet: ${ir2string(expression)}.")
|
||||
}
|
||||
|
||||
+50
@@ -394,6 +394,54 @@ message IrWhile {
|
||||
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
|
||||
// IR operators in upcoming releases.
|
||||
message IrOperation {
|
||||
@@ -426,6 +474,8 @@ message IrOperation {
|
||||
IrVararg vararg = 26;
|
||||
IrWhen when = 27;
|
||||
IrWhile while = 28;
|
||||
IrDynamicMemberExpression dynamic_member = 29;
|
||||
IrDynamicOperatorExpression dynamic_operator = 30;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user