opcodeFrom static method

List<int> opcodeFrom(
  1. EvcOp op
)

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');
  }
}