opcodeFrom static method
Write an EvcOp
bytecode to a list of bytes.
Implementation
static List<int> opcodeFrom(EvcOp op) {
switch (op) {
case JumpConstant op:
return [Evc.OP_JMPC, ...Evc.i32b(op._offset)];
case Exit op:
return [Evc.OP_EXIT, ...Evc.i16b(op._location)];
case Unbox op:
return [Evc.OP_UNBOX, ...Evc.i16b(op._reg)];
case PushReturnValue _:
return [Evc.OP_SETVR];
case NumAdd op:
return [
Evc.OP_ADDVV,
...Evc.i16b(op._location1),
...Evc.i16b(op._location2)
];
case NumSub op:
return [
Evc.OP_NUM_SUB,
...Evc.i16b(op._location1),
...Evc.i16b(op._location2)
];
case BoxInt op:
return [Evc.OP_BOXINT, ...Evc.i16b(op._reg)];
case BoxDouble op:
return [Evc.OP_BOXDOUBLE, ...Evc.i16b(op._reg)];
case BoxNum op:
return [Evc.OP_BOXNUM, ...Evc.i16b(op._reg)];
case PushArg op:
return [Evc.OP_PUSH_ARG, ...Evc.i16b(op._location)];
case JumpIfNonNull op:
return [Evc.OP_JNZ, ...Evc.i16b(op._location), ...Evc.i32b(op._offset)];
case JumpIfFalse op:
return [
Evc.OP_JUMP_IF_FALSE,
...Evc.i16b(op._location),
...Evc.i32b(op._offset)
];
case PushConstantInt op:
return [Evc.OP_SETVC, ...Evc.i32b(op._value)];
case PushScope op:
return [
Evc.OP_PUSHSCOPE,
...Evc.i32b(op.sourceFile),
...Evc.i32b(op.sourceOffset),
...Evc.istr(op.frName)
];
case PopScope _:
return [Evc.OP_POPSCOPE];
case CopyValue op:
return [Evc.OP_SETVV, ...Evc.i16b(op._to), ...Evc.i16b(op._from)];
case SetReturnValue op:
return [Evc.OP_SETRV, ...Evc.i16b(op._location)];
case Return op:
return [Evc.OP_RETURN, ...Evc.i16b(op._location)];
case ReturnAsync op:
return [
Evc.OP_RETURN_ASYNC,
...Evc.i16b(op._location),
...Evc.i16b(op._completerOffset)
];
case Pop op:
return [Evc.OP_POP, op._amount];
case Call op:
return [Evc.OP_CALL, ...Evc.i32b(op._offset)];
case InvokeDynamic op:
return [
Evc.OP_INVOKE_DYNAMIC,
...Evc.i16b(op._location),
...Evc.i32b(op._methodIdx)
];
case SetObjectProperty op:
return [
Evc.OP_SET_OBJECT_PROP,
...Evc.i16b(op._location),
...Evc.istr(op._property),
...Evc.i16b(op._valueOffset)
];
case PushObjectProperty op:
return [
Evc.OP_PUSH_OBJECT_PROP,
...Evc.i16b(op._location),
...Evc.i32b(op._propertyIdx)
];
case PushObjectPropertyImpl op:
return [
Evc.OP_PUSH_OBJECT_PROP_IMPL,
...Evc.i16b(op.objectOffset),
...Evc.i16b(op._propertyIndex)
];
case SetObjectPropertyImpl op:
return [
Evc.OP_SET_OBJECT_PROP_IMPL,
...Evc.i16b(op._objectOffset),
...Evc.i16b(op._propertyIndex),
...Evc.i16b(op._valueOffset)
];
case PushNull _:
return [Evc.OP_PUSH_NULL];
case CreateClass op:
return [
Evc.OP_CREATE_CLASS,
...Evc.i32b(op._library),
...Evc.i16b(op._super),
...Evc.istr(op._name),
...Evc.i16b(op._valuesLen)
];
case NumLt op:
return [
Evc.OP_NUM_LT,
...Evc.i16b(op._location1),
...Evc.i16b(op._location2)
];
case NumLtEq op:
return [
Evc.OP_NUM_LT_EQ,
...Evc.i16b(op._location1),
...Evc.i16b(op._location2)
];
case PushSuper op:
return [Evc.OP_PUSH_SUPER, ...Evc.i16b(op._objectOffset)];
case BridgeInstantiate op:
return [
Evc.OP_BRIDGE_INSTANTIATE,
...Evc.i16b(op._subclass),
...Evc.i32b(op._constructor)
];
case PushBridgeSuperShim _:
return [Evc.OP_PUSH_SUPER_SHIM];
case ParentBridgeSuperShim op:
return [
Evc.OP_PARENT_SUPER_SHIM,
...Evc.i16b(op._shimOffset),
...Evc.i16b(op._bridgeOffset)
];
case PushList _:
return [Evc.OP_PUSH_LIST];
case ListAppend op:
return [
Evc.OP_LIST_APPEND,
...Evc.i16b(op._reg),
...Evc.i16b(op._value)
];
case IndexList op:
return [
Evc.OP_INDEX_LIST,
...Evc.i16b(op._position),
...Evc.i32b(op._index)
];
case PushIterableLength op:
return [Evc.OP_ITER_LENGTH, ...Evc.i16b(op._position)];
case ListSetIndexed op:
return [
Evc.OP_LIST_SETINDEXED,
...Evc.i16b(op._position),
...Evc.i32b(op._index),
...Evc.i16b(op._value)
];
case BoxString op:
return [Evc.OP_BOXSTRING, ...Evc.i16b(op._reg)];
case BoxList op:
return [Evc.OP_BOXLIST, ...Evc.i16b(op._reg)];
case BoxMap op:
return [Evc.OP_BOXMAP, ...Evc.i16b(op._reg)];
case BoxBool op:
return [Evc.OP_BOXBOOL, ...Evc.i16b(op._reg)];
case BoxNull op:
return [Evc.OP_BOX_NULL, ...Evc.i16b(op._reg)];
case PushCaptureScope _:
return [Evc.OP_CAPTURE_SCOPE];
case PushConstant op:
return [Evc.OP_PUSH_CONST, ...Evc.i32b(op._const)];
case PushFunctionPtr op:
return [Evc.OP_PUSH_FUNCTION_PTR, ...Evc.i32b(op._offset)];
case InvokeExternal op:
return [Evc.OP_INVOKE_EXTERNAL, ...Evc.i32b(op._function)];
case Await op:
return [
Evc.OP_AWAIT,
...Evc.i16b(op._completerOffset),
...Evc.i16b(op._futureOffset)
];
case PushMap _:
return [Evc.OP_PUSH_MAP];
case MapSet op:
return [
Evc.OP_MAP_SET,
...Evc.i16b(op._map),
...Evc.i16b(op._index),
...Evc.i16b(op._value)
];
case IndexMap op:
return [Evc.OP_INDEX_MAP, ...Evc.i16b(op._map), ...Evc.i16b(op._index)];
case PushConstantDouble op:
return [Evc.OP_PUSH_DOUBLE, ...Evc.f32b(op._value)];
case SetGlobal op:
return [
Evc.OP_SET_GLOBAL,
...Evc.i32b(op._index),
...Evc.i16b(op._value)
];
case LoadGlobal op:
return [Evc.OP_LOAD_GLOBAL, ...Evc.i32b(op._index)];
case PushTrue _:
return [Evc.OP_PUSH_TRUE];
case LogicalNot op:
return [Evc.OP_LOGICAL_NOT, ...Evc.i16b(op._index)];
case CheckEq op:
return [
Evc.OP_CHECK_EQ,
...Evc.i16b(op._value1),
...Evc.i16b(op._value2)
];
case Try op:
return [Evc.OP_TRY, ...Evc.i32b(op._catchOffset)];
case Throw op:
return [Evc.OP_THROW, ...Evc.i16b(op._location)];
case PopCatch _:
return [Evc.OP_POP_CATCH];
case IsType op:
return [
Evc.OP_IS_TYPE,
...Evc.i16b(op._objectOffset),
...Evc.i32b(op._type),
op._not ? 1 : 0
];
case Assert op:
return [
Evc.OP_ASSERT,
...Evc.i16b(op._valueOffset),
...Evc.i16b(op._exceptionOffset)
];
case PushFinally op:
return [Evc.OP_PUSH_FINALLY, ...Evc.i32b(op._tryOffset)];
case PushReturnFromCatch _:
return [Evc.OP_PUSH_RETURN_FROM_CATCH];
case MaybeBoxNull op:
return [Evc.OP_MAYBE_BOX_NULL, ...Evc.i16b(op._reg)];
case PushRuntimeType op:
return [Evc.OP_PUSH_RUNTIME_TYPE, ...Evc.i16b(op._value)];
case PushConstantType op:
return [Evc.OP_PUSH_CONSTANT_TYPE, ...Evc.i32b(op._typeId)];
default:
throw ArgumentError('Not a valid op $op');
}
}