Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Firefox/third_party/rust/jsparagus-stencil/src/   (Browser von der Mozilla Stiftung Version 136.0.1©)  Datei vom 10.2.2025 mit Größe 26 kB image not shown  

Quelle  opcode.rs   Sprache: unbekannt

 
use std::convert::TryFrom;

macro_rules! using_opcode_database {
    ( $macro:ident ! ( ) ) => {
        $macro! {
            [
                // WARNING
                // The following section is generated by update_stencil.py.
                // Do mot modify manually.
                //
                // @@@@ BEGIN OPCODES @@@@
                (Undefined, undefined, "", 1, 0, 1, JOF_BYTE),
                (Null, null, "null", 1, 0, 1, JOF_BYTE),
                (False, false_, "false", 1, 0, 1, JOF_BYTE),
                (True, true_, "true", 1, 0, 1, JOF_BYTE),
                (Int32, int32, NULL, 5, 0, 1, JOF_INT32),
                (Zero, zero, "0", 1, 0, 1, JOF_BYTE),
                (One, one, "1", 1, 0, 1, JOF_BYTE),
                (Int8, int8, NULL, 2, 0, 1, JOF_INT8),
                (Uint16, uint16, NULL, 3, 0, 1, JOF_UINT16),
                (Uint24, uint24, NULL, 4, 0, 1, JOF_UINT24),
                (Double, double_, NULL, 9, 0, 1, JOF_DOUBLE),
                (BigInt, big_int, NULL, 5, 0, 1, JOF_BIGINT),
                (String, string, NULL, 5, 0, 1, JOF_STRING),
                (Symbol, symbol, NULL, 2, 0, 1, JOF_UINT8),
                (Void, void_, NULL, 1, 1, 1, JOF_BYTE),
                (Typeof, typeof_, NULL, 1, 1, 1, JOF_BYTE|JOF_IC),
                (TypeofExpr, typeof_expr, NULL, 1, 1, 1, JOF_BYTE|JOF_IC),
                (Pos, pos, "+ ", 1, 1, 1, JOF_BYTE|JOF_IC),
                (Neg, neg, "- ", 1, 1, 1, JOF_BYTE|JOF_IC),
                (BitNot, bit_not, "~", 1, 1, 1, JOF_BYTE|JOF_IC),
                (Not, not_, "!", 1, 1, 1, JOF_BYTE|JOF_IC),
                (BitOr, bit_or, "|",  1, 2, 1, JOF_BYTE|JOF_IC),
                (BitXor, bit_xor, "^", 1, 2, 1, JOF_BYTE|JOF_IC),
                (BitAnd, bit_and, "&", 1, 2, 1, JOF_BYTE|JOF_IC),
                (Eq, eq, "==", 1, 2, 1, JOF_BYTE|JOF_IC),
                (Ne, ne, "!=", 1, 2, 1, JOF_BYTE|JOF_IC),
                (StrictEq, strict_eq, "===", 1, 2, 1, JOF_BYTE|JOF_IC),
                (StrictNe, strict_ne, "!==", 1, 2, 1, JOF_BYTE|JOF_IC),
                (Lt, lt, "<",  1, 2, 1, JOF_BYTE|JOF_IC),
                (Gt, gt, ">",  1, 2, 1, JOF_BYTE|JOF_IC),
                (Le, le, "<=", 1, 2, 1, JOF_BYTE|JOF_IC),
                (Ge, ge, ">=", 1, 2, 1, JOF_BYTE|JOF_IC),
                (Instanceof, instanceof, "instanceof", 1, 2, 1, JOF_BYTE|JOF_IC),
                (In, in_, "in", 1, 2, 1, JOF_BYTE|JOF_IC),
                (Lsh, lsh, "<<", 1, 2, 1, JOF_BYTE|JOF_IC),
                (Rsh, rsh, ">>", 1, 2, 1, JOF_BYTE|JOF_IC),
                (Ursh, ursh, ">>>", 1, 2, 1, JOF_BYTE|JOF_IC),
                (Add, add, "+", 1, 2, 1, JOF_BYTE|JOF_IC),
                (Sub, sub, "-", 1, 2, 1, JOF_BYTE|JOF_IC),
                (Inc, inc, NULL, 1, 1, 1, JOF_BYTE|JOF_IC),
                (Dec, dec, NULL, 1, 1, 1, JOF_BYTE|JOF_IC),
                (Mul, mul, "*", 1, 2, 1, JOF_BYTE|JOF_IC),
                (Div, div, "/", 1, 2, 1, JOF_BYTE|JOF_IC),
                (Mod, mod, "%", 1, 2, 1, JOF_BYTE|JOF_IC),
                (Pow, pow, "**", 1, 2, 1, JOF_BYTE|JOF_IC),
                (ToPropertyKey, to_property_key, NULL, 1, 1, 1, JOF_BYTE|JOF_IC),
                (ToNumeric, to_numeric, NULL, 1, 1, 1, JOF_BYTE|JOF_IC),
                (ToString, to_string, NULL, 1, 1, 1, JOF_BYTE),
                (IsNullOrUndefined, is_null_or_undefined, NULL, 1, 1, 2, JOF_BYTE),
                (GlobalThis, global_this, NULL, 1, 0, 1, JOF_BYTE),
                (NonSyntacticGlobalThis, non_syntactic_global_this, NULL, 1, 0, 1, JOF_BYTE),
                (NewTarget, new_target, NULL, 1, 0, 1, JOF_BYTE),
                (DynamicImport, dynamic_import, NULL, 1, 2, 1, JOF_BYTE),
                (ImportMeta, import_meta, NULL, 1, 0, 1, JOF_BYTE),
                (NewInit, new_init, NULL, 1, 0, 1, JOF_BYTE|JOF_IC),
                (NewObject, new_object, NULL, 5, 0, 1, JOF_SHAPE|JOF_IC),
                (Object, object, NULL, 5, 0, 1, JOF_OBJECT),
                (ObjWithProto, obj_with_proto, NULL, 1, 1, 1, JOF_BYTE),
                (InitProp, init_prop, NULL, 5, 2, 1, JOF_ATOM|JOF_PROP|JOF_PROPINIT|JOF_IC),
                (InitHiddenProp, init_hidden_prop, NULL, 5, 2, 1, JOF_ATOM|JOF_PROP|JOF_PROPINIT|JOF_IC),
                (InitLockedProp, init_locked_prop, NULL, 5, 2, 1, JOF_ATOM|JOF_PROP|JOF_PROPINIT|JOF_IC),
                (InitElem, init_elem, NULL, 1, 3, 1, JOF_BYTE|JOF_ELEM|JOF_PROPINIT|JOF_IC),
                (InitHiddenElem, init_hidden_elem, NULL, 1, 3, 1, JOF_BYTE|JOF_ELEM|JOF_PROPINIT|JOF_IC),
                (InitLockedElem, init_locked_elem, NULL, 1, 3, 1, JOF_BYTE|JOF_ELEM|JOF_PROPINIT|JOF_IC),
                (InitPropGetter, init_prop_getter, NULL, 5, 2, 1, JOF_ATOM|JOF_PROP|JOF_PROPINIT),
                (InitHiddenPropGetter, init_hidden_prop_getter, NULL, 5, 2, 1, JOF_ATOM|JOF_PROP|JOF_PROPINIT),
                (InitElemGetter, init_elem_getter, NULL, 1, 3, 1, JOF_BYTE|JOF_ELEM|JOF_PROPINIT),
                (InitHiddenElemGetter, init_hidden_elem_getter, NULL, 1, 3, 1, JOF_BYTE|JOF_ELEM|JOF_PROPINIT),
                (InitPropSetter, init_prop_setter, NULL, 5, 2, 1, JOF_ATOM|JOF_PROP|JOF_PROPINIT),
                (InitHiddenPropSetter, init_hidden_prop_setter, NULL, 5, 2, 1, JOF_ATOM|JOF_PROP|JOF_PROPINIT),
                (InitElemSetter, init_elem_setter, NULL, 1, 3, 1, JOF_BYTE|JOF_ELEM|JOF_PROPINIT),
                (InitHiddenElemSetter, init_hidden_elem_setter, NULL, 1, 3, 1, JOF_BYTE|JOF_ELEM|JOF_PROPINIT),
                (GetProp, get_prop, NULL, 5, 1, 1, JOF_ATOM|JOF_PROP|JOF_IC),
                (GetElem, get_elem, NULL, 1, 2, 1, JOF_BYTE|JOF_ELEM|JOF_IC),
                (SetProp, set_prop, NULL, 5, 2, 1, JOF_ATOM|JOF_PROP|JOF_PROPSET|JOF_CHECKSLOPPY|JOF_IC),
                (StrictSetProp, strict_set_prop, NULL, 5, 2, 1, JOF_ATOM|JOF_PROP|JOF_PROPSET|JOF_CHECKSTRICT|JOF_IC),
                (SetElem, set_elem, NULL, 1, 3, 1, JOF_BYTE|JOF_ELEM|JOF_PROPSET|JOF_CHECKSLOPPY|JOF_IC),
                (StrictSetElem, strict_set_elem, NULL, 1, 3, 1, JOF_BYTE|JOF_ELEM|JOF_PROPSET|JOF_CHECKSTRICT|JOF_IC),
                (DelProp, del_prop, NULL, 5, 1, 1, JOF_ATOM|JOF_PROP|JOF_CHECKSLOPPY),
                (StrictDelProp, strict_del_prop, NULL, 5, 1, 1, JOF_ATOM|JOF_PROP|JOF_CHECKSTRICT),
                (DelElem, del_elem, NULL, 1, 2, 1, JOF_BYTE|JOF_ELEM|JOF_CHECKSLOPPY),
                (StrictDelElem, strict_del_elem, NULL, 1, 2, 1, JOF_BYTE|JOF_ELEM|JOF_CHECKSTRICT),
                (HasOwn, has_own, NULL, 1, 2, 1, JOF_BYTE|JOF_IC),
                (CheckPrivateField, check_private_field, NULL, 3, 2, 3, JOF_TWO_UINT8|JOF_CHECKSTRICT|JOF_IC),
                (NewPrivateName, new_private_name, NULL, 5, 0, 1, JOF_ATOM),
                (SuperBase, super_base, NULL, 1, 1, 1, JOF_BYTE),
                (GetPropSuper, get_prop_super, NULL, 5, 2, 1, JOF_ATOM|JOF_PROP|JOF_IC),
                (GetElemSuper, get_elem_super, NULL, 1, 3, 1, JOF_BYTE|JOF_ELEM|JOF_IC),
                (SetPropSuper, set_prop_super, NULL, 5, 3, 1, JOF_ATOM|JOF_PROP|JOF_PROPSET|JOF_CHECKSLOPPY),
                (StrictSetPropSuper, strict_set_prop_super, NULL, 5, 3, 1, JOF_ATOM|JOF_PROP|JOF_PROPSET|JOF_CHECKSTRICT),
                (SetElemSuper, set_elem_super, NULL, 1, 4, 1, JOF_BYTE|JOF_ELEM|JOF_PROPSET|JOF_CHECKSLOPPY),
                (StrictSetElemSuper, strict_set_elem_super, NULL, 1, 4, 1, JOF_BYTE|JOF_ELEM|JOF_PROPSET|JOF_CHECKSTRICT),
                (Iter, iter, NULL, 1, 1, 1, JOF_BYTE|JOF_IC),
                (MoreIter, more_iter, NULL, 1, 1, 2, JOF_BYTE),
                (IsNoIter, is_no_iter, NULL, 1, 1, 2, JOF_BYTE),
                (EndIter, end_iter, NULL, 1, 2, 0, JOF_BYTE),
                (CloseIter, close_iter, NULL, 2, 1, 0, JOF_UINT8|JOF_IC),
                (CheckIsObj, check_is_obj, NULL, 2, 1, 1, JOF_UINT8),
                (CheckObjCoercible, check_obj_coercible, NULL, 1, 1, 1, JOF_BYTE),
                (ToAsyncIter, to_async_iter, NULL, 1, 2, 1, JOF_BYTE),
                (MutateProto, mutate_proto, NULL, 1, 2, 1, JOF_BYTE),
                (NewArray, new_array, NULL, 5, 0, 1, JOF_UINT32|JOF_IC),
                (InitElemArray, init_elem_array, NULL, 5, 2, 1, JOF_UINT32|JOF_ELEM|JOF_PROPINIT),
                (InitElemInc, init_elem_inc, NULL, 1, 3, 2, JOF_BYTE|JOF_ELEM|JOF_PROPINIT|JOF_IC),
                (Hole, hole, NULL, 1, 0, 1, JOF_BYTE),
                (RegExp, reg_exp, NULL, 5, 0, 1, JOF_REGEXP),
                (Lambda, lambda, NULL, 5, 0, 1, JOF_OBJECT),
                (SetFunName, set_fun_name, NULL, 2, 2, 1, JOF_UINT8),
                (InitHomeObject, init_home_object, NULL, 1, 2, 1, JOF_BYTE),
                (CheckClassHeritage, check_class_heritage, NULL, 1, 1, 1, JOF_BYTE),
                (FunWithProto, fun_with_proto, NULL, 5, 1, 1, JOF_OBJECT),
                (BuiltinObject, builtin_object, NULL, 2, 0, 1, JOF_UINT8),
                (Call, call, NULL, 3, -1, 1, JOF_ARGC|JOF_INVOKE|JOF_IC),
                (CallContent, call_content, NULL, 3, -1, 1, JOF_ARGC|JOF_INVOKE|JOF_IC),
                (CallIter, call_iter, NULL, 3, -1, 1, JOF_ARGC|JOF_INVOKE|JOF_IC),
                (CallContentIter, call_content_iter, NULL, 3, -1, 1, JOF_ARGC|JOF_INVOKE|JOF_IC),
                (CallIgnoresRv, call_ignores_rv, NULL, 3, -1, 1, JOF_ARGC|JOF_INVOKE|JOF_IC),
                (SpreadCall, spread_call, NULL, 1, 3, 1, JOF_BYTE|JOF_INVOKE|JOF_SPREAD|JOF_IC),
                (OptimizeSpreadCall, optimize_spread_call, NULL, 1, 1, 1, JOF_BYTE|JOF_IC),
                (Eval, eval, NULL, 3, -1, 1, JOF_ARGC|JOF_INVOKE|JOF_CHECKSLOPPY|JOF_IC),
                (SpreadEval, spread_eval, NULL, 1, 3, 1, JOF_BYTE|JOF_INVOKE|JOF_SPREAD|JOF_CHECKSLOPPY|JOF_IC),
                (StrictEval, strict_eval, NULL, 3, -1, 1, JOF_ARGC|JOF_INVOKE|JOF_CHECKSTRICT|JOF_IC),
                (StrictSpreadEval, strict_spread_eval, NULL, 1, 3, 1, JOF_BYTE|JOF_INVOKE|JOF_SPREAD|JOF_CHECKSTRICT|JOF_IC),
                (ImplicitThis, implicit_this, "", 5, 0, 1, JOF_ATOM),
                (CallSiteObj, call_site_obj, NULL, 5, 0, 1, JOF_OBJECT),
                (IsConstructing, is_constructing, NULL, 1, 0, 1, JOF_BYTE),
                (New, new_, NULL, 3, -1, 1, JOF_ARGC|JOF_INVOKE|JOF_CONSTRUCT|JOF_IC),
                (NewContent, new_content, NULL, 3, -1, 1, JOF_ARGC|JOF_INVOKE|JOF_CONSTRUCT|JOF_IC),
                (SuperCall, super_call, NULL, 3, -1, 1, JOF_ARGC|JOF_INVOKE|JOF_CONSTRUCT|JOF_IC),
                (SpreadNew, spread_new, NULL, 1, 4, 1, JOF_BYTE|JOF_INVOKE|JOF_CONSTRUCT|JOF_SPREAD|JOF_IC),
                (SpreadSuperCall, spread_super_call, NULL, 1, 4, 1, JOF_BYTE|JOF_INVOKE|JOF_CONSTRUCT|JOF_SPREAD|JOF_IC),
                (SuperFun, super_fun, NULL, 1, 1, 1, JOF_BYTE),
                (CheckThisReinit, check_this_reinit, NULL, 1, 1, 1, JOF_BYTE),
                (Generator, generator, NULL, 1, 0, 1, JOF_BYTE),
                (InitialYield, initial_yield, NULL, 4, 1, 3, JOF_RESUMEINDEX),
                (AfterYield, after_yield, NULL, 5, 0, 0, JOF_ICINDEX),
                (FinalYieldRval, final_yield_rval, NULL, 1, 1, 0, JOF_BYTE),
                (Yield, yield, NULL, 4, 2, 3, JOF_RESUMEINDEX),
                (IsGenClosing, is_gen_closing, NULL, 1, 1, 2, JOF_BYTE),
                (AsyncAwait, async_await, NULL, 1, 2, 1, JOF_BYTE),
                (AsyncResolve, async_resolve, NULL, 2, 2, 1, JOF_UINT8),
                (Await, await, NULL, 4, 2, 3, JOF_RESUMEINDEX),
                (CanSkipAwait, can_skip_await, NULL, 1, 1, 2, JOF_BYTE),
                (MaybeExtractAwaitValue, maybe_extract_await_value, NULL, 1, 2, 2, JOF_BYTE),
                (ResumeKind, resume_kind, NULL, 2, 0, 1, JOF_UINT8),
                (CheckResumeKind, check_resume_kind, NULL, 1, 3, 1, JOF_BYTE),
                (Resume, resume, NULL, 1, 3, 1, JOF_BYTE|JOF_INVOKE),
                (JumpTarget, jump_target, NULL, 5, 0, 0, JOF_ICINDEX),
                (LoopHead, loop_head, NULL, 6, 0, 0, JOF_LOOPHEAD),
                (Goto, goto_, NULL, 5, 0, 0, JOF_JUMP),
                (JumpIfFalse, jump_if_false, NULL, 5, 1, 0, JOF_JUMP|JOF_IC),
                (JumpIfTrue, jump_if_true, NULL, 5, 1, 0, JOF_JUMP|JOF_IC),
                (And, and_, NULL, 5, 1, 1, JOF_JUMP|JOF_IC),
                (Or, or_, NULL, 5, 1, 1, JOF_JUMP|JOF_IC),
                (Coalesce, coalesce, NULL, 5, 1, 1, JOF_JUMP),
                (Case, case_, NULL, 5, 2, 1, JOF_JUMP),
                (Default, default_, NULL, 5, 1, 0, JOF_JUMP),
                (TableSwitch, table_switch, NULL, 16, 1, 0, JOF_TABLESWITCH),
                (Return, return_, NULL, 1, 1, 0, JOF_BYTE),
                (GetRval, get_rval, NULL, 1, 0, 1, JOF_BYTE),
                (SetRval, set_rval, NULL, 1, 1, 0, JOF_BYTE),
                (RetRval, ret_rval, NULL, 1, 0, 0, JOF_BYTE),
                (CheckReturn, check_return, NULL, 1, 1, 1, JOF_BYTE),
                (Throw, throw_, NULL, 1, 1, 0, JOF_BYTE),
                (ThrowMsg, throw_msg, NULL, 2, 0, 0, JOF_UINT8),
                (ThrowSetConst, throw_set_const, NULL, 5, 0, 0, JOF_ATOM|JOF_NAME),
                (Try, try_, NULL, 1, 0, 0, JOF_BYTE),
                (TryDestructuring, try_destructuring, NULL, 1, 0, 0, JOF_BYTE),
                (Exception, exception, NULL, 1, 0, 1, JOF_BYTE),
                (Finally, finally, NULL, 1, 0, 0, JOF_BYTE),
                (Uninitialized, uninitialized, NULL, 1, 0, 1, JOF_BYTE),
                (InitLexical, init_lexical, NULL, 4, 1, 1, JOF_LOCAL|JOF_NAME),
                (InitGLexical, init_g_lexical, NULL, 5, 1, 1, JOF_ATOM|JOF_NAME|JOF_PROPINIT|JOF_GNAME|JOF_IC),
                (InitAliasedLexical, init_aliased_lexical, NULL, 5, 1, 1, JOF_ENVCOORD|JOF_NAME|JOF_PROPINIT),
                (CheckLexical, check_lexical, NULL, 4, 1, 1, JOF_LOCAL|JOF_NAME),
                (CheckAliasedLexical, check_aliased_lexical, NULL, 5, 1, 1, JOF_ENVCOORD|JOF_NAME),
                (CheckThis, check_this, NULL, 1, 1, 1, JOF_BYTE),
                (BindGName, bind_g_name, NULL, 5, 0, 1, JOF_ATOM|JOF_NAME|JOF_GNAME|JOF_IC),
                (BindName, bind_name, NULL, 5, 0, 1, JOF_ATOM|JOF_NAME|JOF_IC),
                (GetName, get_name, NULL, 5, 0, 1, JOF_ATOM|JOF_NAME|JOF_IC),
                (GetGName, get_g_name, NULL, 5, 0, 1, JOF_ATOM|JOF_NAME|JOF_GNAME|JOF_IC),
                (GetArg, get_arg, NULL, 3, 0, 1, JOF_QARG|JOF_NAME),
                (GetLocal, get_local, NULL, 4, 0, 1, JOF_LOCAL|JOF_NAME),
                (GetAliasedVar, get_aliased_var, NULL, 5, 0, 1, JOF_ENVCOORD|JOF_NAME),
                (GetAliasedDebugVar, get_aliased_debug_var, NULL, 5, 0, 1, JOF_DEBUGCOORD|JOF_NAME),
                (GetImport, get_import, NULL, 5, 0, 1, JOF_ATOM|JOF_NAME),
                (GetBoundName, get_bound_name, NULL, 5, 1, 1, JOF_ATOM|JOF_NAME|JOF_IC),
                (GetIntrinsic, get_intrinsic, NULL, 5, 0, 1, JOF_ATOM|JOF_NAME|JOF_IC),
                (Callee, callee, NULL, 1, 0, 1, JOF_BYTE),
                (EnvCallee, env_callee, NULL, 2, 0, 1, JOF_UINT8),
                (SetName, set_name, NULL, 5, 2, 1, JOF_ATOM|JOF_NAME|JOF_PROPSET|JOF_CHECKSLOPPY|JOF_IC),
                (StrictSetName, strict_set_name, NULL, 5, 2, 1, JOF_ATOM|JOF_NAME|JOF_PROPSET|JOF_CHECKSTRICT|JOF_IC),
                (SetGName, set_g_name, NULL, 5, 2, 1, JOF_ATOM|JOF_NAME|JOF_PROPSET|JOF_GNAME|JOF_CHECKSLOPPY|JOF_IC),
                (StrictSetGName, strict_set_g_name, NULL, 5, 2, 1, JOF_ATOM|JOF_NAME|JOF_PROPSET|JOF_GNAME|JOF_CHECKSTRICT|JOF_IC),
                (SetArg, set_arg, NULL, 3, 1, 1, JOF_QARG|JOF_NAME),
                (SetLocal, set_local, NULL, 4, 1, 1, JOF_LOCAL|JOF_NAME),
                (SetAliasedVar, set_aliased_var, NULL, 5, 1, 1, JOF_ENVCOORD|JOF_NAME|JOF_PROPSET),
                (SetIntrinsic, set_intrinsic, NULL, 5, 1, 1, JOF_ATOM|JOF_NAME),
                (PushLexicalEnv, push_lexical_env, NULL, 5, 0, 0, JOF_SCOPE),
                (PopLexicalEnv, pop_lexical_env, NULL, 1, 0, 0, JOF_BYTE),
                (DebugLeaveLexicalEnv, debug_leave_lexical_env, NULL, 1, 0, 0, JOF_BYTE),
                (RecreateLexicalEnv, recreate_lexical_env, NULL, 5, 0, 0, JOF_SCOPE),
                (FreshenLexicalEnv, freshen_lexical_env, NULL, 5, 0, 0, JOF_SCOPE),
                (PushClassBodyEnv, push_class_body_env, NULL, 5, 0, 0, JOF_SCOPE),
                (PushVarEnv, push_var_env, NULL, 5, 0, 0, JOF_SCOPE),
                (EnterWith, enter_with, NULL, 5, 1, 0, JOF_SCOPE),
                (LeaveWith, leave_with, NULL, 1, 0, 0, JOF_BYTE),
                (BindVar, bind_var, NULL, 1, 0, 1, JOF_BYTE),
                (GlobalOrEvalDeclInstantiation, global_or_eval_decl_instantiation, NULL, 5, 0, 0, JOF_GCTHING),
                (DelName, del_name, NULL, 5, 0, 1, JOF_ATOM|JOF_NAME|JOF_CHECKSLOPPY),
                (Arguments, arguments, NULL, 1, 0, 1, JOF_BYTE),
                (Rest, rest, NULL, 1, 0, 1, JOF_BYTE|JOF_IC),
                (FunctionThis, function_this, NULL, 1, 0, 1, JOF_BYTE),
                (Pop, pop, NULL, 1, 1, 0, JOF_BYTE),
                (PopN, pop_n, NULL, 3, -1, 0, JOF_UINT16),
                (Dup, dup, NULL, 1, 1, 2, JOF_BYTE),
                (Dup2, dup2, NULL, 1, 2, 4, JOF_BYTE),
                (DupAt, dup_at, NULL, 4, 0, 1, JOF_UINT24),
                (Swap, swap, NULL, 1, 2, 2, JOF_BYTE),
                (Pick, pick, NULL, 2, 0, 0, JOF_UINT8),
                (Unpick, unpick, NULL, 2, 0, 0, JOF_UINT8),
                (Nop, nop, NULL, 1, 0, 0, JOF_BYTE),
                (Lineno, lineno, NULL, 5, 0, 0, JOF_UINT32),
                (NopDestructuring, nop_destructuring, NULL, 1, 0, 0, JOF_BYTE),
                (ForceInterpreter, force_interpreter, NULL, 1, 0, 0, JOF_BYTE),
                (DebugCheckSelfHosted, debug_check_self_hosted, NULL, 1, 1, 1, JOF_BYTE),
                (Debugger, debugger, NULL, 1, 0, 0, JOF_BYTE),
                // @@@@ END OPCODES @@@@
            ]
        }
    }
}

