/* -*- C -*- */ /* This is an auto-generated file and is a part of the programming language * Ruby. The person who created a program to generate this file (``I'' * hereafter) would like to refrain from defining licensing of this generated * source code. * * This file consists of many small parts of codes copyrighted by each author, * not only the ``I'' person. Those original authors agree with some * open-source license. I believe that the license we agree is the condition * mentioned in the file COPYING. It states "4. You may modify and include * the part of the software into any other software ...". But the problem is, * the license never makes it clear if such modified parts still remain in the * same license, or not. The fact that we agree with the source code's * licensing terms does not automatically define that of generated ones. This * is the reason why this file is under an unclear situation. All what I know * is that above provision guarantees this file to exist. * * Please let me hesitate to declare something about this nuanced contract. I * am not in the position to take over other authors' license to merge into my * one. Changing them to (say) GPLv3 is not doable by myself. Perhaps someday * it might turn out to be okay to say this file is under a license. I wish * the situation would become more clear in the future. */ /*******************************************************************/ /*******************************************************************/ /*******************************************************************/ /** This file is VM main loop. ---- This file is auto generated by insns2vm.rb DO NOT TOUCH! If you want to fix something, you must edit "tool/ruby_vm/views/vm.inc.erb" or tool/insns2vm.rb */ #include "vm_insnhelper.h" /* insn nop()()() */ INSN_ENTRY(nop) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(nop); DEBUG_ENTER_INSN("nop"); /* ### Declare and assign variables. ### */ # define INSN_ATTR(x) attr_ ## x ## _nop() bool leaf = INSN_ATTR(leaf); /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); COLLECT_USAGE_INSN(INSN_ATTR(bin)); /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); INC_SP(INSN_ATTR(sp_inc)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(nop); } /* insn getlocal(idx, level)()(val) */ INSN_ENTRY(getlocal) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(getlocal); DEBUG_ENTER_INSN("getlocal"); /* ### Declare and assign variables. ### */ lindex_t idx = (lindex_t)GET_OPERAND(1); rb_num_t level = (rb_num_t)GET_OPERAND(2); # define INSN_ATTR(x) attr_ ## x ## _getlocal(idx, level) bool leaf = INSN_ATTR(leaf); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, idx); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, level); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN getlocal # line 81 "insns.def" { val = *(vm_get_ep(GET_EP(), level) - idx); RB_DEBUG_COUNTER_INC(lvar_get); (void)RB_DEBUG_COUNTER_INC_IF(lvar_get_dynamic, level > 0); } # line 96 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(getlocal); } /* insn setlocal(idx, level)(val)() */ INSN_ENTRY(setlocal) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(setlocal); DEBUG_ENTER_INSN("setlocal"); /* ### Declare and assign variables. ### */ lindex_t idx = (lindex_t)GET_OPERAND(1); rb_num_t level = (rb_num_t)GET_OPERAND(2); # define INSN_ATTR(x) attr_ ## x ## _setlocal(idx, level) bool leaf = INSN_ATTR(leaf); VALUE val = TOPN(0); /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, idx); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, level); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN setlocal # line 95 "insns.def" { vm_env_write(vm_get_ep(GET_EP(), level), -(int)idx, val); RB_DEBUG_COUNTER_INC(lvar_set); (void)RB_DEBUG_COUNTER_INC_IF(lvar_set_dynamic, level > 0); } # line 142 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(setlocal); } /* insn getblockparam(idx, level)()(val) */ INSN_ENTRY(getblockparam) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(getblockparam); DEBUG_ENTER_INSN("getblockparam"); /* ### Declare and assign variables. ### */ lindex_t idx = (lindex_t)GET_OPERAND(1); rb_num_t level = (rb_num_t)GET_OPERAND(2); # define INSN_ATTR(x) attr_ ## x ## _getblockparam(idx, level) bool leaf = INSN_ATTR(leaf); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, idx); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, level); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN getblockparam # line 107 "insns.def" { const VALUE *ep = vm_get_ep(GET_EP(), level); VM_ASSERT(VM_ENV_LOCAL_P(ep)); if (!VM_ENV_FLAGS(ep, VM_FRAME_FLAG_MODIFIED_BLOCK_PARAM)) { val = rb_vm_bh_to_procval(ec, VM_ENV_BLOCK_HANDLER(ep)); vm_env_write(ep, -(int)idx, val); VM_ENV_FLAGS_SET(ep, VM_FRAME_FLAG_MODIFIED_BLOCK_PARAM); } else { val = *(ep - idx); RB_DEBUG_COUNTER_INC(lvar_get); (void)RB_DEBUG_COUNTER_INC_IF(lvar_get_dynamic, level > 0); } } # line 195 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(getblockparam); } /* insn setblockparam(idx, level)(val)() */ INSN_ENTRY(setblockparam) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(setblockparam); DEBUG_ENTER_INSN("setblockparam"); /* ### Declare and assign variables. ### */ lindex_t idx = (lindex_t)GET_OPERAND(1); rb_num_t level = (rb_num_t)GET_OPERAND(2); # define INSN_ATTR(x) attr_ ## x ## _setblockparam(idx, level) bool leaf = INSN_ATTR(leaf); VALUE val = TOPN(0); /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, idx); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, level); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN setblockparam # line 129 "insns.def" { const VALUE *ep = vm_get_ep(GET_EP(), level); VM_ASSERT(VM_ENV_LOCAL_P(ep)); vm_env_write(ep, -(int)idx, val); RB_DEBUG_COUNTER_INC(lvar_set); (void)RB_DEBUG_COUNTER_INC_IF(lvar_set_dynamic, level > 0); VM_ENV_FLAGS_SET(ep, VM_FRAME_FLAG_MODIFIED_BLOCK_PARAM); } # line 246 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(setblockparam); } /* insn getblockparamproxy(idx, level)()(val) */ INSN_ENTRY(getblockparamproxy) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(getblockparamproxy); DEBUG_ENTER_INSN("getblockparamproxy"); /* ### Declare and assign variables. ### */ lindex_t idx = (lindex_t)GET_OPERAND(1); rb_num_t level = (rb_num_t)GET_OPERAND(2); # define INSN_ATTR(x) attr_ ## x ## _getblockparamproxy(idx, level) bool leaf = INSN_ATTR(leaf); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, idx); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, level); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN getblockparamproxy # line 148 "insns.def" { const VALUE *ep = vm_get_ep(GET_EP(), level); VM_ASSERT(VM_ENV_LOCAL_P(ep)); if (!VM_ENV_FLAGS(ep, VM_FRAME_FLAG_MODIFIED_BLOCK_PARAM)) { VALUE block_handler = VM_ENV_BLOCK_HANDLER(ep); if (block_handler) { switch (vm_block_handler_type(block_handler)) { case block_handler_type_iseq: case block_handler_type_ifunc: val = rb_block_param_proxy; break; case block_handler_type_symbol: val = rb_sym_to_proc(VM_BH_TO_SYMBOL(block_handler)); goto INSN_LABEL(set); case block_handler_type_proc: val = VM_BH_TO_PROC(block_handler); goto INSN_LABEL(set); default: VM_UNREACHABLE(getblockparamproxy); } } else { val = Qnil; INSN_LABEL(set): vm_env_write(ep, -(int)idx, val); VM_ENV_FLAGS_SET(ep, VM_FRAME_FLAG_MODIFIED_BLOCK_PARAM); } } else { val = *(ep - idx); RB_DEBUG_COUNTER_INC(lvar_get); (void)RB_DEBUG_COUNTER_INC_IF(lvar_get_dynamic, level > 0); } } # line 320 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(getblockparamproxy); } /* insn getspecial(key, type)()(val) */ INSN_ENTRY(getspecial) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(getspecial); DEBUG_ENTER_INSN("getspecial"); /* ### Declare and assign variables. ### */ rb_num_t key = (rb_num_t)GET_OPERAND(1); rb_num_t type = (rb_num_t)GET_OPERAND(2); # define INSN_ATTR(x) attr_ ## x ## _getspecial(key, type) bool leaf = INSN_ATTR(leaf); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, key); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, type); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN getspecial # line 193 "insns.def" { val = vm_getspecial(ec, GET_LEP(), key, type); } # line 364 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(getspecial); } /* insn setspecial(key)(obj)() */ INSN_ENTRY(setspecial) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(setspecial); DEBUG_ENTER_INSN("setspecial"); /* ### Declare and assign variables. ### */ rb_num_t key = (rb_num_t)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _setspecial(key) bool leaf = INSN_ATTR(leaf); VALUE obj = TOPN(0); /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, key); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN setspecial # line 203 "insns.def" { lep_svar_set(ec, GET_LEP(), key, obj); } # line 406 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(setspecial); } /* insn getinstancevariable(id, ic)()(val) */ INSN_ENTRY(getinstancevariable) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(getinstancevariable); DEBUG_ENTER_INSN("getinstancevariable"); /* ### Declare and assign variables. ### */ ID id = (ID)GET_OPERAND(1); IVC ic = (IVC)GET_OPERAND(2); # define INSN_ATTR(x) attr_ ## x ## _getinstancevariable(id, ic) bool leaf = INSN_ATTR(leaf); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, id); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, ic); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN getinstancevariable # line 215 "insns.def" { val = vm_getinstancevariable(GET_SELF(), id, ic); } # line 447 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(getinstancevariable); } /* insn setinstancevariable(id, ic)(val)() */ INSN_ENTRY(setinstancevariable) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(setinstancevariable); DEBUG_ENTER_INSN("setinstancevariable"); /* ### Declare and assign variables. ### */ ID id = (ID)GET_OPERAND(1); IVC ic = (IVC)GET_OPERAND(2); # define INSN_ATTR(x) attr_ ## x ## _setinstancevariable(id, ic) bool leaf = INSN_ATTR(leaf); VALUE val = TOPN(0); /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, id); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, ic); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN setinstancevariable # line 226 "insns.def" { vm_setinstancevariable(GET_SELF(), id, val, ic); } # line 491 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(setinstancevariable); } /* insn getclassvariable(id)()(val) */ INSN_ENTRY(getclassvariable) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(getclassvariable); DEBUG_ENTER_INSN("getclassvariable"); /* ### Declare and assign variables. ### */ ID id = (ID)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _getclassvariable(id) bool leaf = INSN_ATTR(leaf); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, id); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN getclassvariable # line 238 "insns.def" { val = rb_cvar_get(vm_get_cvar_base(vm_get_cref(GET_EP()), GET_CFP()), id); } # line 530 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(getclassvariable); } /* insn setclassvariable(id)(val)() */ INSN_ENTRY(setclassvariable) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(setclassvariable); DEBUG_ENTER_INSN("setclassvariable"); /* ### Declare and assign variables. ### */ ID id = (ID)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _setclassvariable(id) bool leaf = INSN_ATTR(leaf); VALUE val = TOPN(0); /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, id); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN setclassvariable # line 250 "insns.def" { vm_ensure_not_refinement_module(GET_SELF()); rb_cvar_set(vm_get_cvar_base(vm_get_cref(GET_EP()), GET_CFP()), id, val); } # line 573 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(setclassvariable); } /* insn getconstant(id)(klass, allow_nil)(val) */ INSN_ENTRY(getconstant) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(getconstant); DEBUG_ENTER_INSN("getconstant"); /* ### Declare and assign variables. ### */ ID id = (ID)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _getconstant(id) bool leaf = INSN_ATTR(leaf); VALUE klass = TOPN(1); VALUE allow_nil = TOPN(0); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, id); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN getconstant # line 266 "insns.def" { val = vm_get_ev_const(ec, klass, id, allow_nil == Qtrue, 0); } # line 614 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(getconstant); } /* insn setconstant(id)(val, cbase)() */ INSN_ENTRY(setconstant) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(setconstant); DEBUG_ENTER_INSN("setconstant"); /* ### Declare and assign variables. ### */ ID id = (ID)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _setconstant(id) bool leaf = INSN_ATTR(leaf); VALUE val = TOPN(1); VALUE cbase = TOPN(0); /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, id); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN setconstant # line 282 "insns.def" { vm_check_if_namespace(cbase); vm_ensure_not_refinement_module(GET_SELF()); rb_const_set(cbase, id, val); } # line 659 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(setconstant); } /* insn getglobal(entry)()(val) */ INSN_ENTRY(getglobal) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(getglobal); DEBUG_ENTER_INSN("getglobal"); /* ### Declare and assign variables. ### */ GENTRY entry = (GENTRY)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _getglobal(entry) bool leaf = INSN_ATTR(leaf); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, entry); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN getglobal # line 295 "insns.def" { struct rb_global_entry *gentry = (void *)entry; val = rb_gvar_get(gentry); } # line 699 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(getglobal); } /* insn setglobal(entry)(val)() */ INSN_ENTRY(setglobal) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(setglobal); DEBUG_ENTER_INSN("setglobal"); /* ### Declare and assign variables. ### */ GENTRY entry = (GENTRY)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _setglobal(entry) bool leaf = INSN_ATTR(leaf); VALUE val = TOPN(0); /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, entry); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN setglobal # line 307 "insns.def" { struct rb_global_entry *gentry = (void *)entry; rb_gvar_set(gentry, val); } # line 742 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(setglobal); } /* insn putnil()()(val) */ INSN_ENTRY(putnil) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(putnil); DEBUG_ENTER_INSN("putnil"); /* ### Declare and assign variables. ### */ # define INSN_ATTR(x) attr_ ## x ## _putnil() bool leaf = INSN_ATTR(leaf); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN putnil # line 322 "insns.def" { val = Qnil; } # line 779 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(putnil); } /* insn putself()()(val) */ INSN_ENTRY(putself) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(putself); DEBUG_ENTER_INSN("putself"); /* ### Declare and assign variables. ### */ # define INSN_ATTR(x) attr_ ## x ## _putself() bool leaf = INSN_ATTR(leaf); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN putself # line 332 "insns.def" { val = GET_SELF(); } # line 819 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(putself); } /* insn putobject(val)()(val) */ INSN_ENTRY(putobject) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(putobject); DEBUG_ENTER_INSN("putobject"); /* ### Declare and assign variables. ### */ VALUE val = (VALUE)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _putobject(val) bool leaf = INSN_ATTR(leaf); /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, val); /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(putobject); } /* insn putspecialobject(value_type)()(val) */ INSN_ENTRY(putspecialobject) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(putspecialobject); DEBUG_ENTER_INSN("putspecialobject"); /* ### Declare and assign variables. ### */ rb_num_t value_type = (rb_num_t)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _putspecialobject(value_type) bool leaf = INSN_ATTR(leaf); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, value_type); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN putspecialobject # line 354 "insns.def" { enum vm_special_object_type type; type = (enum vm_special_object_type)value_type; val = vm_get_special_object(GET_EP(), type); } # line 894 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(putspecialobject); } /* insn putstring(str)()(val) */ INSN_ENTRY(putstring) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(putstring); DEBUG_ENTER_INSN("putstring"); /* ### Declare and assign variables. ### */ VALUE str = (VALUE)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _putstring(str) bool leaf = INSN_ATTR(leaf); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, str); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN putstring # line 367 "insns.def" { val = rb_str_resurrect(str); } # line 936 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(putstring); } /* insn concatstrings(num)(...)(val) */ INSN_ENTRY(concatstrings) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(concatstrings); DEBUG_ENTER_INSN("concatstrings"); /* ### Declare and assign variables. ### */ rb_num_t num = (rb_num_t)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _concatstrings(num) bool leaf = INSN_ATTR(leaf); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, num); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN concatstrings # line 381 "insns.def" { val = rb_str_concat_literals(num, STACK_ADDR_FROM_TOP(num)); } # line 978 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(concatstrings); } /* insn tostring()(val, str)(val) */ INSN_ENTRY(tostring) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(tostring); DEBUG_ENTER_INSN("tostring"); /* ### Declare and assign variables. ### */ # define INSN_ATTR(x) attr_ ## x ## _tostring() bool leaf = INSN_ATTR(leaf); VALUE val = TOPN(1); VALUE str = TOPN(0); /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN tostring # line 391 "insns.def" { val = rb_obj_as_string_result(str, val); } # line 1019 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(tostring); } /* insn freezestring(debug_info)(str)(str) */ INSN_ENTRY(freezestring) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(freezestring); DEBUG_ENTER_INSN("freezestring"); /* ### Declare and assign variables. ### */ VALUE debug_info = (VALUE)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _freezestring(debug_info) bool leaf = INSN_ATTR(leaf); VALUE str = TOPN(0); /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, debug_info); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN freezestring # line 401 "insns.def" { vm_freezestring(str, debug_info); } # line 1061 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = str; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(freezestring); } /* insn toregexp(opt, cnt)(...)(val) */ INSN_ENTRY(toregexp) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(toregexp); DEBUG_ENTER_INSN("toregexp"); /* ### Declare and assign variables. ### */ rb_num_t opt = (rb_num_t)GET_OPERAND(1); rb_num_t cnt = (rb_num_t)GET_OPERAND(2); # define INSN_ATTR(x) attr_ ## x ## _toregexp(opt, cnt) bool leaf = INSN_ATTR(leaf); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, opt); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cnt); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN toregexp # line 417 "insns.def" { const VALUE ary = rb_ary_tmp_new_from_values(0, cnt, STACK_ADDR_FROM_TOP(cnt)); val = rb_reg_new_ary(ary, (int)opt); rb_ary_clear(ary); } # line 1107 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(toregexp); } /* insn intern()(str)(sym) */ INSN_ENTRY(intern) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(intern); DEBUG_ENTER_INSN("intern"); /* ### Declare and assign variables. ### */ # define INSN_ATTR(x) attr_ ## x ## _intern() bool leaf = INSN_ATTR(leaf); VALUE str = TOPN(0); VALUE sym; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN intern # line 429 "insns.def" { sym = rb_str_intern(str); } # line 1148 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = sym; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(intern); } /* insn newarray(num)(...)(val) */ INSN_ENTRY(newarray) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(newarray); DEBUG_ENTER_INSN("newarray"); /* ### Declare and assign variables. ### */ rb_num_t num = (rb_num_t)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _newarray(num) bool leaf = INSN_ATTR(leaf); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, num); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN newarray # line 440 "insns.def" { val = rb_ary_new4(num, STACK_ADDR_FROM_TOP(num)); } # line 1190 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(newarray); } /* insn newarraykwsplat(num)(...)(val) */ INSN_ENTRY(newarraykwsplat) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(newarraykwsplat); DEBUG_ENTER_INSN("newarraykwsplat"); /* ### Declare and assign variables. ### */ rb_num_t num = (rb_num_t)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _newarraykwsplat(num) bool leaf = INSN_ATTR(leaf); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, num); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN newarraykwsplat # line 455 "insns.def" { if (RHASH_EMPTY_P(*STACK_ADDR_FROM_TOP(1))) { val = rb_ary_new4(num-1, STACK_ADDR_FROM_TOP(num)); } else { val = rb_ary_new4(num, STACK_ADDR_FROM_TOP(num)); } } # line 1237 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(newarraykwsplat); } /* insn duparray(ary)()(val) */ INSN_ENTRY(duparray) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(duparray); DEBUG_ENTER_INSN("duparray"); /* ### Declare and assign variables. ### */ VALUE ary = (VALUE)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _duparray(ary) bool leaf = INSN_ATTR(leaf); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ary); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN duparray # line 470 "insns.def" { RUBY_DTRACE_CREATE_HOOK(ARRAY, RARRAY_LEN(ary)); val = rb_ary_resurrect(ary); } # line 1280 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(duparray); } /* insn duphash(hash)()(val) */ INSN_ENTRY(duphash) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(duphash); DEBUG_ENTER_INSN("duphash"); /* ### Declare and assign variables. ### */ VALUE hash = (VALUE)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _duphash(hash) bool leaf = INSN_ATTR(leaf); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, hash); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN duphash # line 481 "insns.def" { RUBY_DTRACE_CREATE_HOOK(HASH, RHASH_SIZE(hash) << 1); val = rb_hash_resurrect(hash); } # line 1323 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(duphash); } /* insn expandarray(num, flag)(..., ary)(...) */ INSN_ENTRY(expandarray) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(expandarray); DEBUG_ENTER_INSN("expandarray"); /* ### Declare and assign variables. ### */ rb_num_t num = (rb_num_t)GET_OPERAND(1); rb_num_t flag = (rb_num_t)GET_OPERAND(2); # define INSN_ATTR(x) attr_ ## x ## _expandarray(num, flag) bool leaf = INSN_ATTR(leaf); VALUE ary = TOPN(0); /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, num); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, flag); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN expandarray # line 502 "insns.def" { vm_expandarray(GET_SP(), ary, num, (int)flag); } # line 1366 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); INC_SP(INSN_ATTR(sp_inc)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(expandarray); } /* insn concatarray()(ary1, ary2)(ary) */ INSN_ENTRY(concatarray) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(concatarray); DEBUG_ENTER_INSN("concatarray"); /* ### Declare and assign variables. ### */ # define INSN_ATTR(x) attr_ ## x ## _concatarray() bool leaf = INSN_ATTR(leaf); VALUE ary1 = TOPN(1); VALUE ary2 = TOPN(0); VALUE ary; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN concatarray # line 513 "insns.def" { ary = vm_concat_array(ary1, ary2); } # line 1404 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = ary; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(concatarray); } /* insn splatarray(flag)(ary)(obj) */ INSN_ENTRY(splatarray) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(splatarray); DEBUG_ENTER_INSN("splatarray"); /* ### Declare and assign variables. ### */ VALUE flag = (VALUE)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _splatarray(flag) bool leaf = INSN_ATTR(leaf); VALUE ary = TOPN(0); VALUE obj; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, flag); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN splatarray # line 524 "insns.def" { obj = vm_splat_array(flag, ary); } # line 1447 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = obj; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(splatarray); } /* insn newhash(num)(...)(val) */ INSN_ENTRY(newhash) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(newhash); DEBUG_ENTER_INSN("newhash"); /* ### Declare and assign variables. ### */ rb_num_t num = (rb_num_t)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _newhash(num) bool leaf = INSN_ATTR(leaf); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, num); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN newhash # line 536 "insns.def" { RUBY_DTRACE_CREATE_HOOK(HASH, num); val = rb_hash_new_with_size(num / 2); if (num) { rb_hash_bulk_insert(num, STACK_ADDR_FROM_TOP(num), val); } } # line 1495 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(newhash); } /* insn newrange(flag)(low, high)(val) */ INSN_ENTRY(newrange) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(newrange); DEBUG_ENTER_INSN("newrange"); /* ### Declare and assign variables. ### */ rb_num_t flag = (rb_num_t)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _newrange(flag) bool leaf = INSN_ATTR(leaf); VALUE low = TOPN(1); VALUE high = TOPN(0); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, flag); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN newrange # line 554 "insns.def" { val = rb_range_new(low, high, (int)flag); } # line 1539 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(newrange); } /* insn pop()(val)() */ INSN_ENTRY(pop) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(pop); DEBUG_ENTER_INSN("pop"); /* ### Declare and assign variables. ### */ # define INSN_ATTR(x) attr_ ## x ## _pop() bool leaf = INSN_ATTR(leaf); VALUE val = TOPN(0); /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN pop # line 568 "insns.def" { (void)val; /* none */ } # line 1580 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(pop); } /* insn dup()(val)(val1, val2) */ INSN_ENTRY(dup) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(dup); DEBUG_ENTER_INSN("dup"); /* ### Declare and assign variables. ### */ # define INSN_ATTR(x) attr_ ## x ## _dup() bool leaf = INSN_ATTR(leaf); VALUE val = TOPN(0); VALUE val1; VALUE val2; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN dup # line 579 "insns.def" { val1 = val2 = val; } # line 1619 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val2; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); TOPN(1) = val1; VM_ASSERT(!RB_TYPE_P(TOPN(1), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(1), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(dup); } /* insn dupn(n)(...)(...) */ INSN_ENTRY(dupn) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(dupn); DEBUG_ENTER_INSN("dupn"); /* ### Declare and assign variables. ### */ rb_num_t n = (rb_num_t)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _dupn(n) bool leaf = INSN_ATTR(leaf); /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, n); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN dupn # line 590 "insns.def" { void *dst = GET_SP(); void *src = STACK_ADDR_FROM_TOP(n); MEMCPY(dst, src, VALUE, n); } # line 1665 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); INC_SP(INSN_ATTR(sp_inc)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(dupn); } /* insn swap()(val, obj)(obj, val) */ INSN_ENTRY(swap) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(swap); DEBUG_ENTER_INSN("swap"); /* ### Declare and assign variables. ### */ # define INSN_ATTR(x) attr_ ## x ## _swap() bool leaf = INSN_ATTR(leaf); VALUE val = TOPN(1); VALUE obj = TOPN(0); /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); COLLECT_USAGE_INSN(INSN_ATTR(bin)); /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); TOPN(1) = obj; VM_ASSERT(!RB_TYPE_P(TOPN(1), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(1), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(swap); } /* insn reverse(n)(...)(...) */ INSN_ENTRY(reverse) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(reverse); DEBUG_ENTER_INSN("reverse"); /* ### Declare and assign variables. ### */ rb_num_t n = (rb_num_t)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _reverse(n) bool leaf = INSN_ATTR(leaf); /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, n); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN reverse # line 614 "insns.def" { rb_num_t i; VALUE *sp = STACK_ADDR_FROM_TOP(n); for (i=0; ibody->iseq_encoded, GET_SP(), class_iseq->body->local_table_size, class_iseq->body->stack_max); RESTORE_REGS(); NEXT_INSN(); } # line 2088 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); PUSH(val); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(defineclass); } /* insn definemethod(id, iseq)()() */ INSN_ENTRY(definemethod) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(definemethod); DEBUG_ENTER_INSN("definemethod"); /* ### Declare and assign variables. ### */ ID id = (ID)GET_OPERAND(1); ISEQ iseq = (ISEQ)GET_OPERAND(2); # define INSN_ATTR(x) attr_ ## x ## _definemethod(id, iseq) bool leaf = INSN_ATTR(leaf); /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); POPN(INSN_ATTR(popn)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, id); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, iseq); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN definemethod # line 755 "insns.def" { vm_define_method(ec, Qnil, id, (VALUE)iseq, FALSE); } # line 2129 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(definemethod); } /* insn definesmethod(id, iseq)(obj)() */ INSN_ENTRY(definesmethod) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(definesmethod); DEBUG_ENTER_INSN("definesmethod"); /* ### Declare and assign variables. ### */ ID id = (ID)GET_OPERAND(1); ISEQ iseq = (ISEQ)GET_OPERAND(2); # define INSN_ATTR(x) attr_ ## x ## _definesmethod(id, iseq) bool leaf = INSN_ATTR(leaf); VALUE obj = TOPN(0); /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); POPN(INSN_ATTR(popn)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, id); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, iseq); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN definesmethod # line 764 "insns.def" { vm_define_method(ec, obj, id, (VALUE)iseq, TRUE); } # line 2170 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(definesmethod); } /* insn send(cd, blockiseq)(...)(val) */ INSN_ENTRY(send) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(send); DEBUG_ENTER_INSN("send"); /* ### Declare and assign variables. ### */ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1); ISEQ blockiseq = (ISEQ)GET_OPERAND(2); # define INSN_ATTR(x) attr_ ## x ## _send(cd, blockiseq) bool leaf = INSN_ATTR(leaf); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); POPN(INSN_ATTR(popn)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, blockiseq); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN send # line 780 "insns.def" { VALUE bh = vm_caller_setup_arg_block(ec, GET_CFP(), &cd->ci, blockiseq, false); val = vm_sendish(ec, GET_CFP(), cd, bh, vm_search_method_wrap); if (val == Qundef) { RESTORE_REGS(); NEXT_INSN(); } } # line 2217 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); PUSH(val); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(send); } /* insn opt_send_without_block(cd)(...)(val) */ INSN_ENTRY(opt_send_without_block) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(opt_send_without_block); DEBUG_ENTER_INSN("opt_send_without_block"); /* ### Declare and assign variables. ### */ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _opt_send_without_block(cd) bool leaf = INSN_ATTR(leaf); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); POPN(INSN_ATTR(popn)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN opt_send_without_block # line 799 "insns.def" { VALUE bh = VM_BLOCK_HANDLER_NONE; val = vm_sendish(ec, GET_CFP(), cd, bh, vm_search_method_wrap); if (val == Qundef) { RESTORE_REGS(); NEXT_INSN(); } } # line 2263 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); PUSH(val); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(opt_send_without_block); } /* insn opt_str_freeze(str, cd)()(val) */ INSN_ENTRY(opt_str_freeze) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(opt_str_freeze); DEBUG_ENTER_INSN("opt_str_freeze"); /* ### Declare and assign variables. ### */ VALUE str = (VALUE)GET_OPERAND(1); CALL_DATA cd = (CALL_DATA)GET_OPERAND(2); # define INSN_ATTR(x) attr_ ## x ## _opt_str_freeze(str, cd) bool leaf = INSN_ATTR(leaf); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, str); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cd); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN opt_str_freeze # line 814 "insns.def" { val = vm_opt_str_freeze(str, BOP_FREEZE, idFreeze); if (val == Qundef) { PUSH(rb_str_resurrect(str)); CALL_SIMPLE_METHOD(); } } # line 2309 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(opt_str_freeze); } /* insn opt_nil_p(cd)(recv)(val) */ INSN_ENTRY(opt_nil_p) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(opt_nil_p); DEBUG_ENTER_INSN("opt_nil_p"); /* ### Declare and assign variables. ### */ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _opt_nil_p(cd) bool leaf = INSN_ATTR(leaf); VALUE recv = TOPN(0); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN opt_nil_p # line 829 "insns.def" { val = vm_opt_nil_p(cd, recv); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } # line 2356 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(opt_nil_p); } /* insn opt_str_uminus(str, cd)()(val) */ INSN_ENTRY(opt_str_uminus) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(opt_str_uminus); DEBUG_ENTER_INSN("opt_str_uminus"); /* ### Declare and assign variables. ### */ VALUE str = (VALUE)GET_OPERAND(1); CALL_DATA cd = (CALL_DATA)GET_OPERAND(2); # define INSN_ATTR(x) attr_ ## x ## _opt_str_uminus(str, cd) bool leaf = INSN_ATTR(leaf); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, str); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cd); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN opt_str_uminus # line 842 "insns.def" { val = vm_opt_str_freeze(str, BOP_UMINUS, idUMinus); if (val == Qundef) { PUSH(rb_str_resurrect(str)); CALL_SIMPLE_METHOD(); } } # line 2405 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(opt_str_uminus); } /* insn opt_newarray_max(num)(...)(val) */ INSN_ENTRY(opt_newarray_max) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(opt_newarray_max); DEBUG_ENTER_INSN("opt_newarray_max"); /* ### Declare and assign variables. ### */ rb_num_t num = (rb_num_t)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _opt_newarray_max(num) bool leaf = INSN_ATTR(leaf); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, num); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN opt_newarray_max # line 862 "insns.def" { val = vm_opt_newarray_max(num, STACK_ADDR_FROM_TOP(num)); } # line 2447 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(opt_newarray_max); } /* insn opt_newarray_min(num)(...)(val) */ INSN_ENTRY(opt_newarray_min) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(opt_newarray_min); DEBUG_ENTER_INSN("opt_newarray_min"); /* ### Declare and assign variables. ### */ rb_num_t num = (rb_num_t)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _opt_newarray_min(num) bool leaf = INSN_ATTR(leaf); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, num); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN opt_newarray_min # line 874 "insns.def" { val = vm_opt_newarray_min(num, STACK_ADDR_FROM_TOP(num)); } # line 2489 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(opt_newarray_min); } /* insn invokesuper(cd, blockiseq)(...)(val) */ INSN_ENTRY(invokesuper) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(invokesuper); DEBUG_ENTER_INSN("invokesuper"); /* ### Declare and assign variables. ### */ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1); ISEQ blockiseq = (ISEQ)GET_OPERAND(2); # define INSN_ATTR(x) attr_ ## x ## _invokesuper(cd, blockiseq) bool leaf = INSN_ATTR(leaf); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); POPN(INSN_ATTR(popn)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, blockiseq); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN invokesuper # line 886 "insns.def" { VALUE bh = vm_caller_setup_arg_block(ec, GET_CFP(), &cd->ci, blockiseq, true); val = vm_sendish(ec, GET_CFP(), cd, bh, vm_search_super_method); if (val == Qundef) { RESTORE_REGS(); NEXT_INSN(); } } # line 2540 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); PUSH(val); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(invokesuper); } /* insn invokeblock(cd)(...)(val) */ INSN_ENTRY(invokeblock) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(invokeblock); DEBUG_ENTER_INSN("invokeblock"); /* ### Declare and assign variables. ### */ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _invokeblock(cd) bool leaf = INSN_ATTR(leaf); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); POPN(INSN_ATTR(popn)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN invokeblock # line 905 "insns.def" { if (UNLIKELY(cd->cc.call != vm_invokeblock_i)) { cd->cc.call = vm_invokeblock_i; // check before setting to avoid CoW } VALUE bh = VM_BLOCK_HANDLER_NONE; val = vm_sendish(ec, GET_CFP(), cd, bh, vm_search_invokeblock); if (val == Qundef) { RESTORE_REGS(); NEXT_INSN(); } } # line 2590 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); PUSH(val); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(invokeblock); } /* insn leave()(val)(val) */ INSN_ENTRY(leave) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(leave); DEBUG_ENTER_INSN("leave"); /* ### Declare and assign variables. ### */ # define INSN_ATTR(x) attr_ ## x ## _leave() bool leaf = INSN_ATTR(leaf); VALUE val = TOPN(0); /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); POPN(INSN_ATTR(popn)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN leave # line 930 "insns.def" { if (OPT_CHECKED_RUN) { const VALUE *const bp = vm_base_ptr(GET_CFP()); if (GET_SP() != bp) { vm_stack_consistency_error(ec, GET_CFP(), bp); } } if (vm_pop_frame(ec, GET_CFP(), GET_EP())) { # if OPT_CALL_THREADED_CODE rb_ec_thread_ptr(ec)->retval = val; return 0; # else return val; # endif } else { RESTORE_REGS(); } } # line 2645 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); PUSH(val); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(leave); } /* insn throw(throw_state)(throwobj)(val) */ INSN_ENTRY(throw) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(throw); DEBUG_ENTER_INSN("throw"); /* ### Declare and assign variables. ### */ rb_num_t throw_state = (rb_num_t)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _throw(throw_state) bool leaf = INSN_ATTR(leaf); VALUE throwobj = TOPN(0); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, throw_state); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN throw # line 963 "insns.def" { val = vm_throw(ec, GET_CFP(), throw_state, throwobj); THROW_EXCEPTION(val); /* unreachable */ } # line 2687 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(throw); } /* insn jump(dst)()() */ INSN_ENTRY(jump) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(jump); DEBUG_ENTER_INSN("jump"); /* ### Declare and assign variables. ### */ OFFSET dst = (OFFSET)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _jump(dst) bool leaf = INSN_ATTR(leaf); /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, dst); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN jump # line 981 "insns.def" { RUBY_VM_CHECK_INTS(ec); JUMP(dst); } # line 2729 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(jump); } /* insn branchif(dst)(val)() */ INSN_ENTRY(branchif) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(branchif); DEBUG_ENTER_INSN("branchif"); /* ### Declare and assign variables. ### */ OFFSET dst = (OFFSET)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _branchif(dst) bool leaf = INSN_ATTR(leaf); VALUE val = TOPN(0); /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, dst); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN branchif # line 994 "insns.def" { if (RTEST(val)) { RUBY_VM_CHECK_INTS(ec); JUMP(dst); } } # line 2771 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(branchif); } /* insn branchunless(dst)(val)() */ INSN_ENTRY(branchunless) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(branchunless); DEBUG_ENTER_INSN("branchunless"); /* ### Declare and assign variables. ### */ OFFSET dst = (OFFSET)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _branchunless(dst) bool leaf = INSN_ATTR(leaf); VALUE val = TOPN(0); /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, dst); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN branchunless # line 1009 "insns.def" { if (!RTEST(val)) { RUBY_VM_CHECK_INTS(ec); JUMP(dst); } } # line 2813 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(branchunless); } /* insn branchnil(dst)(val)() */ INSN_ENTRY(branchnil) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(branchnil); DEBUG_ENTER_INSN("branchnil"); /* ### Declare and assign variables. ### */ OFFSET dst = (OFFSET)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _branchnil(dst) bool leaf = INSN_ATTR(leaf); VALUE val = TOPN(0); /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, dst); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN branchnil # line 1024 "insns.def" { if (NIL_P(val)) { RUBY_VM_CHECK_INTS(ec); JUMP(dst); } } # line 2855 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(branchnil); } /* insn opt_getinlinecache(dst, ic)()(val) */ INSN_ENTRY(opt_getinlinecache) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(opt_getinlinecache); DEBUG_ENTER_INSN("opt_getinlinecache"); /* ### Declare and assign variables. ### */ OFFSET dst = (OFFSET)GET_OPERAND(1); IC ic = (IC)GET_OPERAND(2); # define INSN_ATTR(x) attr_ ## x ## _opt_getinlinecache(dst, ic) bool leaf = INSN_ATTR(leaf); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, dst); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, ic); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN opt_getinlinecache # line 1041 "insns.def" { if (vm_ic_hit_p(ic, GET_EP())) { val = ic->value; JUMP(dst); } else { val = Qnil; } } # line 2902 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(opt_getinlinecache); } /* insn opt_setinlinecache(ic)(val)(val) */ INSN_ENTRY(opt_setinlinecache) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(opt_setinlinecache); DEBUG_ENTER_INSN("opt_setinlinecache"); /* ### Declare and assign variables. ### */ IC ic = (IC)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _opt_setinlinecache(ic) bool leaf = INSN_ATTR(leaf); VALUE val = TOPN(0); /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, ic); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN opt_setinlinecache # line 1057 "insns.def" { vm_ic_update(ic, val, GET_EP()); } # line 2944 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(opt_setinlinecache); } /* insn once(iseq, ise)()(val) */ INSN_ENTRY(once) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(once); DEBUG_ENTER_INSN("once"); /* ### Declare and assign variables. ### */ ISEQ iseq = (ISEQ)GET_OPERAND(1); ISE ise = (ISE)GET_OPERAND(2); # define INSN_ATTR(x) attr_ ## x ## _once(iseq, ise) bool leaf = INSN_ATTR(leaf); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); POPN(INSN_ATTR(popn)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, iseq); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, ise); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN once # line 1067 "insns.def" { val = vm_once_dispatch(ec, iseq, ise); } # line 2989 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); PUSH(val); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(once); } /* insn opt_case_dispatch(hash, else_offset)(..., key)() */ INSN_ENTRY(opt_case_dispatch) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(opt_case_dispatch); DEBUG_ENTER_INSN("opt_case_dispatch"); /* ### Declare and assign variables. ### */ CDHASH hash = (CDHASH)GET_OPERAND(1); OFFSET else_offset = (OFFSET)GET_OPERAND(2); # define INSN_ATTR(x) attr_ ## x ## _opt_case_dispatch(hash, else_offset) bool leaf = INSN_ATTR(leaf); VALUE key = TOPN(0); /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, hash); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, else_offset); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN opt_case_dispatch # line 1078 "insns.def" { OFFSET dst = vm_case_dispatch(hash, else_offset, key); if (dst) { JUMP(dst); } } # line 3034 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(opt_case_dispatch); } /* insn opt_plus(cd)(recv, obj)(val) */ INSN_ENTRY(opt_plus) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(opt_plus); DEBUG_ENTER_INSN("opt_plus"); /* ### Declare and assign variables. ### */ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _opt_plus(cd) bool leaf = INSN_ATTR(leaf); VALUE recv = TOPN(1); VALUE obj = TOPN(0); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN opt_plus # line 1094 "insns.def" { val = vm_opt_plus(recv, obj); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } # line 3079 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(opt_plus); } /* insn opt_minus(cd)(recv, obj)(val) */ INSN_ENTRY(opt_minus) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(opt_minus); DEBUG_ENTER_INSN("opt_minus"); /* ### Declare and assign variables. ### */ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _opt_minus(cd) bool leaf = INSN_ATTR(leaf); VALUE recv = TOPN(1); VALUE obj = TOPN(0); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN opt_minus # line 1108 "insns.def" { val = vm_opt_minus(recv, obj); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } # line 3127 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(opt_minus); } /* insn opt_mult(cd)(recv, obj)(val) */ INSN_ENTRY(opt_mult) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(opt_mult); DEBUG_ENTER_INSN("opt_mult"); /* ### Declare and assign variables. ### */ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _opt_mult(cd) bool leaf = INSN_ATTR(leaf); VALUE recv = TOPN(1); VALUE obj = TOPN(0); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN opt_mult # line 1122 "insns.def" { val = vm_opt_mult(recv, obj); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } # line 3175 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(opt_mult); } /* insn opt_div(cd)(recv, obj)(val) */ INSN_ENTRY(opt_div) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(opt_div); DEBUG_ENTER_INSN("opt_div"); /* ### Declare and assign variables. ### */ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _opt_div(cd) bool leaf = INSN_ATTR(leaf); VALUE recv = TOPN(1); VALUE obj = TOPN(0); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN opt_div # line 1139 "insns.def" { val = vm_opt_div(recv, obj); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } # line 3223 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(opt_div); } /* insn opt_mod(cd)(recv, obj)(val) */ INSN_ENTRY(opt_mod) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(opt_mod); DEBUG_ENTER_INSN("opt_mod"); /* ### Declare and assign variables. ### */ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _opt_mod(cd) bool leaf = INSN_ATTR(leaf); VALUE recv = TOPN(1); VALUE obj = TOPN(0); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN opt_mod # line 1155 "insns.def" { val = vm_opt_mod(recv, obj); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } # line 3271 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(opt_mod); } /* insn opt_eq(cd)(recv, obj)(val) */ INSN_ENTRY(opt_eq) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(opt_eq); DEBUG_ENTER_INSN("opt_eq"); /* ### Declare and assign variables. ### */ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _opt_eq(cd) bool leaf = INSN_ATTR(leaf); VALUE recv = TOPN(1); VALUE obj = TOPN(0); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN opt_eq # line 1169 "insns.def" { val = opt_eq_func(recv, obj, cd); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } # line 3319 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(opt_eq); } /* insn opt_neq(cd_eq, cd)(recv, obj)(val) */ INSN_ENTRY(opt_neq) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(opt_neq); DEBUG_ENTER_INSN("opt_neq"); /* ### Declare and assign variables. ### */ CALL_DATA cd_eq = (CALL_DATA)GET_OPERAND(1); CALL_DATA cd = (CALL_DATA)GET_OPERAND(2); # define INSN_ATTR(x) attr_ ## x ## _opt_neq(cd_eq, cd) bool leaf = INSN_ATTR(leaf); VALUE recv = TOPN(1); VALUE obj = TOPN(0); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd_eq); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cd); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN opt_neq # line 1183 "insns.def" { val = vm_opt_neq(cd, cd_eq, recv, obj); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } # line 3369 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(opt_neq); } /* insn opt_lt(cd)(recv, obj)(val) */ INSN_ENTRY(opt_lt) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(opt_lt); DEBUG_ENTER_INSN("opt_lt"); /* ### Declare and assign variables. ### */ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _opt_lt(cd) bool leaf = INSN_ATTR(leaf); VALUE recv = TOPN(1); VALUE obj = TOPN(0); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN opt_lt # line 1197 "insns.def" { val = vm_opt_lt(recv, obj); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } # line 3417 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(opt_lt); } /* insn opt_le(cd)(recv, obj)(val) */ INSN_ENTRY(opt_le) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(opt_le); DEBUG_ENTER_INSN("opt_le"); /* ### Declare and assign variables. ### */ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _opt_le(cd) bool leaf = INSN_ATTR(leaf); VALUE recv = TOPN(1); VALUE obj = TOPN(0); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN opt_le # line 1211 "insns.def" { val = vm_opt_le(recv, obj); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } # line 3465 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(opt_le); } /* insn opt_gt(cd)(recv, obj)(val) */ INSN_ENTRY(opt_gt) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(opt_gt); DEBUG_ENTER_INSN("opt_gt"); /* ### Declare and assign variables. ### */ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _opt_gt(cd) bool leaf = INSN_ATTR(leaf); VALUE recv = TOPN(1); VALUE obj = TOPN(0); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN opt_gt # line 1225 "insns.def" { val = vm_opt_gt(recv, obj); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } # line 3513 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(opt_gt); } /* insn opt_ge(cd)(recv, obj)(val) */ INSN_ENTRY(opt_ge) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(opt_ge); DEBUG_ENTER_INSN("opt_ge"); /* ### Declare and assign variables. ### */ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _opt_ge(cd) bool leaf = INSN_ATTR(leaf); VALUE recv = TOPN(1); VALUE obj = TOPN(0); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN opt_ge # line 1239 "insns.def" { val = vm_opt_ge(recv, obj); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } # line 3561 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(opt_ge); } /* insn opt_ltlt(cd)(recv, obj)(val) */ INSN_ENTRY(opt_ltlt) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(opt_ltlt); DEBUG_ENTER_INSN("opt_ltlt"); /* ### Declare and assign variables. ### */ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _opt_ltlt(cd) bool leaf = INSN_ATTR(leaf); VALUE recv = TOPN(1); VALUE obj = TOPN(0); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN opt_ltlt # line 1257 "insns.def" { val = vm_opt_ltlt(recv, obj); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } # line 3609 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(opt_ltlt); } /* insn opt_and(cd)(recv, obj)(val) */ INSN_ENTRY(opt_and) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(opt_and); DEBUG_ENTER_INSN("opt_and"); /* ### Declare and assign variables. ### */ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _opt_and(cd) bool leaf = INSN_ATTR(leaf); VALUE recv = TOPN(1); VALUE obj = TOPN(0); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN opt_and # line 1271 "insns.def" { val = vm_opt_and(recv, obj); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } # line 3657 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(opt_and); } /* insn opt_or(cd)(recv, obj)(val) */ INSN_ENTRY(opt_or) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(opt_or); DEBUG_ENTER_INSN("opt_or"); /* ### Declare and assign variables. ### */ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _opt_or(cd) bool leaf = INSN_ATTR(leaf); VALUE recv = TOPN(1); VALUE obj = TOPN(0); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN opt_or # line 1285 "insns.def" { val = vm_opt_or(recv, obj); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } # line 3705 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(opt_or); } /* insn opt_aref(cd)(recv, obj)(val) */ INSN_ENTRY(opt_aref) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(opt_aref); DEBUG_ENTER_INSN("opt_aref"); /* ### Declare and assign variables. ### */ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _opt_aref(cd) bool leaf = INSN_ATTR(leaf); VALUE recv = TOPN(1); VALUE obj = TOPN(0); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN opt_aref # line 1304 "insns.def" { val = vm_opt_aref(recv, obj); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } # line 3753 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(opt_aref); } /* insn opt_aset(cd)(recv, obj, set)(val) */ INSN_ENTRY(opt_aset) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(opt_aset); DEBUG_ENTER_INSN("opt_aset"); /* ### Declare and assign variables. ### */ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _opt_aset(cd) bool leaf = INSN_ATTR(leaf); VALUE recv = TOPN(2); VALUE obj = TOPN(1); VALUE set = TOPN(0); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN opt_aset # line 1321 "insns.def" { val = vm_opt_aset(recv, obj, set); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } # line 3802 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(opt_aset); } /* insn opt_aset_with(key, cd)(recv, val)(val) */ INSN_ENTRY(opt_aset_with) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(opt_aset_with); DEBUG_ENTER_INSN("opt_aset_with"); /* ### Declare and assign variables. ### */ VALUE key = (VALUE)GET_OPERAND(1); CALL_DATA cd = (CALL_DATA)GET_OPERAND(2); # define INSN_ATTR(x) attr_ ## x ## _opt_aset_with(key, cd) bool leaf = INSN_ATTR(leaf); VALUE recv = TOPN(1); VALUE val = TOPN(0); /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, key); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cd); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN opt_aset_with # line 1337 "insns.def" { VALUE tmp = vm_opt_aset_with(recv, key, val); if (tmp != Qundef) { val = tmp; } else { # ifndef MJIT_HEADER TOPN(0) = rb_str_resurrect(key); PUSH(val); # endif CALL_SIMPLE_METHOD(); } } # line 3858 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(opt_aset_with); } /* insn opt_aref_with(key, cd)(recv)(val) */ INSN_ENTRY(opt_aref_with) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(opt_aref_with); DEBUG_ENTER_INSN("opt_aref_with"); /* ### Declare and assign variables. ### */ VALUE key = (VALUE)GET_OPERAND(1); CALL_DATA cd = (CALL_DATA)GET_OPERAND(2); # define INSN_ATTR(x) attr_ ## x ## _opt_aref_with(key, cd) bool leaf = INSN_ATTR(leaf); VALUE recv = TOPN(0); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, key); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, cd); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN opt_aref_with # line 1360 "insns.def" { val = vm_opt_aref_with(recv, key); if (val == Qundef) { # ifndef MJIT_HEADER PUSH(rb_str_resurrect(key)); # endif CALL_SIMPLE_METHOD(); } } # line 3910 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(opt_aref_with); } /* insn opt_length(cd)(recv)(val) */ INSN_ENTRY(opt_length) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(opt_length); DEBUG_ENTER_INSN("opt_length"); /* ### Declare and assign variables. ### */ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _opt_length(cd) bool leaf = INSN_ATTR(leaf); VALUE recv = TOPN(0); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN opt_length # line 1377 "insns.def" { val = vm_opt_length(recv, BOP_LENGTH); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } # line 3957 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(opt_length); } /* insn opt_size(cd)(recv)(val) */ INSN_ENTRY(opt_size) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(opt_size); DEBUG_ENTER_INSN("opt_size"); /* ### Declare and assign variables. ### */ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _opt_size(cd) bool leaf = INSN_ATTR(leaf); VALUE recv = TOPN(0); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN opt_size # line 1391 "insns.def" { val = vm_opt_length(recv, BOP_SIZE); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } # line 4004 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(opt_size); } /* insn opt_empty_p(cd)(recv)(val) */ INSN_ENTRY(opt_empty_p) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(opt_empty_p); DEBUG_ENTER_INSN("opt_empty_p"); /* ### Declare and assign variables. ### */ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _opt_empty_p(cd) bool leaf = INSN_ATTR(leaf); VALUE recv = TOPN(0); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN opt_empty_p # line 1405 "insns.def" { val = vm_opt_empty_p(recv); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } # line 4051 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(opt_empty_p); } /* insn opt_succ(cd)(recv)(val) */ INSN_ENTRY(opt_succ) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(opt_succ); DEBUG_ENTER_INSN("opt_succ"); /* ### Declare and assign variables. ### */ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _opt_succ(cd) bool leaf = INSN_ATTR(leaf); VALUE recv = TOPN(0); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN opt_succ # line 1419 "insns.def" { val = vm_opt_succ(recv); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } # line 4098 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(opt_succ); } /* insn opt_not(cd)(recv)(val) */ INSN_ENTRY(opt_not) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(opt_not); DEBUG_ENTER_INSN("opt_not"); /* ### Declare and assign variables. ### */ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _opt_not(cd) bool leaf = INSN_ATTR(leaf); VALUE recv = TOPN(0); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN opt_not # line 1433 "insns.def" { val = vm_opt_not(cd, recv); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } # line 4145 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(opt_not); } /* insn opt_regexpmatch2(cd)(obj2, obj1)(val) */ INSN_ENTRY(opt_regexpmatch2) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(opt_regexpmatch2); DEBUG_ENTER_INSN("opt_regexpmatch2"); /* ### Declare and assign variables. ### */ CALL_DATA cd = (CALL_DATA)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _opt_regexpmatch2(cd) bool leaf = INSN_ATTR(leaf); VALUE obj2 = TOPN(1); VALUE obj1 = TOPN(0); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, cd); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN opt_regexpmatch2 # line 1448 "insns.def" { val = vm_opt_regexpmatch2(obj2, obj1); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } # line 4193 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(opt_regexpmatch2); } /* insn opt_call_c_function(funcptr)()() */ INSN_ENTRY(opt_call_c_function) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(opt_call_c_function); DEBUG_ENTER_INSN("opt_call_c_function"); /* ### Declare and assign variables. ### */ rb_insn_func_t funcptr = (rb_insn_func_t)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _opt_call_c_function(funcptr) bool leaf = INSN_ATTR(leaf); /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); POPN(INSN_ATTR(popn)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, funcptr); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN opt_call_c_function # line 1464 "insns.def" { reg_cfp = (funcptr)(ec, reg_cfp); if (reg_cfp == 0) { VALUE err = ec->errinfo; ec->errinfo = Qnil; THROW_EXCEPTION(err); } RESTORE_REGS(); NEXT_INSN(); } # line 4244 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(opt_call_c_function); } /* insn invokebuiltin(bf)(...)(ret) */ INSN_ENTRY(invokebuiltin) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(invokebuiltin); DEBUG_ENTER_INSN("invokebuiltin"); /* ### Declare and assign variables. ### */ RB_BUILTIN bf = (RB_BUILTIN)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _invokebuiltin(bf) bool leaf = INSN_ATTR(leaf); VALUE ret; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, bf); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN invokebuiltin # line 1485 "insns.def" { ret = vm_invoke_builtin(ec, reg_cfp, bf, STACK_ADDR_FROM_TOP(bf->argc)); } # line 4282 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = ret; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(invokebuiltin); } /* insn opt_invokebuiltin_delegate(bf, index)()(ret) */ INSN_ENTRY(opt_invokebuiltin_delegate) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(opt_invokebuiltin_delegate); DEBUG_ENTER_INSN("opt_invokebuiltin_delegate"); /* ### Declare and assign variables. ### */ RB_BUILTIN bf = (RB_BUILTIN)GET_OPERAND(1); rb_num_t index = (rb_num_t)GET_OPERAND(2); # define INSN_ATTR(x) attr_ ## x ## _opt_invokebuiltin_delegate(bf, index) bool leaf = INSN_ATTR(leaf); VALUE ret; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, bf); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, index); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN opt_invokebuiltin_delegate # line 1496 "insns.def" { ret = vm_invoke_builtin_delegate(ec, reg_cfp, bf, (unsigned int)index); } # line 4326 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = ret; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(opt_invokebuiltin_delegate); } /* insn opt_invokebuiltin_delegate_leave(bf, index)()(val) */ INSN_ENTRY(opt_invokebuiltin_delegate_leave) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(opt_invokebuiltin_delegate_leave); DEBUG_ENTER_INSN("opt_invokebuiltin_delegate_leave"); /* ### Declare and assign variables. ### */ RB_BUILTIN bf = (RB_BUILTIN)GET_OPERAND(1); rb_num_t index = (rb_num_t)GET_OPERAND(2); # define INSN_ATTR(x) attr_ ## x ## _opt_invokebuiltin_delegate_leave(bf, index) bool leaf = INSN_ATTR(leaf); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, bf); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 1, index); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN opt_invokebuiltin_delegate_leave # line 1507 "insns.def" { val = vm_invoke_builtin_delegate(ec, reg_cfp, bf, (unsigned int)index); /* leave fastpath */ /* TracePoint/return should fallback this insn to opt_invokebuiltin_delegate */ if (vm_pop_frame(ec, GET_CFP(), GET_EP())) { # if OPT_CALL_THREADED_CODE rb_ec_thread_ptr(ec)->retval = val; return 0; # else return val; # endif } else { RESTORE_REGS(); } } # line 4384 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(opt_invokebuiltin_delegate_leave); } /* insn getlocal_WC_0(idx)()(val) */ INSN_ENTRY(getlocal_WC_0) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(getlocal_WC_0); DEBUG_ENTER_INSN("getlocal_WC_0"); /* ### Declare and assign variables. ### */ #line 10 "defs/opt_operand.def" const rb_num_t level = 0; #line 4411 "vm.inc" lindex_t idx = (lindex_t)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _getlocal_WC_0(idx) bool leaf = INSN_ATTR(leaf); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, idx); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN getlocal_WC_0 # line 81 "insns.def" { val = *(vm_get_ep(GET_EP(), level) - idx); RB_DEBUG_COUNTER_INC(lvar_get); (void)RB_DEBUG_COUNTER_INC_IF(lvar_get_dynamic, level > 0); } # line 4431 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(getlocal_WC_0); } /* insn getlocal_WC_1(idx)()(val) */ INSN_ENTRY(getlocal_WC_1) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(getlocal_WC_1); DEBUG_ENTER_INSN("getlocal_WC_1"); /* ### Declare and assign variables. ### */ #line 11 "defs/opt_operand.def" const rb_num_t level = 1; #line 4458 "vm.inc" lindex_t idx = (lindex_t)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _getlocal_WC_1(idx) bool leaf = INSN_ATTR(leaf); VALUE val; /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, idx); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN getlocal_WC_1 # line 81 "insns.def" { val = *(vm_get_ep(GET_EP(), level) - idx); RB_DEBUG_COUNTER_INC(lvar_get); (void)RB_DEBUG_COUNTER_INC_IF(lvar_get_dynamic, level > 0); } # line 4478 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(getlocal_WC_1); } /* insn setlocal_WC_0(idx)(val)() */ INSN_ENTRY(setlocal_WC_0) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(setlocal_WC_0); DEBUG_ENTER_INSN("setlocal_WC_0"); /* ### Declare and assign variables. ### */ #line 12 "defs/opt_operand.def" const rb_num_t level = 0; #line 4505 "vm.inc" lindex_t idx = (lindex_t)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _setlocal_WC_0(idx) bool leaf = INSN_ATTR(leaf); VALUE val = TOPN(0); /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, idx); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN setlocal_WC_0 # line 95 "insns.def" { vm_env_write(vm_get_ep(GET_EP(), level), -(int)idx, val); RB_DEBUG_COUNTER_INC(lvar_set); (void)RB_DEBUG_COUNTER_INC_IF(lvar_set_dynamic, level > 0); } # line 4525 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(setlocal_WC_0); } /* insn setlocal_WC_1(idx)(val)() */ INSN_ENTRY(setlocal_WC_1) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(setlocal_WC_1); DEBUG_ENTER_INSN("setlocal_WC_1"); /* ### Declare and assign variables. ### */ #line 13 "defs/opt_operand.def" const rb_num_t level = 1; #line 4549 "vm.inc" lindex_t idx = (lindex_t)GET_OPERAND(1); # define INSN_ATTR(x) attr_ ## x ## _setlocal_WC_1(idx) bool leaf = INSN_ATTR(leaf); VALUE val = TOPN(0); /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); SETUP_CANARY(); COLLECT_USAGE_INSN(INSN_ATTR(bin)); COLLECT_USAGE_OPERAND(INSN_ATTR(bin), 0, idx); /* ### Here we do the instruction body. ### */ # define NAME_OF_CURRENT_INSN setlocal_WC_1 # line 95 "insns.def" { vm_env_write(vm_get_ep(GET_EP(), level), -(int)idx, val); RB_DEBUG_COUNTER_INC(lvar_set); (void)RB_DEBUG_COUNTER_INC_IF(lvar_set_dynamic, level > 0); } # line 4569 "vm.inc" # undef NAME_OF_CURRENT_INSN /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); CHECK_CANARY(); INC_SP(INSN_ATTR(sp_inc)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(setlocal_WC_1); } /* insn putobject_INT2FIX_0_()()(val) */ INSN_ENTRY(putobject_INT2FIX_0_) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(putobject_INT2FIX_0_); DEBUG_ENTER_INSN("putobject_INT2FIX_0_"); /* ### Declare and assign variables. ### */ #line 15 "defs/opt_operand.def" const VALUE val = INT2FIX(0); #line 4593 "vm.inc" # define INSN_ATTR(x) attr_ ## x ## _putobject_INT2FIX_0_() bool leaf = INSN_ATTR(leaf); /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); COLLECT_USAGE_INSN(INSN_ATTR(bin)); /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(putobject_INT2FIX_0_); } /* insn putobject_INT2FIX_1_()()(val) */ INSN_ENTRY(putobject_INT2FIX_1_) { /* ### Declare that we have just entered into an instruction. ### */ START_OF_ORIGINAL_INSN(putobject_INT2FIX_1_); DEBUG_ENTER_INSN("putobject_INT2FIX_1_"); /* ### Declare and assign variables. ### */ #line 16 "defs/opt_operand.def" const VALUE val = INT2FIX(1); #line 4624 "vm.inc" # define INSN_ATTR(x) attr_ ## x ## _putobject_INT2FIX_1_() bool leaf = INSN_ATTR(leaf); /* ### Instruction preambles. ### */ if (! leaf) ADD_PC(INSN_ATTR(width)); COLLECT_USAGE_INSN(INSN_ATTR(bin)); /* ### Instruction trailers. ### */ CHECK_VM_STACK_OVERFLOW_FOR_INSN(VM_REG_CFP, INSN_ATTR(retn)); INC_SP(INSN_ATTR(sp_inc)); TOPN(0) = val; VM_ASSERT(!RB_TYPE_P(TOPN(0), T_NONE)); VM_ASSERT(!RB_TYPE_P(TOPN(0), T_MOVED)); if (leaf) ADD_PC(INSN_ATTR(width)); # undef INSN_ATTR /* ### Leave the instruction. ### */ END_INSN(putobject_INT2FIX_1_); } /* insn trace_nop(...)(...)(...) */ INSN_ENTRY(trace_nop) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(nop); END_INSN(trace_nop); } /* insn trace_getlocal(...)(...)(...) */ INSN_ENTRY(trace_getlocal) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(getlocal); END_INSN(trace_getlocal); } /* insn trace_setlocal(...)(...)(...) */ INSN_ENTRY(trace_setlocal) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(setlocal); END_INSN(trace_setlocal); } /* insn trace_getblockparam(...)(...)(...) */ INSN_ENTRY(trace_getblockparam) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(getblockparam); END_INSN(trace_getblockparam); } /* insn trace_setblockparam(...)(...)(...) */ INSN_ENTRY(trace_setblockparam) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(setblockparam); END_INSN(trace_setblockparam); } /* insn trace_getblockparamproxy(...)(...)(...) */ INSN_ENTRY(trace_getblockparamproxy) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(getblockparamproxy); END_INSN(trace_getblockparamproxy); } /* insn trace_getspecial(...)(...)(...) */ INSN_ENTRY(trace_getspecial) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(getspecial); END_INSN(trace_getspecial); } /* insn trace_setspecial(...)(...)(...) */ INSN_ENTRY(trace_setspecial) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(setspecial); END_INSN(trace_setspecial); } /* insn trace_getinstancevariable(...)(...)(...) */ INSN_ENTRY(trace_getinstancevariable) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(getinstancevariable); END_INSN(trace_getinstancevariable); } /* insn trace_setinstancevariable(...)(...)(...) */ INSN_ENTRY(trace_setinstancevariable) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(setinstancevariable); END_INSN(trace_setinstancevariable); } /* insn trace_getclassvariable(...)(...)(...) */ INSN_ENTRY(trace_getclassvariable) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(getclassvariable); END_INSN(trace_getclassvariable); } /* insn trace_setclassvariable(...)(...)(...) */ INSN_ENTRY(trace_setclassvariable) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(setclassvariable); END_INSN(trace_setclassvariable); } /* insn trace_getconstant(...)(...)(...) */ INSN_ENTRY(trace_getconstant) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(getconstant); END_INSN(trace_getconstant); } /* insn trace_setconstant(...)(...)(...) */ INSN_ENTRY(trace_setconstant) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(setconstant); END_INSN(trace_setconstant); } /* insn trace_getglobal(...)(...)(...) */ INSN_ENTRY(trace_getglobal) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(getglobal); END_INSN(trace_getglobal); } /* insn trace_setglobal(...)(...)(...) */ INSN_ENTRY(trace_setglobal) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(setglobal); END_INSN(trace_setglobal); } /* insn trace_putnil(...)(...)(...) */ INSN_ENTRY(trace_putnil) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(putnil); END_INSN(trace_putnil); } /* insn trace_putself(...)(...)(...) */ INSN_ENTRY(trace_putself) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(putself); END_INSN(trace_putself); } /* insn trace_putobject(...)(...)(...) */ INSN_ENTRY(trace_putobject) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(putobject); END_INSN(trace_putobject); } /* insn trace_putspecialobject(...)(...)(...) */ INSN_ENTRY(trace_putspecialobject) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(putspecialobject); END_INSN(trace_putspecialobject); } /* insn trace_putstring(...)(...)(...) */ INSN_ENTRY(trace_putstring) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(putstring); END_INSN(trace_putstring); } /* insn trace_concatstrings(...)(...)(...) */ INSN_ENTRY(trace_concatstrings) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(concatstrings); END_INSN(trace_concatstrings); } /* insn trace_tostring(...)(...)(...) */ INSN_ENTRY(trace_tostring) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(tostring); END_INSN(trace_tostring); } /* insn trace_freezestring(...)(...)(...) */ INSN_ENTRY(trace_freezestring) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(freezestring); END_INSN(trace_freezestring); } /* insn trace_toregexp(...)(...)(...) */ INSN_ENTRY(trace_toregexp) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(toregexp); END_INSN(trace_toregexp); } /* insn trace_intern(...)(...)(...) */ INSN_ENTRY(trace_intern) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(intern); END_INSN(trace_intern); } /* insn trace_newarray(...)(...)(...) */ INSN_ENTRY(trace_newarray) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(newarray); END_INSN(trace_newarray); } /* insn trace_newarraykwsplat(...)(...)(...) */ INSN_ENTRY(trace_newarraykwsplat) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(newarraykwsplat); END_INSN(trace_newarraykwsplat); } /* insn trace_duparray(...)(...)(...) */ INSN_ENTRY(trace_duparray) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(duparray); END_INSN(trace_duparray); } /* insn trace_duphash(...)(...)(...) */ INSN_ENTRY(trace_duphash) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(duphash); END_INSN(trace_duphash); } /* insn trace_expandarray(...)(...)(...) */ INSN_ENTRY(trace_expandarray) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(expandarray); END_INSN(trace_expandarray); } /* insn trace_concatarray(...)(...)(...) */ INSN_ENTRY(trace_concatarray) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(concatarray); END_INSN(trace_concatarray); } /* insn trace_splatarray(...)(...)(...) */ INSN_ENTRY(trace_splatarray) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(splatarray); END_INSN(trace_splatarray); } /* insn trace_newhash(...)(...)(...) */ INSN_ENTRY(trace_newhash) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(newhash); END_INSN(trace_newhash); } /* insn trace_newrange(...)(...)(...) */ INSN_ENTRY(trace_newrange) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(newrange); END_INSN(trace_newrange); } /* insn trace_pop(...)(...)(...) */ INSN_ENTRY(trace_pop) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(pop); END_INSN(trace_pop); } /* insn trace_dup(...)(...)(...) */ INSN_ENTRY(trace_dup) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(dup); END_INSN(trace_dup); } /* insn trace_dupn(...)(...)(...) */ INSN_ENTRY(trace_dupn) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(dupn); END_INSN(trace_dupn); } /* insn trace_swap(...)(...)(...) */ INSN_ENTRY(trace_swap) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(swap); END_INSN(trace_swap); } /* insn trace_reverse(...)(...)(...) */ INSN_ENTRY(trace_reverse) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(reverse); END_INSN(trace_reverse); } /* insn trace_topn(...)(...)(...) */ INSN_ENTRY(trace_topn) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(topn); END_INSN(trace_topn); } /* insn trace_setn(...)(...)(...) */ INSN_ENTRY(trace_setn) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(setn); END_INSN(trace_setn); } /* insn trace_adjuststack(...)(...)(...) */ INSN_ENTRY(trace_adjuststack) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(adjuststack); END_INSN(trace_adjuststack); } /* insn trace_defined(...)(...)(...) */ INSN_ENTRY(trace_defined) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(defined); END_INSN(trace_defined); } /* insn trace_checkmatch(...)(...)(...) */ INSN_ENTRY(trace_checkmatch) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(checkmatch); END_INSN(trace_checkmatch); } /* insn trace_checkkeyword(...)(...)(...) */ INSN_ENTRY(trace_checkkeyword) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(checkkeyword); END_INSN(trace_checkkeyword); } /* insn trace_checktype(...)(...)(...) */ INSN_ENTRY(trace_checktype) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(checktype); END_INSN(trace_checktype); } /* insn trace_defineclass(...)(...)(...) */ INSN_ENTRY(trace_defineclass) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(defineclass); END_INSN(trace_defineclass); } /* insn trace_definemethod(...)(...)(...) */ INSN_ENTRY(trace_definemethod) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(definemethod); END_INSN(trace_definemethod); } /* insn trace_definesmethod(...)(...)(...) */ INSN_ENTRY(trace_definesmethod) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(definesmethod); END_INSN(trace_definesmethod); } /* insn trace_send(...)(...)(...) */ INSN_ENTRY(trace_send) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(send); END_INSN(trace_send); } /* insn trace_opt_send_without_block(...)(...)(...) */ INSN_ENTRY(trace_opt_send_without_block) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(opt_send_without_block); END_INSN(trace_opt_send_without_block); } /* insn trace_opt_str_freeze(...)(...)(...) */ INSN_ENTRY(trace_opt_str_freeze) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(opt_str_freeze); END_INSN(trace_opt_str_freeze); } /* insn trace_opt_nil_p(...)(...)(...) */ INSN_ENTRY(trace_opt_nil_p) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(opt_nil_p); END_INSN(trace_opt_nil_p); } /* insn trace_opt_str_uminus(...)(...)(...) */ INSN_ENTRY(trace_opt_str_uminus) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(opt_str_uminus); END_INSN(trace_opt_str_uminus); } /* insn trace_opt_newarray_max(...)(...)(...) */ INSN_ENTRY(trace_opt_newarray_max) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(opt_newarray_max); END_INSN(trace_opt_newarray_max); } /* insn trace_opt_newarray_min(...)(...)(...) */ INSN_ENTRY(trace_opt_newarray_min) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(opt_newarray_min); END_INSN(trace_opt_newarray_min); } /* insn trace_invokesuper(...)(...)(...) */ INSN_ENTRY(trace_invokesuper) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(invokesuper); END_INSN(trace_invokesuper); } /* insn trace_invokeblock(...)(...)(...) */ INSN_ENTRY(trace_invokeblock) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(invokeblock); END_INSN(trace_invokeblock); } /* insn trace_leave(...)(...)(...) */ INSN_ENTRY(trace_leave) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(leave); END_INSN(trace_leave); } /* insn trace_throw(...)(...)(...) */ INSN_ENTRY(trace_throw) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(throw); END_INSN(trace_throw); } /* insn trace_jump(...)(...)(...) */ INSN_ENTRY(trace_jump) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(jump); END_INSN(trace_jump); } /* insn trace_branchif(...)(...)(...) */ INSN_ENTRY(trace_branchif) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(branchif); END_INSN(trace_branchif); } /* insn trace_branchunless(...)(...)(...) */ INSN_ENTRY(trace_branchunless) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(branchunless); END_INSN(trace_branchunless); } /* insn trace_branchnil(...)(...)(...) */ INSN_ENTRY(trace_branchnil) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(branchnil); END_INSN(trace_branchnil); } /* insn trace_opt_getinlinecache(...)(...)(...) */ INSN_ENTRY(trace_opt_getinlinecache) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(opt_getinlinecache); END_INSN(trace_opt_getinlinecache); } /* insn trace_opt_setinlinecache(...)(...)(...) */ INSN_ENTRY(trace_opt_setinlinecache) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(opt_setinlinecache); END_INSN(trace_opt_setinlinecache); } /* insn trace_once(...)(...)(...) */ INSN_ENTRY(trace_once) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(once); END_INSN(trace_once); } /* insn trace_opt_case_dispatch(...)(...)(...) */ INSN_ENTRY(trace_opt_case_dispatch) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(opt_case_dispatch); END_INSN(trace_opt_case_dispatch); } /* insn trace_opt_plus(...)(...)(...) */ INSN_ENTRY(trace_opt_plus) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(opt_plus); END_INSN(trace_opt_plus); } /* insn trace_opt_minus(...)(...)(...) */ INSN_ENTRY(trace_opt_minus) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(opt_minus); END_INSN(trace_opt_minus); } /* insn trace_opt_mult(...)(...)(...) */ INSN_ENTRY(trace_opt_mult) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(opt_mult); END_INSN(trace_opt_mult); } /* insn trace_opt_div(...)(...)(...) */ INSN_ENTRY(trace_opt_div) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(opt_div); END_INSN(trace_opt_div); } /* insn trace_opt_mod(...)(...)(...) */ INSN_ENTRY(trace_opt_mod) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(opt_mod); END_INSN(trace_opt_mod); } /* insn trace_opt_eq(...)(...)(...) */ INSN_ENTRY(trace_opt_eq) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(opt_eq); END_INSN(trace_opt_eq); } /* insn trace_opt_neq(...)(...)(...) */ INSN_ENTRY(trace_opt_neq) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(opt_neq); END_INSN(trace_opt_neq); } /* insn trace_opt_lt(...)(...)(...) */ INSN_ENTRY(trace_opt_lt) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(opt_lt); END_INSN(trace_opt_lt); } /* insn trace_opt_le(...)(...)(...) */ INSN_ENTRY(trace_opt_le) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(opt_le); END_INSN(trace_opt_le); } /* insn trace_opt_gt(...)(...)(...) */ INSN_ENTRY(trace_opt_gt) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(opt_gt); END_INSN(trace_opt_gt); } /* insn trace_opt_ge(...)(...)(...) */ INSN_ENTRY(trace_opt_ge) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(opt_ge); END_INSN(trace_opt_ge); } /* insn trace_opt_ltlt(...)(...)(...) */ INSN_ENTRY(trace_opt_ltlt) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(opt_ltlt); END_INSN(trace_opt_ltlt); } /* insn trace_opt_and(...)(...)(...) */ INSN_ENTRY(trace_opt_and) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(opt_and); END_INSN(trace_opt_and); } /* insn trace_opt_or(...)(...)(...) */ INSN_ENTRY(trace_opt_or) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(opt_or); END_INSN(trace_opt_or); } /* insn trace_opt_aref(...)(...)(...) */ INSN_ENTRY(trace_opt_aref) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(opt_aref); END_INSN(trace_opt_aref); } /* insn trace_opt_aset(...)(...)(...) */ INSN_ENTRY(trace_opt_aset) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(opt_aset); END_INSN(trace_opt_aset); } /* insn trace_opt_aset_with(...)(...)(...) */ INSN_ENTRY(trace_opt_aset_with) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(opt_aset_with); END_INSN(trace_opt_aset_with); } /* insn trace_opt_aref_with(...)(...)(...) */ INSN_ENTRY(trace_opt_aref_with) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(opt_aref_with); END_INSN(trace_opt_aref_with); } /* insn trace_opt_length(...)(...)(...) */ INSN_ENTRY(trace_opt_length) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(opt_length); END_INSN(trace_opt_length); } /* insn trace_opt_size(...)(...)(...) */ INSN_ENTRY(trace_opt_size) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(opt_size); END_INSN(trace_opt_size); } /* insn trace_opt_empty_p(...)(...)(...) */ INSN_ENTRY(trace_opt_empty_p) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(opt_empty_p); END_INSN(trace_opt_empty_p); } /* insn trace_opt_succ(...)(...)(...) */ INSN_ENTRY(trace_opt_succ) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(opt_succ); END_INSN(trace_opt_succ); } /* insn trace_opt_not(...)(...)(...) */ INSN_ENTRY(trace_opt_not) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(opt_not); END_INSN(trace_opt_not); } /* insn trace_opt_regexpmatch2(...)(...)(...) */ INSN_ENTRY(trace_opt_regexpmatch2) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(opt_regexpmatch2); END_INSN(trace_opt_regexpmatch2); } /* insn trace_opt_call_c_function(...)(...)(...) */ INSN_ENTRY(trace_opt_call_c_function) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(opt_call_c_function); END_INSN(trace_opt_call_c_function); } /* insn trace_invokebuiltin(...)(...)(...) */ INSN_ENTRY(trace_invokebuiltin) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(invokebuiltin); END_INSN(trace_invokebuiltin); } /* insn trace_opt_invokebuiltin_delegate(...)(...)(...) */ INSN_ENTRY(trace_opt_invokebuiltin_delegate) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(opt_invokebuiltin_delegate); END_INSN(trace_opt_invokebuiltin_delegate); } /* insn trace_opt_invokebuiltin_delegate_leave(...)(...)(...) */ INSN_ENTRY(trace_opt_invokebuiltin_delegate_leave) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(opt_invokebuiltin_delegate_leave); END_INSN(trace_opt_invokebuiltin_delegate_leave); } /* insn trace_getlocal_WC_0(...)(...)(...) */ INSN_ENTRY(trace_getlocal_WC_0) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(getlocal_WC_0); END_INSN(trace_getlocal_WC_0); } /* insn trace_getlocal_WC_1(...)(...)(...) */ INSN_ENTRY(trace_getlocal_WC_1) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(getlocal_WC_1); END_INSN(trace_getlocal_WC_1); } /* insn trace_setlocal_WC_0(...)(...)(...) */ INSN_ENTRY(trace_setlocal_WC_0) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(setlocal_WC_0); END_INSN(trace_setlocal_WC_0); } /* insn trace_setlocal_WC_1(...)(...)(...) */ INSN_ENTRY(trace_setlocal_WC_1) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(setlocal_WC_1); END_INSN(trace_setlocal_WC_1); } /* insn trace_putobject_INT2FIX_0_(...)(...)(...) */ INSN_ENTRY(trace_putobject_INT2FIX_0_) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(putobject_INT2FIX_0_); END_INSN(trace_putobject_INT2FIX_0_); } /* insn trace_putobject_INT2FIX_1_(...)(...)(...) */ INSN_ENTRY(trace_putobject_INT2FIX_1_) { vm_trace(ec, GET_CFP(), GET_PC()); DISPATCH_ORIGINAL_INSN(putobject_INT2FIX_1_); END_INSN(trace_putobject_INT2FIX_1_); }