관리-도구
편집 파일: instruction.rb
module RubyVM::MJIT # :nodoc: all Instruction = Struct.new( :name, :bin, :len, :expr, :declarations, :preamble, :opes, :pops, :rets, :always_leaf?, :leaf_without_check_ints?, :handles_sp?, ) INSNS = { 0 => Instruction.new( name: :nop, bin: 0, # BIN(nop) len: 1, # insn_len expr: <<-EXPR, { /* none */ } EXPR declarations: [], preamble: [], opes: [], pops: [], rets: [], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 1 => Instruction.new( name: :getlocal, bin: 1, # BIN(getlocal) len: 3, # insn_len expr: <<-EXPR, { 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); } EXPR declarations: ["MAYBE_UNUSED(VALUE) val", "MAYBE_UNUSED(lindex_t) idx", "MAYBE_UNUSED(rb_num_t) level"], preamble: [], opes: [{:decl=>"lindex_t idx", :type=>"lindex_t", :name=>"idx"}, {:decl=>"rb_num_t level", :type=>"rb_num_t", :name=>"level"}], pops: [], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 2 => Instruction.new( name: :setlocal, bin: 2, # BIN(setlocal) len: 3, # insn_len expr: <<-EXPR, { 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); } EXPR declarations: ["MAYBE_UNUSED(VALUE) val", "MAYBE_UNUSED(lindex_t) idx", "MAYBE_UNUSED(rb_num_t) level"], preamble: [], opes: [{:decl=>"lindex_t idx", :type=>"lindex_t", :name=>"idx"}, {:decl=>"rb_num_t level", :type=>"rb_num_t", :name=>"level"}], pops: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], rets: [], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 3 => Instruction.new( name: :getblockparam, bin: 3, # BIN(getblockparam) len: 3, # insn_len expr: <<-EXPR, { 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); } } EXPR declarations: ["MAYBE_UNUSED(VALUE) val", "MAYBE_UNUSED(lindex_t) idx", "MAYBE_UNUSED(rb_num_t) level"], preamble: [], opes: [{:decl=>"lindex_t idx", :type=>"lindex_t", :name=>"idx"}, {:decl=>"rb_num_t level", :type=>"rb_num_t", :name=>"level"}], pops: [], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 4 => Instruction.new( name: :setblockparam, bin: 4, # BIN(setblockparam) len: 3, # insn_len expr: <<-EXPR, { 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); } EXPR declarations: ["MAYBE_UNUSED(VALUE) val", "MAYBE_UNUSED(lindex_t) idx", "MAYBE_UNUSED(rb_num_t) level"], preamble: [], opes: [{:decl=>"lindex_t idx", :type=>"lindex_t", :name=>"idx"}, {:decl=>"rb_num_t level", :type=>"rb_num_t", :name=>"level"}], pops: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], rets: [], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 5 => Instruction.new( name: :getblockparamproxy, bin: 5, # BIN(getblockparamproxy) len: 3, # insn_len expr: <<-EXPR, { 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); } } EXPR declarations: ["MAYBE_UNUSED(VALUE) val", "MAYBE_UNUSED(lindex_t) idx", "MAYBE_UNUSED(rb_num_t) level"], preamble: [], opes: [{:decl=>"lindex_t idx", :type=>"lindex_t", :name=>"idx"}, {:decl=>"rb_num_t level", :type=>"rb_num_t", :name=>"level"}], pops: [], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 6 => Instruction.new( name: :getspecial, bin: 6, # BIN(getspecial) len: 3, # insn_len expr: <<-EXPR, { val = vm_getspecial(ec, GET_LEP(), key, type); } EXPR declarations: ["MAYBE_UNUSED(VALUE) val", "MAYBE_UNUSED(rb_num_t) key, type"], preamble: [], opes: [{:decl=>"rb_num_t key", :type=>"rb_num_t", :name=>"key"}, {:decl=>"rb_num_t type", :type=>"rb_num_t", :name=>"type"}], pops: [], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: false, ), 7 => Instruction.new( name: :setspecial, bin: 7, # BIN(setspecial) len: 2, # insn_len expr: <<-EXPR, { lep_svar_set(ec, GET_LEP(), key, obj); } EXPR declarations: ["MAYBE_UNUSED(VALUE) obj", "MAYBE_UNUSED(rb_num_t) key"], preamble: [], opes: [{:decl=>"rb_num_t key", :type=>"rb_num_t", :name=>"key"}], pops: [{:decl=>"VALUE obj", :type=>"VALUE", :name=>"obj"}], rets: [], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 8 => Instruction.new( name: :getinstancevariable, bin: 8, # BIN(getinstancevariable) len: 3, # insn_len expr: <<-EXPR, { val = vm_getinstancevariable(GET_ISEQ(), GET_SELF(), id, ic); } EXPR declarations: ["MAYBE_UNUSED(ID) id", "MAYBE_UNUSED(IVC) ic", "MAYBE_UNUSED(VALUE) val"], preamble: [], opes: [{:decl=>"ID id", :type=>"ID", :name=>"id"}, {:decl=>"IVC ic", :type=>"IVC", :name=>"ic"}], pops: [], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: false, ), 9 => Instruction.new( name: :setinstancevariable, bin: 9, # BIN(setinstancevariable) len: 3, # insn_len expr: <<-EXPR, { vm_setinstancevariable(GET_ISEQ(), GET_SELF(), id, val, ic); } EXPR declarations: ["MAYBE_UNUSED(ID) id", "MAYBE_UNUSED(IVC) ic", "MAYBE_UNUSED(VALUE) val"], preamble: [], opes: [{:decl=>"ID id", :type=>"ID", :name=>"id"}, {:decl=>"IVC ic", :type=>"IVC", :name=>"ic"}], pops: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], rets: [], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: false, ), 10 => Instruction.new( name: :getclassvariable, bin: 10, # BIN(getclassvariable) len: 3, # insn_len expr: <<-EXPR, { rb_control_frame_t *cfp = GET_CFP(); val = vm_getclassvariable(GET_ISEQ(), cfp, id, ic); } EXPR declarations: ["MAYBE_UNUSED(ICVARC) ic", "MAYBE_UNUSED(ID) id", "MAYBE_UNUSED(VALUE) val"], preamble: [], opes: [{:decl=>"ID id", :type=>"ID", :name=>"id"}, {:decl=>"ICVARC ic", :type=>"ICVARC", :name=>"ic"}], pops: [], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: false, ), 11 => Instruction.new( name: :setclassvariable, bin: 11, # BIN(setclassvariable) len: 3, # insn_len expr: <<-EXPR, { vm_ensure_not_refinement_module(GET_SELF()); vm_setclassvariable(GET_ISEQ(), GET_CFP(), id, val, ic); } EXPR declarations: ["MAYBE_UNUSED(ICVARC) ic", "MAYBE_UNUSED(ID) id", "MAYBE_UNUSED(VALUE) val"], preamble: [], opes: [{:decl=>"ID id", :type=>"ID", :name=>"id"}, {:decl=>"ICVARC ic", :type=>"ICVARC", :name=>"ic"}], pops: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], rets: [], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: false, ), 12 => Instruction.new( name: :opt_getconstant_path, bin: 12, # BIN(opt_getconstant_path) len: 2, # insn_len expr: <<-EXPR, { const ID *segments = ic->segments; struct iseq_inline_constant_cache_entry *ice = ic->entry; if (ice && vm_ic_hit_p(ice, GET_EP())) { val = ice->value; VM_ASSERT(val == vm_get_ev_const_chain(ec, segments)); } else { ruby_vm_constant_cache_misses++; val = vm_get_ev_const_chain(ec, segments); vm_ic_track_const_chain(GET_CFP(), ic, segments); // Because leaf=false, we need to undo the PC increment to get the address to this instruction // INSN_ATTR(width) == 2 vm_ic_update(GET_ISEQ(), ic, val, GET_EP(), GET_PC() - 2); } } EXPR declarations: ["MAYBE_UNUSED(IC) ic", "MAYBE_UNUSED(VALUE) val"], preamble: [], opes: [{:decl=>"IC ic", :type=>"IC", :name=>"ic"}], pops: [], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: false, ), 13 => Instruction.new( name: :getconstant, bin: 13, # BIN(getconstant) len: 2, # insn_len expr: <<-EXPR, { val = vm_get_ev_const(ec, klass, id, allow_nil == Qtrue, 0); } EXPR declarations: ["MAYBE_UNUSED(ID) id", "MAYBE_UNUSED(VALUE) allow_nil, klass, val"], preamble: [], opes: [{:decl=>"ID id", :type=>"ID", :name=>"id"}], pops: [{:decl=>"VALUE klass", :type=>"VALUE", :name=>"klass"}, {:decl=>"VALUE allow_nil", :type=>"VALUE", :name=>"allow_nil"}], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: false, ), 14 => Instruction.new( name: :setconstant, bin: 14, # BIN(setconstant) len: 2, # insn_len expr: <<-EXPR, { vm_check_if_namespace(cbase); vm_ensure_not_refinement_module(GET_SELF()); rb_const_set(cbase, id, val); } EXPR declarations: ["MAYBE_UNUSED(ID) id", "MAYBE_UNUSED(VALUE) cbase, val"], preamble: [], opes: [{:decl=>"ID id", :type=>"ID", :name=>"id"}], pops: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}, {:decl=>"VALUE cbase", :type=>"VALUE", :name=>"cbase"}], rets: [], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: false, ), 15 => Instruction.new( name: :getglobal, bin: 15, # BIN(getglobal) len: 2, # insn_len expr: <<-EXPR, { val = rb_gvar_get(gid); } EXPR declarations: ["MAYBE_UNUSED(ID) gid", "MAYBE_UNUSED(VALUE) val"], preamble: [], opes: [{:decl=>"ID gid", :type=>"ID", :name=>"gid"}], pops: [], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: false, ), 16 => Instruction.new( name: :setglobal, bin: 16, # BIN(setglobal) len: 2, # insn_len expr: <<-EXPR, { rb_gvar_set(gid, val); } EXPR declarations: ["MAYBE_UNUSED(ID) gid", "MAYBE_UNUSED(VALUE) val"], preamble: [], opes: [{:decl=>"ID gid", :type=>"ID", :name=>"gid"}], pops: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], rets: [], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: false, ), 17 => Instruction.new( name: :putnil, bin: 17, # BIN(putnil) len: 1, # insn_len expr: <<-EXPR, { val = Qnil; } EXPR declarations: ["MAYBE_UNUSED(VALUE) val"], preamble: [], opes: [], pops: [], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 18 => Instruction.new( name: :putself, bin: 18, # BIN(putself) len: 1, # insn_len expr: <<-EXPR, { val = GET_SELF(); } EXPR declarations: ["MAYBE_UNUSED(VALUE) val"], preamble: [], opes: [], pops: [], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 19 => Instruction.new( name: :putobject, bin: 19, # BIN(putobject) len: 2, # insn_len expr: <<-EXPR, { /* */ } EXPR declarations: ["MAYBE_UNUSED(VALUE) val"], preamble: [], opes: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], pops: [], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 20 => Instruction.new( name: :putspecialobject, bin: 20, # BIN(putspecialobject) len: 2, # insn_len expr: <<-EXPR, { enum vm_special_object_type type; type = (enum vm_special_object_type)value_type; val = vm_get_special_object(GET_EP(), type); } EXPR declarations: ["MAYBE_UNUSED(VALUE) val", "MAYBE_UNUSED(rb_num_t) value_type"], preamble: [], opes: [{:decl=>"rb_num_t value_type", :type=>"rb_num_t", :name=>"value_type"}], pops: [], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: false, ), 21 => Instruction.new( name: :putstring, bin: 21, # BIN(putstring) len: 2, # insn_len expr: <<-EXPR, { val = rb_ec_str_resurrect(ec, str); } EXPR declarations: ["MAYBE_UNUSED(VALUE) str, val"], preamble: [], opes: [{:decl=>"VALUE str", :type=>"VALUE", :name=>"str"}], pops: [], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 22 => Instruction.new( name: :concatstrings, bin: 22, # BIN(concatstrings) len: 2, # insn_len expr: <<-EXPR, { val = rb_str_concat_literals(num, STACK_ADDR_FROM_TOP(num)); } EXPR declarations: ["MAYBE_UNUSED(VALUE) val", "MAYBE_UNUSED(rb_num_t) num"], preamble: [], opes: [{:decl=>"rb_num_t num", :type=>"rb_num_t", :name=>"num"}], pops: [], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: false, ), 23 => Instruction.new( name: :anytostring, bin: 23, # BIN(anytostring) len: 1, # insn_len expr: <<-EXPR, { val = rb_obj_as_string_result(str, val); } EXPR declarations: ["MAYBE_UNUSED(VALUE) str, val"], preamble: [], opes: [], pops: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}, {:decl=>"VALUE str", :type=>"VALUE", :name=>"str"}], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 24 => Instruction.new( name: :toregexp, bin: 24, # BIN(toregexp) len: 3, # insn_len expr: <<-EXPR, { 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); } EXPR declarations: ["MAYBE_UNUSED(VALUE) val", "MAYBE_UNUSED(rb_num_t) cnt, opt"], preamble: [], opes: [{:decl=>"rb_num_t opt", :type=>"rb_num_t", :name=>"opt"}, {:decl=>"rb_num_t cnt", :type=>"rb_num_t", :name=>"cnt"}], pops: [], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: false, ), 25 => Instruction.new( name: :intern, bin: 25, # BIN(intern) len: 1, # insn_len expr: <<-EXPR, { sym = rb_str_intern(str); } EXPR declarations: ["MAYBE_UNUSED(VALUE) str, sym"], preamble: [], opes: [], pops: [{:decl=>"VALUE str", :type=>"VALUE", :name=>"str"}], rets: [{:decl=>"VALUE sym", :type=>"VALUE", :name=>"sym"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 26 => Instruction.new( name: :newarray, bin: 26, # BIN(newarray) len: 2, # insn_len expr: <<-EXPR, { val = rb_ec_ary_new_from_values(ec, num, STACK_ADDR_FROM_TOP(num)); } EXPR declarations: ["MAYBE_UNUSED(VALUE) val", "MAYBE_UNUSED(rb_num_t) num"], preamble: [], opes: [{:decl=>"rb_num_t num", :type=>"rb_num_t", :name=>"num"}], pops: [], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 27 => Instruction.new( name: :newarraykwsplat, bin: 27, # BIN(newarraykwsplat) len: 2, # insn_len expr: <<-EXPR, { 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)); } } EXPR declarations: ["MAYBE_UNUSED(VALUE) val", "MAYBE_UNUSED(rb_num_t) num"], preamble: [], opes: [{:decl=>"rb_num_t num", :type=>"rb_num_t", :name=>"num"}], pops: [], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 28 => Instruction.new( name: :duparray, bin: 28, # BIN(duparray) len: 2, # insn_len expr: <<-EXPR, { RUBY_DTRACE_CREATE_HOOK(ARRAY, RARRAY_LEN(ary)); val = rb_ary_resurrect(ary); } EXPR declarations: ["MAYBE_UNUSED(VALUE) ary, val"], preamble: [], opes: [{:decl=>"VALUE ary", :type=>"VALUE", :name=>"ary"}], pops: [], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 29 => Instruction.new( name: :duphash, bin: 29, # BIN(duphash) len: 2, # insn_len expr: <<-EXPR, { RUBY_DTRACE_CREATE_HOOK(HASH, RHASH_SIZE(hash) << 1); val = rb_hash_resurrect(hash); } EXPR declarations: ["MAYBE_UNUSED(VALUE) hash, val"], preamble: [], opes: [{:decl=>"VALUE hash", :type=>"VALUE", :name=>"hash"}], pops: [], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 30 => Instruction.new( name: :expandarray, bin: 30, # BIN(expandarray) len: 3, # insn_len expr: <<-EXPR, { vm_expandarray(GET_SP(), ary, num, (int)flag); } EXPR declarations: ["MAYBE_UNUSED(VALUE) ary", "MAYBE_UNUSED(rb_num_t) flag, num"], preamble: [], opes: [{:decl=>"rb_num_t num", :type=>"rb_num_t", :name=>"num"}, {:decl=>"rb_num_t flag", :type=>"rb_num_t", :name=>"flag"}], pops: [{:decl=>"VALUE ary", :type=>"VALUE", :name=>"ary"}], rets: [], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: false, ), 31 => Instruction.new( name: :concatarray, bin: 31, # BIN(concatarray) len: 1, # insn_len expr: <<-EXPR, { ary = vm_concat_array(ary1, ary2); } EXPR declarations: ["MAYBE_UNUSED(VALUE) ary, ary1, ary2"], preamble: [], opes: [], pops: [{:decl=>"VALUE ary1", :type=>"VALUE", :name=>"ary1"}, {:decl=>"VALUE ary2", :type=>"VALUE", :name=>"ary2"}], rets: [{:decl=>"VALUE ary", :type=>"VALUE", :name=>"ary"}], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: false, ), 32 => Instruction.new( name: :splatarray, bin: 32, # BIN(splatarray) len: 2, # insn_len expr: <<-EXPR, { obj = vm_splat_array(flag, ary); } EXPR declarations: ["MAYBE_UNUSED(VALUE) ary, flag, obj"], preamble: [], opes: [{:decl=>"VALUE flag", :type=>"VALUE", :name=>"flag"}], pops: [{:decl=>"VALUE ary", :type=>"VALUE", :name=>"ary"}], rets: [{:decl=>"VALUE obj", :type=>"VALUE", :name=>"obj"}], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: false, ), 33 => Instruction.new( name: :newhash, bin: 33, # BIN(newhash) len: 2, # insn_len expr: <<-EXPR, { RUBY_DTRACE_CREATE_HOOK(HASH, num); if (num) { val = rb_hash_new_with_size(num / 2); rb_hash_bulk_insert(num, STACK_ADDR_FROM_TOP(num), val); } else { val = rb_hash_new(); } } EXPR declarations: ["MAYBE_UNUSED(VALUE) val", "MAYBE_UNUSED(rb_num_t) num"], preamble: [], opes: [{:decl=>"rb_num_t num", :type=>"rb_num_t", :name=>"num"}], pops: [], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: false, ), 34 => Instruction.new( name: :newrange, bin: 34, # BIN(newrange) len: 2, # insn_len expr: <<-EXPR, { val = rb_range_new(low, high, (int)flag); } EXPR declarations: ["MAYBE_UNUSED(VALUE) high, low, val", "MAYBE_UNUSED(rb_num_t) flag"], preamble: [], opes: [{:decl=>"rb_num_t flag", :type=>"rb_num_t", :name=>"flag"}], pops: [{:decl=>"VALUE low", :type=>"VALUE", :name=>"low"}, {:decl=>"VALUE high", :type=>"VALUE", :name=>"high"}], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: false, ), 35 => Instruction.new( name: :pop, bin: 35, # BIN(pop) len: 1, # insn_len expr: <<-EXPR, { (void)val; /* none */ } EXPR declarations: ["MAYBE_UNUSED(VALUE) val"], preamble: [], opes: [], pops: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], rets: [], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 36 => Instruction.new( name: :dup, bin: 36, # BIN(dup) len: 1, # insn_len expr: <<-EXPR, { val1 = val2 = val; } EXPR declarations: ["MAYBE_UNUSED(VALUE) val, val1, val2"], preamble: [], opes: [], pops: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], rets: [{:decl=>"VALUE val1", :type=>"VALUE", :name=>"val1"}, {:decl=>"VALUE val2", :type=>"VALUE", :name=>"val2"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 37 => Instruction.new( name: :dupn, bin: 37, # BIN(dupn) len: 2, # insn_len expr: <<-EXPR, { void *dst = GET_SP(); void *src = STACK_ADDR_FROM_TOP(n); MEMCPY(dst, src, VALUE, n); } EXPR declarations: ["MAYBE_UNUSED(rb_num_t) n"], preamble: [], opes: [{:decl=>"rb_num_t n", :type=>"rb_num_t", :name=>"n"}], pops: [], rets: [], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 38 => Instruction.new( name: :swap, bin: 38, # BIN(swap) len: 1, # insn_len expr: <<-EXPR, { /* none */ } EXPR declarations: ["MAYBE_UNUSED(VALUE) obj, val"], preamble: [], opes: [], pops: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}, {:decl=>"VALUE obj", :type=>"VALUE", :name=>"obj"}], rets: [{:decl=>"VALUE obj", :type=>"VALUE", :name=>"obj"}, {:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 39 => Instruction.new( name: :opt_reverse, bin: 39, # BIN(opt_reverse) len: 2, # insn_len expr: <<-EXPR, { rb_num_t i; VALUE *sp = STACK_ADDR_FROM_TOP(n); for (i=0; i<n/2; i++) { VALUE v0 = sp[i]; VALUE v1 = TOPN(i); sp[i] = v1; TOPN(i) = v0; } } EXPR declarations: ["MAYBE_UNUSED(rb_num_t) n"], preamble: [], opes: [{:decl=>"rb_num_t n", :type=>"rb_num_t", :name=>"n"}], pops: [], rets: [], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 40 => Instruction.new( name: :topn, bin: 40, # BIN(topn) len: 2, # insn_len expr: <<-EXPR, { val = TOPN(n); } EXPR declarations: ["MAYBE_UNUSED(VALUE) val", "MAYBE_UNUSED(rb_num_t) n"], preamble: [], opes: [{:decl=>"rb_num_t n", :type=>"rb_num_t", :name=>"n"}], pops: [], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 41 => Instruction.new( name: :setn, bin: 41, # BIN(setn) len: 2, # insn_len expr: <<-EXPR, { TOPN(n) = val; } EXPR declarations: ["MAYBE_UNUSED(VALUE) val", "MAYBE_UNUSED(rb_num_t) n"], preamble: [], opes: [{:decl=>"rb_num_t n", :type=>"rb_num_t", :name=>"n"}], pops: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 42 => Instruction.new( name: :adjuststack, bin: 42, # BIN(adjuststack) len: 2, # insn_len expr: <<-EXPR, { /* none */ } EXPR declarations: ["MAYBE_UNUSED(rb_num_t) n"], preamble: [], opes: [{:decl=>"rb_num_t n", :type=>"rb_num_t", :name=>"n"}], pops: [], rets: [], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 43 => Instruction.new( name: :defined, bin: 43, # BIN(defined) len: 4, # insn_len expr: <<-EXPR, { val = Qnil; if (vm_defined(ec, GET_CFP(), op_type, obj, v)) { val = pushval; } } EXPR declarations: ["MAYBE_UNUSED(VALUE) obj, pushval, v, val", "MAYBE_UNUSED(rb_num_t) op_type"], preamble: [], opes: [{:decl=>"rb_num_t op_type", :type=>"rb_num_t", :name=>"op_type"}, {:decl=>"VALUE obj", :type=>"VALUE", :name=>"obj"}, {:decl=>"VALUE pushval", :type=>"VALUE", :name=>"pushval"}], pops: [{:decl=>"VALUE v", :type=>"VALUE", :name=>"v"}], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: false, ), 44 => Instruction.new( name: :checkmatch, bin: 44, # BIN(checkmatch) len: 2, # insn_len expr: <<-EXPR, { result = vm_check_match(ec, target, pattern, flag); } EXPR declarations: ["MAYBE_UNUSED(VALUE) pattern, result, target", "MAYBE_UNUSED(rb_num_t) flag"], preamble: [], opes: [{:decl=>"rb_num_t flag", :type=>"rb_num_t", :name=>"flag"}], pops: [{:decl=>"VALUE target", :type=>"VALUE", :name=>"target"}, {:decl=>"VALUE pattern", :type=>"VALUE", :name=>"pattern"}], rets: [{:decl=>"VALUE result", :type=>"VALUE", :name=>"result"}], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: false, ), 45 => Instruction.new( name: :checkkeyword, bin: 45, # BIN(checkkeyword) len: 3, # insn_len expr: <<-EXPR, { ret = vm_check_keyword(kw_bits_index, keyword_index, GET_EP()); } EXPR declarations: ["MAYBE_UNUSED(VALUE) ret", "MAYBE_UNUSED(lindex_t) keyword_index, kw_bits_index"], preamble: [], opes: [{:decl=>"lindex_t kw_bits_index", :type=>"lindex_t", :name=>"kw_bits_index"}, {:decl=>"lindex_t keyword_index", :type=>"lindex_t", :name=>"keyword_index"}], pops: [], rets: [{:decl=>"VALUE ret", :type=>"VALUE", :name=>"ret"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 46 => Instruction.new( name: :checktype, bin: 46, # BIN(checktype) len: 2, # insn_len expr: <<-EXPR, { ret = RBOOL(TYPE(val) == (int)type); } EXPR declarations: ["MAYBE_UNUSED(VALUE) ret, val", "MAYBE_UNUSED(rb_num_t) type"], preamble: [], opes: [{:decl=>"rb_num_t type", :type=>"rb_num_t", :name=>"type"}], pops: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], rets: [{:decl=>"VALUE ret", :type=>"VALUE", :name=>"ret"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 47 => Instruction.new( name: :defineclass, bin: 47, # BIN(defineclass) len: 4, # insn_len expr: <<-EXPR, { VALUE klass = vm_find_or_create_class_by_id(id, flags, cbase, super); rb_iseq_check(class_iseq); /* enter scope */ vm_push_frame(ec, class_iseq, VM_FRAME_MAGIC_CLASS | VM_ENV_FLAG_LOCAL, klass, GET_BLOCK_HANDLER(), (VALUE)vm_cref_push(ec, klass, NULL, FALSE, FALSE), ISEQ_BODY(class_iseq)->iseq_encoded, GET_SP(), ISEQ_BODY(class_iseq)->local_table_size, ISEQ_BODY(class_iseq)->stack_max); RESTORE_REGS(); NEXT_INSN(); } EXPR declarations: ["MAYBE_UNUSED(ID) id", "MAYBE_UNUSED(ISEQ) class_iseq", "MAYBE_UNUSED(VALUE) cbase, super, val", "MAYBE_UNUSED(rb_num_t) flags"], preamble: [], opes: [{:decl=>"ID id", :type=>"ID", :name=>"id"}, {:decl=>"ISEQ class_iseq", :type=>"ISEQ", :name=>"class_iseq"}, {:decl=>"rb_num_t flags", :type=>"rb_num_t", :name=>"flags"}], pops: [{:decl=>"VALUE cbase", :type=>"VALUE", :name=>"cbase"}, {:decl=>"VALUE super", :type=>"VALUE", :name=>"super"}], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: true, ), 48 => Instruction.new( name: :definemethod, bin: 48, # BIN(definemethod) len: 3, # insn_len expr: <<-EXPR, { vm_define_method(ec, Qnil, id, (VALUE)iseq, FALSE); } EXPR declarations: ["MAYBE_UNUSED(ID) id", "MAYBE_UNUSED(ISEQ) iseq"], preamble: [], opes: [{:decl=>"ID id", :type=>"ID", :name=>"id"}, {:decl=>"ISEQ iseq", :type=>"ISEQ", :name=>"iseq"}], pops: [], rets: [], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: true, ), 49 => Instruction.new( name: :definesmethod, bin: 49, # BIN(definesmethod) len: 3, # insn_len expr: <<-EXPR, { vm_define_method(ec, obj, id, (VALUE)iseq, TRUE); } EXPR declarations: ["MAYBE_UNUSED(ID) id", "MAYBE_UNUSED(ISEQ) iseq", "MAYBE_UNUSED(VALUE) obj"], preamble: [], opes: [{:decl=>"ID id", :type=>"ID", :name=>"id"}, {:decl=>"ISEQ iseq", :type=>"ISEQ", :name=>"iseq"}], pops: [{:decl=>"VALUE obj", :type=>"VALUE", :name=>"obj"}], rets: [], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: true, ), 50 => Instruction.new( name: :send, bin: 50, # BIN(send) len: 3, # insn_len expr: <<-EXPR, { VALUE bh = vm_caller_setup_arg_block(ec, GET_CFP(), cd->ci, blockiseq, false); val = vm_sendish(ec, GET_CFP(), cd, bh, mexp_search_method); if (val == Qundef) { RESTORE_REGS(); NEXT_INSN(); } } EXPR declarations: ["MAYBE_UNUSED(CALL_DATA) cd", "MAYBE_UNUSED(ISEQ) blockiseq", "MAYBE_UNUSED(VALUE) val"], preamble: [], opes: [{:decl=>"CALL_DATA cd", :type=>"CALL_DATA", :name=>"cd"}, {:decl=>"ISEQ blockiseq", :type=>"ISEQ", :name=>"blockiseq"}], pops: [], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: true, ), 51 => Instruction.new( name: :opt_send_without_block, bin: 51, # BIN(opt_send_without_block) len: 2, # insn_len expr: <<-EXPR, { VALUE bh = VM_BLOCK_HANDLER_NONE; val = vm_sendish(ec, GET_CFP(), cd, bh, mexp_search_method); if (val == Qundef) { RESTORE_REGS(); NEXT_INSN(); } } EXPR declarations: ["MAYBE_UNUSED(CALL_DATA) cd", "MAYBE_UNUSED(VALUE) val"], preamble: [], opes: [{:decl=>"CALL_DATA cd", :type=>"CALL_DATA", :name=>"cd"}], pops: [], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: true, ), 52 => Instruction.new( name: :objtostring, bin: 52, # BIN(objtostring) len: 2, # insn_len expr: <<-EXPR, { val = vm_objtostring(GET_ISEQ(), recv, cd); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } EXPR declarations: ["MAYBE_UNUSED(CALL_DATA) cd", "MAYBE_UNUSED(VALUE) recv, val"], preamble: [], opes: [{:decl=>"CALL_DATA cd", :type=>"CALL_DATA", :name=>"cd"}], pops: [{:decl=>"VALUE recv", :type=>"VALUE", :name=>"recv"}], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: false, ), 53 => Instruction.new( name: :opt_str_freeze, bin: 53, # BIN(opt_str_freeze) len: 3, # insn_len expr: <<-EXPR, { val = vm_opt_str_freeze(str, BOP_FREEZE, idFreeze); if (val == Qundef) { PUSH(rb_str_resurrect(str)); CALL_SIMPLE_METHOD(); } } EXPR declarations: ["MAYBE_UNUSED(CALL_DATA) cd", "MAYBE_UNUSED(VALUE) str, val"], preamble: [], opes: [{:decl=>"VALUE str", :type=>"VALUE", :name=>"str"}, {:decl=>"CALL_DATA cd", :type=>"CALL_DATA", :name=>"cd"}], pops: [], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 54 => Instruction.new( name: :opt_nil_p, bin: 54, # BIN(opt_nil_p) len: 2, # insn_len expr: <<-EXPR, { val = vm_opt_nil_p(GET_ISEQ(), cd, recv); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } EXPR declarations: ["MAYBE_UNUSED(CALL_DATA) cd", "MAYBE_UNUSED(VALUE) recv, val"], preamble: [], opes: [{:decl=>"CALL_DATA cd", :type=>"CALL_DATA", :name=>"cd"}], pops: [{:decl=>"VALUE recv", :type=>"VALUE", :name=>"recv"}], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 55 => Instruction.new( name: :opt_str_uminus, bin: 55, # BIN(opt_str_uminus) len: 3, # insn_len expr: <<-EXPR, { val = vm_opt_str_freeze(str, BOP_UMINUS, idUMinus); if (val == Qundef) { PUSH(rb_str_resurrect(str)); CALL_SIMPLE_METHOD(); } } EXPR declarations: ["MAYBE_UNUSED(CALL_DATA) cd", "MAYBE_UNUSED(VALUE) str, val"], preamble: [], opes: [{:decl=>"VALUE str", :type=>"VALUE", :name=>"str"}, {:decl=>"CALL_DATA cd", :type=>"CALL_DATA", :name=>"cd"}], pops: [], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 56 => Instruction.new( name: :opt_newarray_max, bin: 56, # BIN(opt_newarray_max) len: 2, # insn_len expr: <<-EXPR, { val = vm_opt_newarray_max(ec, num, STACK_ADDR_FROM_TOP(num)); } EXPR declarations: ["MAYBE_UNUSED(VALUE) val", "MAYBE_UNUSED(rb_num_t) num"], preamble: [], opes: [{:decl=>"rb_num_t num", :type=>"rb_num_t", :name=>"num"}], pops: [], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: false, ), 57 => Instruction.new( name: :opt_newarray_min, bin: 57, # BIN(opt_newarray_min) len: 2, # insn_len expr: <<-EXPR, { val = vm_opt_newarray_min(ec, num, STACK_ADDR_FROM_TOP(num)); } EXPR declarations: ["MAYBE_UNUSED(VALUE) val", "MAYBE_UNUSED(rb_num_t) num"], preamble: [], opes: [{:decl=>"rb_num_t num", :type=>"rb_num_t", :name=>"num"}], pops: [], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: false, ), 58 => Instruction.new( name: :invokesuper, bin: 58, # BIN(invokesuper) len: 3, # insn_len expr: <<-EXPR, { VALUE bh = vm_caller_setup_arg_block(ec, GET_CFP(), cd->ci, blockiseq, true); val = vm_sendish(ec, GET_CFP(), cd, bh, mexp_search_super); if (val == Qundef) { RESTORE_REGS(); NEXT_INSN(); } } EXPR declarations: ["MAYBE_UNUSED(CALL_DATA) cd", "MAYBE_UNUSED(ISEQ) blockiseq", "MAYBE_UNUSED(VALUE) val"], preamble: [], opes: [{:decl=>"CALL_DATA cd", :type=>"CALL_DATA", :name=>"cd"}, {:decl=>"ISEQ blockiseq", :type=>"ISEQ", :name=>"blockiseq"}], pops: [], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: true, ), 59 => Instruction.new( name: :invokeblock, bin: 59, # BIN(invokeblock) len: 2, # insn_len expr: <<-EXPR, { VALUE bh = VM_BLOCK_HANDLER_NONE; val = vm_sendish(ec, GET_CFP(), cd, bh, mexp_search_invokeblock); if (val == Qundef) { RESTORE_REGS(); NEXT_INSN(); } } EXPR declarations: ["MAYBE_UNUSED(CALL_DATA) cd", "MAYBE_UNUSED(VALUE) val"], preamble: [], opes: [{:decl=>"CALL_DATA cd", :type=>"CALL_DATA", :name=>"cd"}], pops: [], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: true, ), 60 => Instruction.new( name: :leave, bin: 60, # BIN(leave) len: 1, # insn_len expr: <<-EXPR, { 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(); } } EXPR declarations: ["MAYBE_UNUSED(VALUE) val"], preamble: [], opes: [], pops: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: true, ), 61 => Instruction.new( name: :throw, bin: 61, # BIN(throw) len: 2, # insn_len expr: <<-EXPR, { val = vm_throw(ec, GET_CFP(), throw_state, throwobj); THROW_EXCEPTION(val); /* unreachable */ } EXPR declarations: ["MAYBE_UNUSED(VALUE) throwobj, val", "MAYBE_UNUSED(rb_num_t) throw_state"], preamble: [], opes: [{:decl=>"rb_num_t throw_state", :type=>"rb_num_t", :name=>"throw_state"}], pops: [{:decl=>"VALUE throwobj", :type=>"VALUE", :name=>"throwobj"}], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: false, ), 62 => Instruction.new( name: :jump, bin: 62, # BIN(jump) len: 2, # insn_len expr: <<-EXPR, { RUBY_VM_CHECK_INTS(ec); JUMP(dst); } EXPR declarations: ["MAYBE_UNUSED(OFFSET) dst"], preamble: [], opes: [{:decl=>"OFFSET dst", :type=>"OFFSET", :name=>"dst"}], pops: [], rets: [], always_leaf?: false, leaf_without_check_ints?: true, handles_sp?: false, ), 63 => Instruction.new( name: :branchif, bin: 63, # BIN(branchif) len: 2, # insn_len expr: <<-EXPR, { if (RTEST(val)) { RUBY_VM_CHECK_INTS(ec); JUMP(dst); } } EXPR declarations: ["MAYBE_UNUSED(OFFSET) dst", "MAYBE_UNUSED(VALUE) val"], preamble: [], opes: [{:decl=>"OFFSET dst", :type=>"OFFSET", :name=>"dst"}], pops: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], rets: [], always_leaf?: false, leaf_without_check_ints?: true, handles_sp?: false, ), 64 => Instruction.new( name: :branchunless, bin: 64, # BIN(branchunless) len: 2, # insn_len expr: <<-EXPR, { if (!RTEST(val)) { RUBY_VM_CHECK_INTS(ec); JUMP(dst); } } EXPR declarations: ["MAYBE_UNUSED(OFFSET) dst", "MAYBE_UNUSED(VALUE) val"], preamble: [], opes: [{:decl=>"OFFSET dst", :type=>"OFFSET", :name=>"dst"}], pops: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], rets: [], always_leaf?: false, leaf_without_check_ints?: true, handles_sp?: false, ), 65 => Instruction.new( name: :branchnil, bin: 65, # BIN(branchnil) len: 2, # insn_len expr: <<-EXPR, { if (NIL_P(val)) { RUBY_VM_CHECK_INTS(ec); JUMP(dst); } } EXPR declarations: ["MAYBE_UNUSED(OFFSET) dst", "MAYBE_UNUSED(VALUE) val"], preamble: [], opes: [{:decl=>"OFFSET dst", :type=>"OFFSET", :name=>"dst"}], pops: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], rets: [], always_leaf?: false, leaf_without_check_ints?: true, handles_sp?: false, ), 66 => Instruction.new( name: :once, bin: 66, # BIN(once) len: 3, # insn_len expr: <<-EXPR, { val = vm_once_dispatch(ec, iseq, ise); } EXPR declarations: ["MAYBE_UNUSED(ISE) ise", "MAYBE_UNUSED(ISEQ) iseq", "MAYBE_UNUSED(VALUE) val"], preamble: [], opes: [{:decl=>"ISEQ iseq", :type=>"ISEQ", :name=>"iseq"}, {:decl=>"ISE ise", :type=>"ISE", :name=>"ise"}], pops: [], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: true, ), 67 => Instruction.new( name: :opt_case_dispatch, bin: 67, # BIN(opt_case_dispatch) len: 3, # insn_len expr: <<-EXPR, { OFFSET dst = vm_case_dispatch(hash, else_offset, key); if (dst) { JUMP(dst); } } EXPR declarations: ["MAYBE_UNUSED(CDHASH) hash", "MAYBE_UNUSED(OFFSET) else_offset", "MAYBE_UNUSED(VALUE) key"], preamble: [], opes: [{:decl=>"CDHASH hash", :type=>"CDHASH", :name=>"hash"}, {:decl=>"OFFSET else_offset", :type=>"OFFSET", :name=>"else_offset"}], pops: [{:decl=>"VALUE key", :type=>"VALUE", :name=>"key"}], rets: [], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 68 => Instruction.new( name: :opt_plus, bin: 68, # BIN(opt_plus) len: 2, # insn_len expr: <<-EXPR, { val = vm_opt_plus(recv, obj); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } EXPR declarations: ["MAYBE_UNUSED(CALL_DATA) cd", "MAYBE_UNUSED(VALUE) obj, recv, val"], preamble: [], opes: [{:decl=>"CALL_DATA cd", :type=>"CALL_DATA", :name=>"cd"}], pops: [{:decl=>"VALUE recv", :type=>"VALUE", :name=>"recv"}, {:decl=>"VALUE obj", :type=>"VALUE", :name=>"obj"}], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 69 => Instruction.new( name: :opt_minus, bin: 69, # BIN(opt_minus) len: 2, # insn_len expr: <<-EXPR, { val = vm_opt_minus(recv, obj); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } EXPR declarations: ["MAYBE_UNUSED(CALL_DATA) cd", "MAYBE_UNUSED(VALUE) obj, recv, val"], preamble: [], opes: [{:decl=>"CALL_DATA cd", :type=>"CALL_DATA", :name=>"cd"}], pops: [{:decl=>"VALUE recv", :type=>"VALUE", :name=>"recv"}, {:decl=>"VALUE obj", :type=>"VALUE", :name=>"obj"}], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 70 => Instruction.new( name: :opt_mult, bin: 70, # BIN(opt_mult) len: 2, # insn_len expr: <<-EXPR, { val = vm_opt_mult(recv, obj); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } EXPR declarations: ["MAYBE_UNUSED(CALL_DATA) cd", "MAYBE_UNUSED(VALUE) obj, recv, val"], preamble: [], opes: [{:decl=>"CALL_DATA cd", :type=>"CALL_DATA", :name=>"cd"}], pops: [{:decl=>"VALUE recv", :type=>"VALUE", :name=>"recv"}, {:decl=>"VALUE obj", :type=>"VALUE", :name=>"obj"}], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 71 => Instruction.new( name: :opt_div, bin: 71, # BIN(opt_div) len: 2, # insn_len expr: <<-EXPR, { val = vm_opt_div(recv, obj); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } EXPR declarations: ["MAYBE_UNUSED(CALL_DATA) cd", "MAYBE_UNUSED(VALUE) obj, recv, val"], preamble: [], opes: [{:decl=>"CALL_DATA cd", :type=>"CALL_DATA", :name=>"cd"}], pops: [{:decl=>"VALUE recv", :type=>"VALUE", :name=>"recv"}, {:decl=>"VALUE obj", :type=>"VALUE", :name=>"obj"}], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: false, ), 72 => Instruction.new( name: :opt_mod, bin: 72, # BIN(opt_mod) len: 2, # insn_len expr: <<-EXPR, { val = vm_opt_mod(recv, obj); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } EXPR declarations: ["MAYBE_UNUSED(CALL_DATA) cd", "MAYBE_UNUSED(VALUE) obj, recv, val"], preamble: [], opes: [{:decl=>"CALL_DATA cd", :type=>"CALL_DATA", :name=>"cd"}], pops: [{:decl=>"VALUE recv", :type=>"VALUE", :name=>"recv"}, {:decl=>"VALUE obj", :type=>"VALUE", :name=>"obj"}], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: false, ), 73 => Instruction.new( name: :opt_eq, bin: 73, # BIN(opt_eq) len: 2, # insn_len expr: <<-EXPR, { val = opt_equality(GET_ISEQ(), recv, obj, cd); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } EXPR declarations: ["MAYBE_UNUSED(CALL_DATA) cd", "MAYBE_UNUSED(VALUE) obj, recv, val"], preamble: [], opes: [{:decl=>"CALL_DATA cd", :type=>"CALL_DATA", :name=>"cd"}], pops: [{:decl=>"VALUE recv", :type=>"VALUE", :name=>"recv"}, {:decl=>"VALUE obj", :type=>"VALUE", :name=>"obj"}], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 74 => Instruction.new( name: :opt_neq, bin: 74, # BIN(opt_neq) len: 3, # insn_len expr: <<-EXPR, { val = vm_opt_neq(GET_ISEQ(), cd, cd_eq, recv, obj); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } EXPR declarations: ["MAYBE_UNUSED(CALL_DATA) cd, cd_eq", "MAYBE_UNUSED(VALUE) obj, recv, val"], preamble: [], opes: [{:decl=>"CALL_DATA cd_eq", :type=>"CALL_DATA", :name=>"cd_eq"}, {:decl=>"CALL_DATA cd", :type=>"CALL_DATA", :name=>"cd"}], pops: [{:decl=>"VALUE recv", :type=>"VALUE", :name=>"recv"}, {:decl=>"VALUE obj", :type=>"VALUE", :name=>"obj"}], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 75 => Instruction.new( name: :opt_lt, bin: 75, # BIN(opt_lt) len: 2, # insn_len expr: <<-EXPR, { val = vm_opt_lt(recv, obj); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } EXPR declarations: ["MAYBE_UNUSED(CALL_DATA) cd", "MAYBE_UNUSED(VALUE) obj, recv, val"], preamble: [], opes: [{:decl=>"CALL_DATA cd", :type=>"CALL_DATA", :name=>"cd"}], pops: [{:decl=>"VALUE recv", :type=>"VALUE", :name=>"recv"}, {:decl=>"VALUE obj", :type=>"VALUE", :name=>"obj"}], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 76 => Instruction.new( name: :opt_le, bin: 76, # BIN(opt_le) len: 2, # insn_len expr: <<-EXPR, { val = vm_opt_le(recv, obj); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } EXPR declarations: ["MAYBE_UNUSED(CALL_DATA) cd", "MAYBE_UNUSED(VALUE) obj, recv, val"], preamble: [], opes: [{:decl=>"CALL_DATA cd", :type=>"CALL_DATA", :name=>"cd"}], pops: [{:decl=>"VALUE recv", :type=>"VALUE", :name=>"recv"}, {:decl=>"VALUE obj", :type=>"VALUE", :name=>"obj"}], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 77 => Instruction.new( name: :opt_gt, bin: 77, # BIN(opt_gt) len: 2, # insn_len expr: <<-EXPR, { val = vm_opt_gt(recv, obj); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } EXPR declarations: ["MAYBE_UNUSED(CALL_DATA) cd", "MAYBE_UNUSED(VALUE) obj, recv, val"], preamble: [], opes: [{:decl=>"CALL_DATA cd", :type=>"CALL_DATA", :name=>"cd"}], pops: [{:decl=>"VALUE recv", :type=>"VALUE", :name=>"recv"}, {:decl=>"VALUE obj", :type=>"VALUE", :name=>"obj"}], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 78 => Instruction.new( name: :opt_ge, bin: 78, # BIN(opt_ge) len: 2, # insn_len expr: <<-EXPR, { val = vm_opt_ge(recv, obj); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } EXPR declarations: ["MAYBE_UNUSED(CALL_DATA) cd", "MAYBE_UNUSED(VALUE) obj, recv, val"], preamble: [], opes: [{:decl=>"CALL_DATA cd", :type=>"CALL_DATA", :name=>"cd"}], pops: [{:decl=>"VALUE recv", :type=>"VALUE", :name=>"recv"}, {:decl=>"VALUE obj", :type=>"VALUE", :name=>"obj"}], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 79 => Instruction.new( name: :opt_ltlt, bin: 79, # BIN(opt_ltlt) len: 2, # insn_len expr: <<-EXPR, { val = vm_opt_ltlt(recv, obj); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } EXPR declarations: ["MAYBE_UNUSED(CALL_DATA) cd", "MAYBE_UNUSED(VALUE) obj, recv, val"], preamble: [], opes: [{:decl=>"CALL_DATA cd", :type=>"CALL_DATA", :name=>"cd"}], pops: [{:decl=>"VALUE recv", :type=>"VALUE", :name=>"recv"}, {:decl=>"VALUE obj", :type=>"VALUE", :name=>"obj"}], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: false, ), 80 => Instruction.new( name: :opt_and, bin: 80, # BIN(opt_and) len: 2, # insn_len expr: <<-EXPR, { val = vm_opt_and(recv, obj); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } EXPR declarations: ["MAYBE_UNUSED(CALL_DATA) cd", "MAYBE_UNUSED(VALUE) obj, recv, val"], preamble: [], opes: [{:decl=>"CALL_DATA cd", :type=>"CALL_DATA", :name=>"cd"}], pops: [{:decl=>"VALUE recv", :type=>"VALUE", :name=>"recv"}, {:decl=>"VALUE obj", :type=>"VALUE", :name=>"obj"}], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 81 => Instruction.new( name: :opt_or, bin: 81, # BIN(opt_or) len: 2, # insn_len expr: <<-EXPR, { val = vm_opt_or(recv, obj); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } EXPR declarations: ["MAYBE_UNUSED(CALL_DATA) cd", "MAYBE_UNUSED(VALUE) obj, recv, val"], preamble: [], opes: [{:decl=>"CALL_DATA cd", :type=>"CALL_DATA", :name=>"cd"}], pops: [{:decl=>"VALUE recv", :type=>"VALUE", :name=>"recv"}, {:decl=>"VALUE obj", :type=>"VALUE", :name=>"obj"}], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 82 => Instruction.new( name: :opt_aref, bin: 82, # BIN(opt_aref) len: 2, # insn_len expr: <<-EXPR, { val = vm_opt_aref(recv, obj); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } EXPR declarations: ["MAYBE_UNUSED(CALL_DATA) cd", "MAYBE_UNUSED(VALUE) obj, recv, val"], preamble: [], opes: [{:decl=>"CALL_DATA cd", :type=>"CALL_DATA", :name=>"cd"}], pops: [{:decl=>"VALUE recv", :type=>"VALUE", :name=>"recv"}, {:decl=>"VALUE obj", :type=>"VALUE", :name=>"obj"}], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: false, ), 83 => Instruction.new( name: :opt_aset, bin: 83, # BIN(opt_aset) len: 2, # insn_len expr: <<-EXPR, { val = vm_opt_aset(recv, obj, set); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } EXPR declarations: ["MAYBE_UNUSED(CALL_DATA) cd", "MAYBE_UNUSED(VALUE) obj, recv, set, val"], preamble: [], opes: [{:decl=>"CALL_DATA cd", :type=>"CALL_DATA", :name=>"cd"}], pops: [{:decl=>"VALUE recv", :type=>"VALUE", :name=>"recv"}, {:decl=>"VALUE obj", :type=>"VALUE", :name=>"obj"}, {:decl=>"VALUE set", :type=>"VALUE", :name=>"set"}], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: false, ), 84 => Instruction.new( name: :opt_aset_with, bin: 84, # BIN(opt_aset_with) len: 3, # insn_len expr: <<-EXPR, { 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(); } } EXPR declarations: ["MAYBE_UNUSED(CALL_DATA) cd", "MAYBE_UNUSED(VALUE) key, recv, val"], preamble: [], opes: [{:decl=>"VALUE key", :type=>"VALUE", :name=>"key"}, {:decl=>"CALL_DATA cd", :type=>"CALL_DATA", :name=>"cd"}], pops: [{:decl=>"VALUE recv", :type=>"VALUE", :name=>"recv"}, {:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: false, ), 85 => Instruction.new( name: :opt_aref_with, bin: 85, # BIN(opt_aref_with) len: 3, # insn_len expr: <<-EXPR, { val = vm_opt_aref_with(recv, key); if (val == Qundef) { #ifndef MJIT_HEADER PUSH(rb_str_resurrect(key)); #endif CALL_SIMPLE_METHOD(); } } EXPR declarations: ["MAYBE_UNUSED(CALL_DATA) cd", "MAYBE_UNUSED(VALUE) key, recv, val"], preamble: [], opes: [{:decl=>"VALUE key", :type=>"VALUE", :name=>"key"}, {:decl=>"CALL_DATA cd", :type=>"CALL_DATA", :name=>"cd"}], pops: [{:decl=>"VALUE recv", :type=>"VALUE", :name=>"recv"}], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: false, ), 86 => Instruction.new( name: :opt_length, bin: 86, # BIN(opt_length) len: 2, # insn_len expr: <<-EXPR, { val = vm_opt_length(recv, BOP_LENGTH); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } EXPR declarations: ["MAYBE_UNUSED(CALL_DATA) cd", "MAYBE_UNUSED(VALUE) recv, val"], preamble: [], opes: [{:decl=>"CALL_DATA cd", :type=>"CALL_DATA", :name=>"cd"}], pops: [{:decl=>"VALUE recv", :type=>"VALUE", :name=>"recv"}], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 87 => Instruction.new( name: :opt_size, bin: 87, # BIN(opt_size) len: 2, # insn_len expr: <<-EXPR, { val = vm_opt_length(recv, BOP_SIZE); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } EXPR declarations: ["MAYBE_UNUSED(CALL_DATA) cd", "MAYBE_UNUSED(VALUE) recv, val"], preamble: [], opes: [{:decl=>"CALL_DATA cd", :type=>"CALL_DATA", :name=>"cd"}], pops: [{:decl=>"VALUE recv", :type=>"VALUE", :name=>"recv"}], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 88 => Instruction.new( name: :opt_empty_p, bin: 88, # BIN(opt_empty_p) len: 2, # insn_len expr: <<-EXPR, { val = vm_opt_empty_p(recv); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } EXPR declarations: ["MAYBE_UNUSED(CALL_DATA) cd", "MAYBE_UNUSED(VALUE) recv, val"], preamble: [], opes: [{:decl=>"CALL_DATA cd", :type=>"CALL_DATA", :name=>"cd"}], pops: [{:decl=>"VALUE recv", :type=>"VALUE", :name=>"recv"}], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 89 => Instruction.new( name: :opt_succ, bin: 89, # BIN(opt_succ) len: 2, # insn_len expr: <<-EXPR, { val = vm_opt_succ(recv); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } EXPR declarations: ["MAYBE_UNUSED(CALL_DATA) cd", "MAYBE_UNUSED(VALUE) recv, val"], preamble: [], opes: [{:decl=>"CALL_DATA cd", :type=>"CALL_DATA", :name=>"cd"}], pops: [{:decl=>"VALUE recv", :type=>"VALUE", :name=>"recv"}], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 90 => Instruction.new( name: :opt_not, bin: 90, # BIN(opt_not) len: 2, # insn_len expr: <<-EXPR, { val = vm_opt_not(GET_ISEQ(), cd, recv); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } EXPR declarations: ["MAYBE_UNUSED(CALL_DATA) cd", "MAYBE_UNUSED(VALUE) recv, val"], preamble: [], opes: [{:decl=>"CALL_DATA cd", :type=>"CALL_DATA", :name=>"cd"}], pops: [{:decl=>"VALUE recv", :type=>"VALUE", :name=>"recv"}], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 91 => Instruction.new( name: :opt_regexpmatch2, bin: 91, # BIN(opt_regexpmatch2) len: 2, # insn_len expr: <<-EXPR, { val = vm_opt_regexpmatch2(obj2, obj1); if (val == Qundef) { CALL_SIMPLE_METHOD(); } } EXPR declarations: ["MAYBE_UNUSED(CALL_DATA) cd", "MAYBE_UNUSED(VALUE) obj1, obj2, val"], preamble: [], opes: [{:decl=>"CALL_DATA cd", :type=>"CALL_DATA", :name=>"cd"}], pops: [{:decl=>"VALUE obj2", :type=>"VALUE", :name=>"obj2"}, {:decl=>"VALUE obj1", :type=>"VALUE", :name=>"obj1"}], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: false, ), 92 => Instruction.new( name: :invokebuiltin, bin: 92, # BIN(invokebuiltin) len: 2, # insn_len expr: <<-EXPR, { val = vm_invoke_builtin(ec, reg_cfp, bf, STACK_ADDR_FROM_TOP(bf->argc)); } EXPR declarations: ["MAYBE_UNUSED(RB_BUILTIN) bf", "MAYBE_UNUSED(VALUE) val"], preamble: [], opes: [{:decl=>"RB_BUILTIN bf", :type=>"RB_BUILTIN", :name=>"bf"}], pops: [], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: false, ), 93 => Instruction.new( name: :opt_invokebuiltin_delegate, bin: 93, # BIN(opt_invokebuiltin_delegate) len: 3, # insn_len expr: <<-EXPR, { val = vm_invoke_builtin_delegate(ec, reg_cfp, bf, (unsigned int)index); } EXPR declarations: ["MAYBE_UNUSED(RB_BUILTIN) bf", "MAYBE_UNUSED(VALUE) val", "MAYBE_UNUSED(rb_num_t) index"], preamble: [], opes: [{:decl=>"RB_BUILTIN bf", :type=>"RB_BUILTIN", :name=>"bf"}, {:decl=>"rb_num_t index", :type=>"rb_num_t", :name=>"index"}], pops: [], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: false, ), 94 => Instruction.new( name: :opt_invokebuiltin_delegate_leave, bin: 94, # BIN(opt_invokebuiltin_delegate_leave) len: 3, # insn_len expr: <<-EXPR, { val = vm_invoke_builtin_delegate(ec, reg_cfp, bf, (unsigned int)index); /* leave fastpath */ /* TracePoint/return fallbacks 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(); } } EXPR declarations: ["MAYBE_UNUSED(RB_BUILTIN) bf", "MAYBE_UNUSED(VALUE) val", "MAYBE_UNUSED(rb_num_t) index"], preamble: [], opes: [{:decl=>"RB_BUILTIN bf", :type=>"RB_BUILTIN", :name=>"bf"}, {:decl=>"rb_num_t index", :type=>"rb_num_t", :name=>"index"}], pops: [], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: false, leaf_without_check_ints?: false, handles_sp?: false, ), 95 => Instruction.new( name: :getlocal_WC_0, bin: 95, # BIN(getlocal_WC_0) len: 2, # insn_len expr: <<-EXPR, { 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); } EXPR declarations: ["MAYBE_UNUSED(VALUE) val", "MAYBE_UNUSED(lindex_t) idx", "MAYBE_UNUSED(rb_num_t) level"], preamble: [" const rb_num_t level = 0;"], opes: [{:decl=>"lindex_t idx", :type=>"lindex_t", :name=>"idx"}], pops: [], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 96 => Instruction.new( name: :getlocal_WC_1, bin: 96, # BIN(getlocal_WC_1) len: 2, # insn_len expr: <<-EXPR, { 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); } EXPR declarations: ["MAYBE_UNUSED(VALUE) val", "MAYBE_UNUSED(lindex_t) idx", "MAYBE_UNUSED(rb_num_t) level"], preamble: [" const rb_num_t level = 1;"], opes: [{:decl=>"lindex_t idx", :type=>"lindex_t", :name=>"idx"}], pops: [], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 97 => Instruction.new( name: :setlocal_WC_0, bin: 97, # BIN(setlocal_WC_0) len: 2, # insn_len expr: <<-EXPR, { 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); } EXPR declarations: ["MAYBE_UNUSED(VALUE) val", "MAYBE_UNUSED(lindex_t) idx", "MAYBE_UNUSED(rb_num_t) level"], preamble: [" const rb_num_t level = 0;"], opes: [{:decl=>"lindex_t idx", :type=>"lindex_t", :name=>"idx"}], pops: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], rets: [], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 98 => Instruction.new( name: :setlocal_WC_1, bin: 98, # BIN(setlocal_WC_1) len: 2, # insn_len expr: <<-EXPR, { 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); } EXPR declarations: ["MAYBE_UNUSED(VALUE) val", "MAYBE_UNUSED(lindex_t) idx", "MAYBE_UNUSED(rb_num_t) level"], preamble: [" const rb_num_t level = 1;"], opes: [{:decl=>"lindex_t idx", :type=>"lindex_t", :name=>"idx"}], pops: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], rets: [], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 99 => Instruction.new( name: :putobject_INT2FIX_0_, bin: 99, # BIN(putobject_INT2FIX_0_) len: 1, # insn_len expr: <<-EXPR, { /* */ } EXPR declarations: ["MAYBE_UNUSED(VALUE) val"], preamble: [" const VALUE val = INT2FIX(0);"], opes: [], pops: [], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), 100 => Instruction.new( name: :putobject_INT2FIX_1_, bin: 100, # BIN(putobject_INT2FIX_1_) len: 1, # insn_len expr: <<-EXPR, { /* */ } EXPR declarations: ["MAYBE_UNUSED(VALUE) val"], preamble: [" const VALUE val = INT2FIX(1);"], opes: [], pops: [], rets: [{:decl=>"VALUE val", :type=>"VALUE", :name=>"val"}], always_leaf?: true, leaf_without_check_ints?: false, handles_sp?: false, ), } private_constant(*constants) end