macro_rules! define_opcode_enum {
    ( [ $( ( $op:ident , $( $_etc:tt )* ), )* ] ) => {
        #[derive(Copy, Clone, Debug, Eq, PartialEq)]
        #[repr(u8)]
        pub enum Opcode {
            $( $op, )*
        }
    }
}

using_opcode_database!(define_opcode_enum!());

macro_rules! count_rows {
    ( [ $( $ignored_row:tt , )* ] ) => {
        0 $( + count_rows!(one for $ignored_row) )*
    };

    ( one for $ignored_row:tt ) => {
        1
    }
}

const JSOP_LIMIT: usize = using_opcode_database!(count_rows!());

// WARNING
// The following section is generated by update_stencil.py.
// Do mot modify manually.
//
// @@@@ BEGIN FLAGS @@@@
/// single bytecode, no immediates
const JOF_BYTE: u32 = 0;

/// unspecified uint8_t argument
const JOF_UINT8: u32 = 1;

/// unspecified uint16_t argument
const JOF_UINT16: u32 = 2;

/// unspecified uint24_t argument
const JOF_UINT24: u32 = 3;

/// unspecified uint32_t argument
const JOF_UINT32: u32 = 4;

/// int8_t literal
const JOF_INT8: u32 = 5;

/// int32_t literal
const JOF_INT32: u32 = 6;

/// int32_t jump offset
const JOF_JUMP: u32 = 7;

/// table switch
const JOF_TABLESWITCH: u32 = 8;

/// embedded ScopeCoordinate immediate
const JOF_ENVCOORD: u32 = 9;

/// uint16_t argument count
const JOF_ARGC: u32 = 10;

/// function argument index
const JOF_QARG: u32 = 11;

/// var or block-local variable
const JOF_LOCAL: u32 = 12;

/// yield or await resume index
const JOF_RESUMEINDEX: u32 = 13;

/// inline DoubleValue
const JOF_DOUBLE: u32 = 14;

/// uint32_t generic gc-thing index
const JOF_GCTHING: u32 = 15;

/// uint32_t constant index
const JOF_ATOM: u32 = 16;

/// uint32_t object index
const JOF_OBJECT: u32 = 17;

/// uint32_t regexp index
const JOF_REGEXP: u32 = 18;

/// uint32_t scope index
const JOF_SCOPE: u32 = 19;

/// uint32_t index for BigInt value
const JOF_BIGINT: u32 = 20;

/// uint32_t IC index
const JOF_ICINDEX: u32 = 21;

/// JSOp::LoopHead, combines JOF_ICINDEX and JOF_UINT8
const JOF_LOOPHEAD: u32 = 22;

/// A pair of unspecified uint8_t arguments
const JOF_TWO_UINT8: u32 = 23;

/// An embedded ScopeCoordinate immediate that may traverse DebugEnvironmentProxies
const JOF_DEBUGCOORD: u32 = 24;

/// uint32_t shape index
const JOF_SHAPE: u32 = 25;

/// uint32_t constant index
const JOF_STRING: u32 = 26;

/// mask for above immediate types
const JOF_TYPEMASK: u32 = 0xFF;

/// name operation
const JOF_NAME: u32 = 1 << 8;

/// obj.prop operation
const JOF_PROP: u32 = 2 << 8;

/// obj[index] operation
const JOF_ELEM: u32 = 3 << 8;

/// property/element/name set operation
const JOF_PROPSET: u32 = 1 << 16;

/// property/element/name init operation
const JOF_PROPINIT: u32 = 1 << 17;

/// op can only be generated in sloppy mode
const JOF_CHECKSLOPPY: u32 = 1 << 18;

/// op can only be generated in strict mode
const JOF_CHECKSTRICT: u32 = 1 << 19;

/// any call, construct, or eval instruction
const JOF_INVOKE: u32 = 1 << 20;

/// invoke instruction using [[Construct]] entry
const JOF_CONSTRUCT: u32 = 1 << 21;

/// invoke instruction using spread argument
const JOF_SPREAD: u32 = 1 << 22;

/// predicted global name
const JOF_GNAME: u32 = 1 << 23;

/// baseline may use an IC for this op
const JOF_IC: u32 = 1 << 24;

// @@@@ END FLAGS @@@@

impl Opcode {
    /// Return the numeric bytecode value for this opcode, as understood by the
    /// SpiderMonkey interpreter and the rest of the VM.
    pub fn to_byte(&self) -> u8 {
        *self as u8
    }

    /// True if this opcode takes no operands (is a one-byte opcode) and
    /// implements a unary operator that operates on one stack value.
    ///
    /// The operators `typeof` and `delete` have different bytecode patterns
    /// and thus are not considered "simple"; `new` is considered a special
    /// kind of function call, not a unary operator.
    pub fn is_simple_unary_operator(self) -> bool {
        self == Opcode::Pos
            || self == Opcode::Neg
            || self == Opcode::Not
            || self == Opcode::BitNot
            || self == Opcode::Void
    }

    /// True if this opcode takes no operands (is a one-byte opcode) and
    /// implements a binary operator that operates on two stack values.
    ///
    /// The operators `||`, `&&`, and `,` have different bytecode patterns
    /// and thus are not considered "simple".
    pub fn is_simple_binary_operator(self) -> bool {
        self == Opcode::BitOr
            || self == Opcode::BitXor
            || self == Opcode::BitAnd
            || self == Opcode::Eq
            || self == Opcode::Ne
            || self == Opcode::StrictEq
            || self == Opcode::StrictNe
            || self == Opcode::Lt
            || self == Opcode::Gt
            || self == Opcode::Le
            || self == Opcode::Ge
            || self == Opcode::Instanceof
            || self == Opcode::In
            || self == Opcode::Lsh
            || self == Opcode::Rsh
            || self == Opcode::Ursh
            || self == Opcode::Add
            || self == Opcode::Sub
            || self == Opcode::Mul
            || self == Opcode::Div
            || self == Opcode::Mod
            || self == Opcode::Pow
    }

    pub fn is_jump_target(self) -> bool {
        self == Opcode::JumpTarget || self == Opcode::LoopHead || self == Opcode::AfterYield
    }

    pub fn is_jump(self) -> bool {
        self == Opcode::Goto
            || self == Opcode::JumpIfFalse
            || self == Opcode::JumpIfTrue
            || self == Opcode::Or
            || self == Opcode::And
            || self == Opcode::Coalesce
    }
}

impl TryFrom<u8> for Opcode {
    type Error = ();

    fn try_from(value: u8) -> Result<Opcode, ()> {
        if (value as usize) < JSOP_LIMIT {
            Ok(TABLE[value as usize])
        } else {
            Err(())
        }
    }
}

macro_rules! define_table {
    ( [ $(
        (
            $op:ident , $op_snake:ident , $str:expr ,
            $length:expr , $nuses:expr , $ndefs:expr , $format:expr
        ) ,
    )* ] ) => {
        pub static TABLE: [Opcode; JSOP_LIMIT] = [
            $( Opcode::$op , )*
        ];
    }
}

using_opcode_database!(define_table!());

impl Opcode {
    /// Length of this instruction, in bytes.
    pub fn instruction_length(self) -> usize {
        macro_rules! select_length {
            ( [ $(
                (
                    $op:ident , $op_snake:ident , $str:expr ,
                    $length:expr , $nuses:expr , $ndefs:expr , $format:expr
                ) ,
            )* ] ) => {
                match self {
                    $( Opcode::$op => $length , )*
                }
            }
        }

        using_opcode_database!(select_length!())
    }

    /// Number of stack slots consumed by this instruction, or -1 for variadic
    /// instructions.
    pub fn nuses(self) -> isize {
        macro_rules! select_nuses {
            ( [ $(
                (
                    $op:ident , $op_snake:ident , $str:expr ,
                    $length:expr , $nuses:expr , $ndefs:expr , $format:expr
                ) ,
            )* ] ) => {
                match self {
                    $( Opcode::$op => $nuses , )*
                }
            }
        }

        using_opcode_database!(select_nuses!())
    }

    pub fn ndefs(self) -> usize {
        macro_rules! select_ndefs {
            ( [ $(
                (
                    $op:ident , $op_snake:ident , $str:expr ,
                    $length:expr , $nuses:expr , $ndefs:expr , $format:expr
                ) ,
            )* ] ) => {
                match self {
                    $( Opcode::$op => $ndefs , )*
                }
            }
        }

        using_opcode_database!(select_ndefs!())
    }

    fn format_bits(self) -> u32 {
        macro_rules! select_format {
            ( [ $(
                (
                    $op:ident , $op_snake:ident , $str:expr ,
                    $length:expr , $nuses:expr , $ndefs:expr , $format:expr
                ) ,
            )* ] ) => {
                match self {
                    $( Opcode::$op => $format , )*
                }
            }
        }

        using_opcode_database!(select_format!())
    }

    pub fn has_ic_entry(self) -> bool {
        self.format_bits() & JOF_IC != 0
    }

    pub fn has_ic_index(self) -> bool {
        match self.format_bits() & JOF_TYPEMASK {
            JOF_LOOPHEAD | JOF_ICINDEX => true,
            _ => false,
        }
    }

    pub fn has_argc(self) -> bool {
        self.format_bits() & JOF_TYPEMASK == JOF_ARGC
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn table_matches() {
        for (i, t) in TABLE.iter().enumerate() {
            assert_eq!(i, t.to_byte() as usize);
        }
    }
}

[ Dauer der Verarbeitung: 0.13 Sekunden  (vorverarbeitet)  ]