/* -*-c-*- *********************************************************/ /*******************************************************************/ /*******************************************************************/ /** 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 'insns.c' */ INSN_ENTRY(nop){ { DEBUG_ENTER_INSN("nop"); ADD_PC(1+0); PREFETCH(GET_PC()); #define CURRENT_INSN_nop 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_nop_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(nop)); { #line 40 "insns.def" /* none */ #line 32 "vm.inc" #undef CURRENT_INSN_nop #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(nop);}}} INSN_ENTRY(getlocal){ { VALUE val; lindex_t idx = (lindex_t)GET_OPERAND(1); DEBUG_ENTER_INSN("getlocal"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_getlocal 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_getlocal_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(getlocal)); USAGE_ANALYSIS_OPERAND(BIN(getlocal), 0, idx); { #line 58 "insns.def" val = *(GET_LFP() - idx); #line 56 "vm.inc" PUSH(val); #undef CURRENT_INSN_getlocal #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(getlocal);}}} INSN_ENTRY(setlocal){ { lindex_t idx = (lindex_t)GET_OPERAND(1); VALUE val = TOPN(0); DEBUG_ENTER_INSN("setlocal"); ADD_PC(1+1); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_setlocal 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_setlocal_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(setlocal)); USAGE_ANALYSIS_OPERAND(BIN(setlocal), 0, idx); { #line 72 "insns.def" (*(GET_LFP() - idx)) = val; #line 81 "vm.inc" #undef CURRENT_INSN_setlocal #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(setlocal);}}} INSN_ENTRY(getspecial){ { VALUE val; rb_num_t type = (rb_num_t)GET_OPERAND(2); VALUE key = (VALUE)GET_OPERAND(1); DEBUG_ENTER_INSN("getspecial"); ADD_PC(1+2); PREFETCH(GET_PC()); #define CURRENT_INSN_getspecial 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_getspecial_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(getspecial)); USAGE_ANALYSIS_OPERAND(BIN(getspecial), 0, key); USAGE_ANALYSIS_OPERAND(BIN(getspecial), 1, type); { #line 86 "insns.def" val = vm_getspecial(th, GET_LFP(), key, type); #line 107 "vm.inc" PUSH(val); #undef CURRENT_INSN_getspecial #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(getspecial);}}} INSN_ENTRY(setspecial){ { VALUE key = (VALUE)GET_OPERAND(1); VALUE obj = TOPN(0); DEBUG_ENTER_INSN("setspecial"); ADD_PC(1+1); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_setspecial 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_setspecial_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(setspecial)); USAGE_ANALYSIS_OPERAND(BIN(setspecial), 0, key); { #line 100 "insns.def" lfp_svar_set(th, GET_LFP(), key, obj); #line 132 "vm.inc" #undef CURRENT_INSN_setspecial #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(setspecial);}}} INSN_ENTRY(getdynamic){ { VALUE val; rb_num_t level = (rb_num_t)GET_OPERAND(2); dindex_t idx = (dindex_t)GET_OPERAND(1); DEBUG_ENTER_INSN("getdynamic"); ADD_PC(1+2); PREFETCH(GET_PC()); #define CURRENT_INSN_getdynamic 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_getdynamic_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(getdynamic)); USAGE_ANALYSIS_OPERAND(BIN(getdynamic), 0, idx); USAGE_ANALYSIS_OPERAND(BIN(getdynamic), 1, level); { #line 116 "insns.def" int i; VALUE *dfp2 = GET_DFP(); for (i = 0; i < level; i++) { dfp2 = GET_PREV_DFP(dfp2); } val = *(dfp2 - idx); #line 163 "vm.inc" PUSH(val); #undef CURRENT_INSN_getdynamic #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(getdynamic);}}} INSN_ENTRY(setdynamic){ { rb_num_t level = (rb_num_t)GET_OPERAND(2); dindex_t idx = (dindex_t)GET_OPERAND(1); VALUE val = TOPN(0); DEBUG_ENTER_INSN("setdynamic"); ADD_PC(1+2); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_setdynamic 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_setdynamic_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(setdynamic)); USAGE_ANALYSIS_OPERAND(BIN(setdynamic), 0, idx); USAGE_ANALYSIS_OPERAND(BIN(setdynamic), 1, level); { #line 137 "insns.def" int i; VALUE *dfp2 = GET_DFP(); for (i = 0; i < level; i++) { dfp2 = GET_PREV_DFP(dfp2); } *(dfp2 - idx) = val; #line 195 "vm.inc" #undef CURRENT_INSN_setdynamic #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(setdynamic);}}} INSN_ENTRY(getinstancevariable){ { VALUE val; ID id = (ID)GET_OPERAND(1); DEBUG_ENTER_INSN("getinstancevariable"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_getinstancevariable 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_getinstancevariable_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(getinstancevariable)); USAGE_ANALYSIS_OPERAND(BIN(getinstancevariable), 0, id); { #line 157 "insns.def" val = rb_ivar_get(GET_SELF(), id); #line 219 "vm.inc" PUSH(val); #undef CURRENT_INSN_getinstancevariable #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(getinstancevariable);}}} INSN_ENTRY(setinstancevariable){ { ID id = (ID)GET_OPERAND(1); VALUE val = TOPN(0); DEBUG_ENTER_INSN("setinstancevariable"); ADD_PC(1+1); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_setinstancevariable 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_setinstancevariable_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(setinstancevariable)); USAGE_ANALYSIS_OPERAND(BIN(setinstancevariable), 0, id); { #line 172 "insns.def" rb_ivar_set(GET_SELF(), id, val); #line 244 "vm.inc" #undef CURRENT_INSN_setinstancevariable #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(setinstancevariable);}}} INSN_ENTRY(getclassvariable){ { VALUE val; ID id = (ID)GET_OPERAND(1); DEBUG_ENTER_INSN("getclassvariable"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_getclassvariable 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_getclassvariable_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(getclassvariable)); USAGE_ANALYSIS_OPERAND(BIN(getclassvariable), 0, id); { #line 186 "insns.def" NODE * const cref = vm_get_cref(GET_ISEQ(), GET_LFP(), GET_DFP()); val = rb_cvar_get(vm_get_cvar_base(cref), id); #line 269 "vm.inc" PUSH(val); #undef CURRENT_INSN_getclassvariable #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(getclassvariable);}}} INSN_ENTRY(setclassvariable){ { ID id = (ID)GET_OPERAND(1); VALUE val = TOPN(0); DEBUG_ENTER_INSN("setclassvariable"); ADD_PC(1+1); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_setclassvariable 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_setclassvariable_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(setclassvariable)); USAGE_ANALYSIS_OPERAND(BIN(setclassvariable), 0, id); { #line 201 "insns.def" NODE * const cref = vm_get_cref(GET_ISEQ(), GET_LFP(), GET_DFP()); rb_cvar_set(vm_get_cvar_base(cref), id, val); #line 295 "vm.inc" #undef CURRENT_INSN_setclassvariable #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(setclassvariable);}}} INSN_ENTRY(getconstant){ { VALUE val; ID id = (ID)GET_OPERAND(1); VALUE klass = TOPN(0); DEBUG_ENTER_INSN("getconstant"); ADD_PC(1+1); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_getconstant 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_getconstant_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(getconstant)); USAGE_ANALYSIS_OPERAND(BIN(getconstant), 0, id); { #line 223 "insns.def" val = vm_get_ev_const(th, GET_ISEQ(), klass, id, 0); #line 320 "vm.inc" PUSH(val); #undef CURRENT_INSN_getconstant #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(getconstant);}}} INSN_ENTRY(setconstant){ { ID id = (ID)GET_OPERAND(1); VALUE val = TOPN(1); VALUE cbase = TOPN(0); DEBUG_ENTER_INSN("setconstant"); ADD_PC(1+1); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_setconstant 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_setconstant_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(setconstant)); USAGE_ANALYSIS_OPERAND(BIN(setconstant), 0, id); { #line 245 "insns.def" vm_check_if_namespace(cbase); rb_const_set(cbase, id, val); INC_VM_STATE_VERSION(); #line 348 "vm.inc" #undef CURRENT_INSN_setconstant #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(setconstant);}}} INSN_ENTRY(getglobal){ { VALUE val; GENTRY entry = (GENTRY)GET_OPERAND(1); DEBUG_ENTER_INSN("getglobal"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_getglobal 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_getglobal_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(getglobal)); USAGE_ANALYSIS_OPERAND(BIN(getglobal), 0, entry); { #line 261 "insns.def" val = GET_GLOBAL(entry); #line 372 "vm.inc" PUSH(val); #undef CURRENT_INSN_getglobal #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(getglobal);}}} INSN_ENTRY(setglobal){ { GENTRY entry = (GENTRY)GET_OPERAND(1); VALUE val = TOPN(0); DEBUG_ENTER_INSN("setglobal"); ADD_PC(1+1); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_setglobal 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_setglobal_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(setglobal)); USAGE_ANALYSIS_OPERAND(BIN(setglobal), 0, entry); { #line 275 "insns.def" SET_GLOBAL(entry, val); #line 397 "vm.inc" #undef CURRENT_INSN_setglobal #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(setglobal);}}} INSN_ENTRY(putnil){ { VALUE val; DEBUG_ENTER_INSN("putnil"); ADD_PC(1+0); PREFETCH(GET_PC()); #define CURRENT_INSN_putnil 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_putnil_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(putnil)); { #line 294 "insns.def" val = Qnil; #line 420 "vm.inc" PUSH(val); #undef CURRENT_INSN_putnil #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(putnil);}}} INSN_ENTRY(putself){ { VALUE val; DEBUG_ENTER_INSN("putself"); ADD_PC(1+0); PREFETCH(GET_PC()); #define CURRENT_INSN_putself 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_putself_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(putself)); { #line 308 "insns.def" val = GET_SELF(); #line 444 "vm.inc" PUSH(val); #undef CURRENT_INSN_putself #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(putself);}}} INSN_ENTRY(putobject){ { VALUE val = (VALUE)GET_OPERAND(1); DEBUG_ENTER_INSN("putobject"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_putobject 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_putobject_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(putobject)); USAGE_ANALYSIS_OPERAND(BIN(putobject), 0, val); { #line 324 "insns.def" /* */ #line 468 "vm.inc" PUSH(val); #undef CURRENT_INSN_putobject #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(putobject);}}} INSN_ENTRY(putspecialobject){ { VALUE val; rb_num_t value_type = (rb_num_t)GET_OPERAND(1); DEBUG_ENTER_INSN("putspecialobject"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_putspecialobject 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_putspecialobject_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(putspecialobject)); USAGE_ANALYSIS_OPERAND(BIN(putspecialobject), 0, value_type); { #line 339 "insns.def" switch (value_type) { case VM_SPECIAL_OBJECT_VMCORE: val = rb_mRubyVMFrozenCore; break; case VM_SPECIAL_OBJECT_CBASE: val = vm_get_cbase(GET_ISEQ(), GET_LFP(), GET_DFP()); break; default: rb_bug("putspecialobject insn: unknown value_type"); } #line 502 "vm.inc" PUSH(val); #undef CURRENT_INSN_putspecialobject #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(putspecialobject);}}} INSN_ENTRY(putiseq){ { VALUE ret; ISEQ iseq = (ISEQ)GET_OPERAND(1); DEBUG_ENTER_INSN("putiseq"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_putiseq 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_putiseq_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(putiseq)); USAGE_ANALYSIS_OPERAND(BIN(putiseq), 0, iseq); { #line 362 "insns.def" ret = iseq->self; #line 527 "vm.inc" PUSH(ret); #undef CURRENT_INSN_putiseq #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(putiseq);}}} INSN_ENTRY(putstring){ { VALUE val; VALUE str = (VALUE)GET_OPERAND(1); DEBUG_ENTER_INSN("putstring"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_putstring 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_putstring_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(putstring)); USAGE_ANALYSIS_OPERAND(BIN(putstring), 0, str); { #line 376 "insns.def" val = rb_str_replace(rb_str_new(0, 0), str); #line 552 "vm.inc" PUSH(val); #undef CURRENT_INSN_putstring #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(putstring);}}} INSN_ENTRY(concatstrings){ { VALUE val; rb_num_t num = (rb_num_t)GET_OPERAND(1); DEBUG_ENTER_INSN("concatstrings"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_concatstrings 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_concatstrings_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(concatstrings)); USAGE_ANALYSIS_OPERAND(BIN(concatstrings), 0, num); { #line 390 "insns.def" int i; val = rb_str_new(0, 0); for (i = num - 1; i >= 0; i--) { const VALUE v = TOPN(i); rb_str_append(val, v); } POPN(num); #line 584 "vm.inc" PUSH(val); #undef CURRENT_INSN_concatstrings #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(concatstrings);}}} INSN_ENTRY(tostring){ { VALUE val = TOPN(0); DEBUG_ENTER_INSN("tostring"); ADD_PC(1+0); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_tostring 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_tostring_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(tostring)); { #line 411 "insns.def" val = rb_obj_as_string(val); #line 608 "vm.inc" PUSH(val); #undef CURRENT_INSN_tostring #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(tostring);}}} INSN_ENTRY(toregexp){ { VALUE val; rb_num_t cnt = (rb_num_t)GET_OPERAND(2); rb_num_t opt = (rb_num_t)GET_OPERAND(1); DEBUG_ENTER_INSN("toregexp"); ADD_PC(1+2); PREFETCH(GET_PC()); #define CURRENT_INSN_toregexp 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_toregexp_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(toregexp)); USAGE_ANALYSIS_OPERAND(BIN(toregexp), 0, opt); USAGE_ANALYSIS_OPERAND(BIN(toregexp), 1, cnt); { #line 426 "insns.def" VALUE rb_reg_new_ary(VALUE ary, int options); int i; const VALUE ary = rb_ary_new2(cnt); RBASIC(ary)->klass = 0; for (i = 0; i < cnt; i++) { rb_ary_store(ary, cnt-i-1, TOPN(i)); } POPN(cnt); val = rb_reg_new_ary(ary, opt); #line 643 "vm.inc" PUSH(val); #undef CURRENT_INSN_toregexp #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(toregexp);}}} INSN_ENTRY(newarray){ { VALUE val; rb_num_t num = (rb_num_t)GET_OPERAND(1); DEBUG_ENTER_INSN("newarray"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_newarray 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_newarray_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(newarray)); USAGE_ANALYSIS_OPERAND(BIN(newarray), 0, num); { #line 448 "insns.def" val = rb_ary_new4((long)num, STACK_ADDR_FROM_TOP(num)); POPN(num); #line 669 "vm.inc" PUSH(val); #undef CURRENT_INSN_newarray #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(newarray);}}} INSN_ENTRY(duparray){ { VALUE val; VALUE ary = (VALUE)GET_OPERAND(1); DEBUG_ENTER_INSN("duparray"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_duparray 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_duparray_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(duparray)); USAGE_ANALYSIS_OPERAND(BIN(duparray), 0, ary); { #line 463 "insns.def" val = rb_ary_replace(rb_ary_new2(0), ary); #line 694 "vm.inc" PUSH(val); #undef CURRENT_INSN_duparray #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(duparray);}}} INSN_ENTRY(expandarray){ { rb_num_t flag = (rb_num_t)GET_OPERAND(2); rb_num_t num = (rb_num_t)GET_OPERAND(1); VALUE ary = TOPN(0); DEBUG_ENTER_INSN("expandarray"); ADD_PC(1+2); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_expandarray 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_expandarray_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(expandarray)); USAGE_ANALYSIS_OPERAND(BIN(expandarray), 0, num); USAGE_ANALYSIS_OPERAND(BIN(expandarray), 1, flag); { #line 484 "insns.def" vm_expandarray(GET_CFP(), ary, num, flag); #line 721 "vm.inc" #undef CURRENT_INSN_expandarray #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(expandarray);}}} INSN_ENTRY(concatarray){ { VALUE ary; VALUE ary1 = TOPN(1); VALUE ary2st = TOPN(0); DEBUG_ENTER_INSN("concatarray"); ADD_PC(1+0); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_concatarray 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_concatarray_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(concatarray)); { #line 498 "insns.def" const VALUE ary2 = ary2st; VALUE tmp1 = rb_check_convert_type(ary1, T_ARRAY, "Array", "to_a"); VALUE tmp2 = rb_check_convert_type(ary2, T_ARRAY, "Array", "to_a"); if (NIL_P(tmp1)) { tmp1 = rb_ary_new3(1, ary1); } if (NIL_P(tmp2)) { tmp2 = rb_ary_new3(1, ary2); } if (tmp1 == ary1) { tmp1 = rb_ary_dup(ary1); } ary = rb_ary_concat(tmp1, tmp2); #line 761 "vm.inc" PUSH(ary); #undef CURRENT_INSN_concatarray #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(concatarray);}}} INSN_ENTRY(splatarray){ { VALUE obj; VALUE ary = TOPN(0); DEBUG_ENTER_INSN("splatarray"); ADD_PC(1+1); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_splatarray 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_splatarray_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(splatarray)); USAGE_ANALYSIS_OPERAND(BIN(splatarray), 0, flag); { #line 527 "insns.def" VALUE tmp = rb_check_convert_type(ary, T_ARRAY, "Array", "to_a"); if (NIL_P(tmp)) { tmp = rb_ary_new3(1, ary); } obj = tmp; #line 791 "vm.inc" PUSH(obj); #undef CURRENT_INSN_splatarray #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(splatarray);}}} INSN_ENTRY(checkincludearray){ { VALUE result; VALUE flag = (VALUE)GET_OPERAND(1); VALUE obj = TOPN(1); VALUE ary = TOPN(0); DEBUG_ENTER_INSN("checkincludearray"); ADD_PC(1+1); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_checkincludearray 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_checkincludearray_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(checkincludearray)); USAGE_ANALYSIS_OPERAND(BIN(checkincludearray), 0, flag); { #line 545 "insns.def" int i; result = Qfalse; if (TYPE(ary) != T_ARRAY) { ary = rb_Array(ary); } if (flag == Qtrue) { /* NODE_CASE */ for (i = 0; i < RARRAY_LEN(ary); i++) { /* TODO: fix me (use another method dispatch) */ if (RTEST(rb_funcall2(RARRAY_PTR(ary)[i], idEqq, 1, &obj))) { result = Qtrue; break; } } } else { obj = Qfalse; /* NODE_WHEN */ for (i = 0; i < RARRAY_LEN(ary); i++) { if (RTEST(RARRAY_PTR(ary)[i])) { obj = result = Qtrue; break; } } } #line 844 "vm.inc" PUSH(obj); PUSH(result); #undef CURRENT_INSN_checkincludearray #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(checkincludearray);}}} INSN_ENTRY(newhash){ { VALUE val; rb_num_t num = (rb_num_t)GET_OPERAND(1); DEBUG_ENTER_INSN("newhash"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_newhash 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_newhash_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(newhash)); USAGE_ANALYSIS_OPERAND(BIN(newhash), 0, num); { #line 586 "insns.def" int i; val = rb_hash_new(); for (i = num; i > 0; i -= 2) { const VALUE v = TOPN(i - 2); const VALUE k = TOPN(i - 1); rb_hash_aset(val, k, v); } POPN(num); #line 878 "vm.inc" PUSH(val); #undef CURRENT_INSN_newhash #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(newhash);}}} INSN_ENTRY(newrange){ { VALUE val; rb_num_t flag = (rb_num_t)GET_OPERAND(1); VALUE low = TOPN(1); VALUE high = TOPN(0); DEBUG_ENTER_INSN("newrange"); ADD_PC(1+1); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_newrange 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_newrange_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(newrange)); USAGE_ANALYSIS_OPERAND(BIN(newrange), 0, flag); { #line 608 "insns.def" val = rb_range_new(low, high, flag); #line 905 "vm.inc" PUSH(val); #undef CURRENT_INSN_newrange #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(newrange);}}} INSN_ENTRY(pop){ { VALUE val = TOPN(0); DEBUG_ENTER_INSN("pop"); ADD_PC(1+0); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_pop 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_pop_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(pop)); { #line 626 "insns.def" val = val; /* none */ #line 930 "vm.inc" #undef CURRENT_INSN_pop #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(pop);}}} INSN_ENTRY(dup){ { VALUE val2; VALUE val1; VALUE val = TOPN(0); DEBUG_ENTER_INSN("dup"); ADD_PC(1+0); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_dup 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_dup_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(dup)); { #line 641 "insns.def" val1 = val2 = val; #line 955 "vm.inc" PUSH(val1); PUSH(val2); #undef CURRENT_INSN_dup #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(dup);}}} INSN_ENTRY(dupn){ { rb_num_t n = (rb_num_t)GET_OPERAND(1); DEBUG_ENTER_INSN("dupn"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_dupn 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_dupn_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(dupn)); USAGE_ANALYSIS_OPERAND(BIN(dupn), 0, n); { #line 655 "insns.def" int i; VALUE *sp = STACK_ADDR_FROM_TOP(n); for (i = 0; i < n; i++) { GET_SP()[i] = sp[i]; } INC_SP(n); #line 985 "vm.inc" #undef CURRENT_INSN_dupn #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(dupn);}}} INSN_ENTRY(swap){ { VALUE val = TOPN(1); VALUE obj = TOPN(0); DEBUG_ENTER_INSN("swap"); ADD_PC(1+0); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_swap 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_swap_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(swap)); { #line 675 "insns.def" /* none */ #line 1009 "vm.inc" PUSH(obj); PUSH(val); #undef CURRENT_INSN_swap #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(swap);}}} INSN_ENTRY(reput){ { VALUE val = TOPN(0); DEBUG_ENTER_INSN("reput"); ADD_PC(1+0); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_reput 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_reput_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(reput)); { #line 689 "insns.def" /* none */ #line 1034 "vm.inc" PUSH(val); #undef CURRENT_INSN_reput #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(reput);}}} INSN_ENTRY(topn){ { VALUE val; rb_num_t n = (rb_num_t)GET_OPERAND(1); DEBUG_ENTER_INSN("topn"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_topn 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_topn_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(topn)); USAGE_ANALYSIS_OPERAND(BIN(topn), 0, n); { #line 703 "insns.def" val = TOPN(n); #line 1059 "vm.inc" PUSH(val); #undef CURRENT_INSN_topn #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(topn);}}} INSN_ENTRY(setn){ { rb_num_t n = (rb_num_t)GET_OPERAND(1); VALUE val = TOPN(0); DEBUG_ENTER_INSN("setn"); ADD_PC(1+1); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_setn 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_setn_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(setn)); USAGE_ANALYSIS_OPERAND(BIN(setn), 0, n); { #line 717 "insns.def" TOPN(n-1) = val; #line 1084 "vm.inc" PUSH(val); #undef CURRENT_INSN_setn #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(setn);}}} INSN_ENTRY(adjuststack){ { rb_num_t n = (rb_num_t)GET_OPERAND(1); DEBUG_ENTER_INSN("adjuststack"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_adjuststack 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_adjuststack_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(adjuststack)); USAGE_ANALYSIS_OPERAND(BIN(adjuststack), 0, n); { #line 731 "insns.def" DEC_SP(n); #line 1108 "vm.inc" #undef CURRENT_INSN_adjuststack #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(adjuststack);}}} INSN_ENTRY(defined){ { VALUE val; VALUE needstr = (VALUE)GET_OPERAND(3); VALUE obj = (VALUE)GET_OPERAND(2); rb_num_t type = (rb_num_t)GET_OPERAND(1); VALUE v = TOPN(0); DEBUG_ENTER_INSN("defined"); ADD_PC(1+3); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_defined 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_defined_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(defined)); USAGE_ANALYSIS_OPERAND(BIN(defined), 0, type); USAGE_ANALYSIS_OPERAND(BIN(defined), 1, obj); USAGE_ANALYSIS_OPERAND(BIN(defined), 2, needstr); { #line 750 "insns.def" VALUE klass; const char *expr_type = 0; val = Qnil; switch (type) { case DEFINED_IVAR: if (rb_ivar_defined(GET_SELF(), SYM2ID(obj))) { expr_type = "instance-variable"; } break; case DEFINED_IVAR2: klass = vm_get_cbase(GET_ISEQ(), GET_LFP(), GET_DFP()); break; case DEFINED_GVAR: if (rb_gvar_defined((struct global_entry *)(obj & ~1))) { expr_type = "global-variable"; } break; case DEFINED_CVAR: klass = vm_get_cbase(GET_ISEQ(), GET_LFP(), GET_DFP()); if (rb_cvar_defined(klass, SYM2ID(obj))) { expr_type = "class variable"; } break; case DEFINED_CONST: klass = v; if (vm_get_ev_const(th, GET_ISEQ(), klass, SYM2ID(obj), 1)) { expr_type = "constant"; } break; case DEFINED_FUNC: klass = CLASS_OF(v); if (rb_method_boundp(klass, SYM2ID(obj), 0)) { expr_type = "method"; } break; case DEFINED_METHOD:{ VALUE klass = CLASS_OF(v); NODE *method = (NODE *) rb_method_node(klass, SYM2ID(obj)); if (method) { if (!(method->nd_noex & NOEX_PRIVATE)) { if (!((method->nd_noex & NOEX_PROTECTED) && !rb_obj_is_kind_of(GET_SELF(), rb_class_real(klass)))) { expr_type = "method"; } } } break; } case DEFINED_YIELD: if (GET_BLOCK_PTR()) { expr_type = "yield"; } break; case DEFINED_ZSUPER:{ rb_iseq_t *ip = GET_ISEQ(); while (ip) { if (ip->defined_method_id) { break; } ip = ip->parent_iseq; } if (ip) { VALUE klass = vm_search_normal_superclass(ip->klass, GET_SELF()); if (rb_method_boundp(klass, ip->defined_method_id, 0)) { expr_type = "super"; } } break; } case DEFINED_REF:{ val = vm_getspecial(th, GET_LFP(), Qfalse, FIX2INT(obj)); if (val != Qnil) { expr_type = "global-variable"; } break; } default: rb_bug("unimplemented defined? type (VM)"); break; } if (expr_type != 0) { if (needstr != Qfalse) { val = rb_str_new2(expr_type); } else { val = Qtrue; } } #line 1227 "vm.inc" PUSH(val); #undef CURRENT_INSN_defined #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(defined);}}} INSN_ENTRY(trace){ { rb_num_t nf = (rb_num_t)GET_OPERAND(1); DEBUG_ENTER_INSN("trace"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_trace 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_trace_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(trace)); USAGE_ANALYSIS_OPERAND(BIN(trace), 0, nf); { #line 854 "insns.def" rb_event_flag_t flag = nf; EXEC_EVENT_HOOK(th, flag, GET_SELF(), 0, 0 /* TODO: id, klass */); #line 1253 "vm.inc" #undef CURRENT_INSN_trace #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(trace);}}} INSN_ENTRY(defineclass){ { VALUE val; rb_num_t define_type = (rb_num_t)GET_OPERAND(3); ISEQ class_iseq = (ISEQ)GET_OPERAND(2); ID id = (ID)GET_OPERAND(1); VALUE cbase = TOPN(1); VALUE super = TOPN(0); DEBUG_ENTER_INSN("defineclass"); ADD_PC(1+3); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_defineclass 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_defineclass_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(defineclass)); USAGE_ANALYSIS_OPERAND(BIN(defineclass), 0, id); USAGE_ANALYSIS_OPERAND(BIN(defineclass), 1, class_iseq); USAGE_ANALYSIS_OPERAND(BIN(defineclass), 2, define_type); { #line 878 "insns.def" VALUE klass; switch ((int)define_type) { case 0: /* val is dummy. classdef returns class scope value */ if (super == Qnil) { super = rb_cObject; } vm_check_if_namespace(cbase); /* find klass */ if (rb_const_defined_at(cbase, id)) { /* already exist */ klass = rb_const_get_at(cbase, id); if (TYPE(klass) != T_CLASS) { rb_raise(rb_eTypeError, "%s is not a class", rb_id2name(id)); } if (super != rb_cObject) { VALUE tmp; tmp = rb_class_real(RCLASS_SUPER(klass)); if (tmp != super) { rb_raise(rb_eTypeError, "superclass mismatch for class %s", rb_id2name(id)); } } } else { /* new class declaration */ klass = rb_define_class_id(id, super); rb_set_class_path(klass, cbase, rb_id2name(id)); rb_const_set(cbase, id, klass); rb_class_inherited(super, klass); } break; case 1: /* val is dummy. classdef returns class scope value */ /* super is dummy */ klass = rb_singleton_class(cbase); break; case 2: /* val is dummy. classdef returns class scope value */ /* super is dummy */ vm_check_if_namespace(cbase); /* find klass */ if (rb_const_defined_at(cbase, id)) { klass = rb_const_get_at(cbase, id); /* already exist */ if (TYPE(klass) != T_MODULE) { rb_raise(rb_eTypeError, "%s is not a module", rb_id2name(id)); } } else { /* new module declaration */ klass = rb_define_module_id(id); rb_set_class_path(klass, cbase, rb_id2name(id)); rb_const_set(cbase, id, klass); } break; default: rb_bug("unknown defineclass type: %d", (int)define_type); } COPY_CREF(class_iseq->cref_stack, vm_cref_push(th, klass, NOEX_PUBLIC)); /* enter scope */ vm_push_frame(th, class_iseq, VM_FRAME_MAGIC_CLASS, klass, (VALUE) GET_DFP() | 0x02, class_iseq->iseq_encoded, GET_SP(), 0, class_iseq->local_size); RESTORE_REGS(); INC_VM_STATE_VERSION(); NEXT_INSN(); #line 1361 "vm.inc" PUSH(val); #undef CURRENT_INSN_defineclass #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(defineclass);}}} INSN_ENTRY(send){ { VALUE val; IC ic = (IC)GET_OPERAND(5); rb_num_t op_flag = (rb_num_t)GET_OPERAND(4); ISEQ blockiseq = (ISEQ)GET_OPERAND(3); rb_num_t op_argc = (rb_num_t)GET_OPERAND(2); ID op_id = (ID)GET_OPERAND(1); DEBUG_ENTER_INSN("send"); ADD_PC(1+5); PREFETCH(GET_PC()); #define CURRENT_INSN_send 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_send_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(send)); USAGE_ANALYSIS_OPERAND(BIN(send), 0, op_id); USAGE_ANALYSIS_OPERAND(BIN(send), 1, op_argc); USAGE_ANALYSIS_OPERAND(BIN(send), 2, blockiseq); USAGE_ANALYSIS_OPERAND(BIN(send), 3, op_flag); USAGE_ANALYSIS_OPERAND(BIN(send), 4, ic); { #line 981 "insns.def" NODE *mn; VALUE recv, klass; rb_block_t *blockptr = 0; rb_num_t num = caller_setup_args(th, GET_CFP(), op_flag, op_argc, (rb_iseq_t *)blockiseq, &blockptr); rb_num_t flag = op_flag; ID id = op_id; /* get receiver */ recv = (flag & VM_CALL_FCALL_BIT) ? GET_SELF() : TOPN(num); klass = CLASS_OF(recv); mn = vm_method_search(id, klass, ic); /* send/funcall optimization */ if (flag & VM_CALL_SEND_BIT) { vm_send_optimize(GET_CFP(), &mn, &flag, &num, &id, klass); } CALL_METHOD(num, blockptr, flag, id, mn, recv); #line 1412 "vm.inc" PUSH(val); #undef CURRENT_INSN_send #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(send);}}} INSN_ENTRY(invokesuper){ { VALUE val; rb_num_t op_flag = (rb_num_t)GET_OPERAND(3); ISEQ blockiseq = (ISEQ)GET_OPERAND(2); rb_num_t op_argc = (rb_num_t)GET_OPERAND(1); DEBUG_ENTER_INSN("invokesuper"); ADD_PC(1+3); PREFETCH(GET_PC()); #define CURRENT_INSN_invokesuper 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_invokesuper_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(invokesuper)); USAGE_ANALYSIS_OPERAND(BIN(invokesuper), 0, op_argc); USAGE_ANALYSIS_OPERAND(BIN(invokesuper), 1, blockiseq); USAGE_ANALYSIS_OPERAND(BIN(invokesuper), 2, op_flag); { #line 1015 "insns.def" rb_block_t *blockptr = !(op_flag & VM_CALL_ARGS_BLOCKARG_BIT) ? GET_BLOCK_PTR() : 0; int num = caller_setup_args(th, GET_CFP(), op_flag, op_argc, blockiseq, &blockptr); VALUE recv, klass; NODE *mn; ID id; const VALUE flag = VM_CALL_SUPER_BIT | VM_CALL_FCALL_BIT; recv = GET_SELF(); vm_search_superclass(GET_CFP(), GET_ISEQ(), recv, TOPN(num), &id, &klass); mn = rb_method_node(klass, id); CALL_METHOD(num, blockptr, flag, id, mn, recv); #line 1452 "vm.inc" PUSH(val); #undef CURRENT_INSN_invokesuper #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(invokesuper);}}} INSN_ENTRY(invokeblock){ { VALUE val; rb_num_t flag = (rb_num_t)GET_OPERAND(2); rb_num_t num = (rb_num_t)GET_OPERAND(1); DEBUG_ENTER_INSN("invokeblock"); ADD_PC(1+2); PREFETCH(GET_PC()); #define CURRENT_INSN_invokeblock 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_invokeblock_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(invokeblock)); USAGE_ANALYSIS_OPERAND(BIN(invokeblock), 0, num); USAGE_ANALYSIS_OPERAND(BIN(invokeblock), 1, flag); { #line 1041 "insns.def" val = vm_invoke_block(th, GET_CFP(), num, flag); if (val == Qundef) { RESTORE_REGS(); NEXT_INSN(); } #line 1483 "vm.inc" PUSH(val); #undef CURRENT_INSN_invokeblock #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(invokeblock);}}} INSN_ENTRY(leave){ { VALUE val = TOPN(0); DEBUG_ENTER_INSN("leave"); ADD_PC(1+0); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_leave 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_leave_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(leave)); { #line 1059 "insns.def" if (OPT_CHECKED_RUN) { if (reg_cfp->sp != reg_cfp->bp) { rb_bug("Stack consistency error (sp: %"PRIdPTRDIFF", bp: %"PRIdPTRDIFF")", VM_SP_CNT(th, reg_cfp->sp), VM_SP_CNT(th, reg_cfp->bp)); } } RUBY_VM_CHECK_INTS(); vm_pop_frame(th); RESTORE_REGS(); #line 1516 "vm.inc" PUSH(val); #undef CURRENT_INSN_leave #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(leave);}}} INSN_ENTRY(finish){ { VALUE val = TOPN(0); DEBUG_ENTER_INSN("finish"); ADD_PC(1+0); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_finish 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_finish_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(finish)); { #line 1082 "insns.def" #if OPT_CALL_THREADED_CODE rb_bug("unused instruction on OPT_CALL_THREADED_CODE"); #else th->cfp++; return val; #endif #line 1545 "vm.inc" PUSH(val); #undef CURRENT_INSN_finish #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(finish);}}} INSN_ENTRY(throw){ { VALUE val; rb_num_t throw_state = (rb_num_t)GET_OPERAND(1); VALUE throwobj = TOPN(0); DEBUG_ENTER_INSN("throw"); ADD_PC(1+1); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_throw 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_throw_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(throw)); USAGE_ANALYSIS_OPERAND(BIN(throw), 0, throw_state); { #line 1105 "insns.def" RUBY_VM_CHECK_INTS(); val = vm_throw(th, GET_CFP(), throw_state, throwobj); THROW_EXCEPTION(val); /* unreachable */ #line 1574 "vm.inc" PUSH(val); #undef CURRENT_INSN_throw #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(throw);}}} INSN_ENTRY(jump){ { OFFSET dst = (OFFSET)GET_OPERAND(1); DEBUG_ENTER_INSN("jump"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_jump 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_jump_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(jump)); USAGE_ANALYSIS_OPERAND(BIN(jump), 0, dst); { #line 1126 "insns.def" RUBY_VM_CHECK_INTS(); JUMP(dst); #line 1599 "vm.inc" #undef CURRENT_INSN_jump #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(jump);}}} INSN_ENTRY(branchif){ { OFFSET dst = (OFFSET)GET_OPERAND(1); VALUE val = TOPN(0); DEBUG_ENTER_INSN("branchif"); ADD_PC(1+1); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_branchif 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_branchif_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(branchif)); USAGE_ANALYSIS_OPERAND(BIN(branchif), 0, dst); { #line 1141 "insns.def" if (RTEST(val)) { RUBY_VM_CHECK_INTS(); JUMP(dst); } #line 1626 "vm.inc" #undef CURRENT_INSN_branchif #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(branchif);}}} INSN_ENTRY(branchunless){ { OFFSET dst = (OFFSET)GET_OPERAND(1); VALUE val = TOPN(0); DEBUG_ENTER_INSN("branchunless"); ADD_PC(1+1); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_branchunless 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_branchunless_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(branchunless)); USAGE_ANALYSIS_OPERAND(BIN(branchunless), 0, dst); { #line 1158 "insns.def" if (!RTEST(val)) { RUBY_VM_CHECK_INTS(); JUMP(dst); } #line 1653 "vm.inc" #undef CURRENT_INSN_branchunless #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(branchunless);}}} INSN_ENTRY(getinlinecache){ { VALUE val; OFFSET dst = (OFFSET)GET_OPERAND(2); IC ic = (IC)GET_OPERAND(1); DEBUG_ENTER_INSN("getinlinecache"); ADD_PC(1+2); PREFETCH(GET_PC()); #define CURRENT_INSN_getinlinecache 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_getinlinecache_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(getinlinecache)); USAGE_ANALYSIS_OPERAND(BIN(getinlinecache), 0, ic); USAGE_ANALYSIS_OPERAND(BIN(getinlinecache), 1, dst); { #line 1180 "insns.def" if (ic->ic_vmstat == GET_VM_STATE_VERSION()) { val = ic->ic_value; JUMP(dst); } else { /* none */ val = Qnil; } #line 1686 "vm.inc" PUSH(val); #undef CURRENT_INSN_getinlinecache #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(getinlinecache);}}} INSN_ENTRY(onceinlinecache){ { VALUE val; OFFSET dst = (OFFSET)GET_OPERAND(2); IC ic = (IC)GET_OPERAND(1); DEBUG_ENTER_INSN("onceinlinecache"); ADD_PC(1+2); PREFETCH(GET_PC()); #define CURRENT_INSN_onceinlinecache 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_onceinlinecache_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(onceinlinecache)); USAGE_ANALYSIS_OPERAND(BIN(onceinlinecache), 0, ic); USAGE_ANALYSIS_OPERAND(BIN(onceinlinecache), 1, dst); { #line 1201 "insns.def" if (ic->ic_vmstat) { val = ic->ic_value; JUMP(dst); } else { /* none */ val = Qnil; } #line 1720 "vm.inc" PUSH(val); #undef CURRENT_INSN_onceinlinecache #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(onceinlinecache);}}} INSN_ENTRY(setinlinecache){ { OFFSET dst = (OFFSET)GET_OPERAND(1); VALUE val = TOPN(0); DEBUG_ENTER_INSN("setinlinecache"); ADD_PC(1+1); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_setinlinecache 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_setinlinecache_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(setinlinecache)); USAGE_ANALYSIS_OPERAND(BIN(setinlinecache), 0, dst); { #line 1222 "insns.def" IC ic = GET_CONST_INLINE_CACHE(dst); ic->ic_value = val; ic->ic_vmstat = GET_VM_STATE_VERSION() - ruby_vm_const_missing_count; ruby_vm_const_missing_count = 0; #line 1749 "vm.inc" PUSH(val); #undef CURRENT_INSN_setinlinecache #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(setinlinecache);}}} INSN_ENTRY(opt_case_dispatch){ { OFFSET else_offset = (OFFSET)GET_OPERAND(2); CDHASH hash = (CDHASH)GET_OPERAND(1); VALUE key = TOPN(0); DEBUG_ENTER_INSN("opt_case_dispatch"); ADD_PC(1+2); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_opt_case_dispatch 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_case_dispatch_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(opt_case_dispatch)); USAGE_ANALYSIS_OPERAND(BIN(opt_case_dispatch), 0, hash); USAGE_ANALYSIS_OPERAND(BIN(opt_case_dispatch), 1, else_offset); { #line 1240 "insns.def" if (0) { /* TODO: if some === method is overrided */ } else { VALUE val; if (st_lookup(RHASH_TBL(hash), key, &val)) { JUMP(FIX2INT(val)); } else { JUMP(else_offset); } } #line 1787 "vm.inc" #undef CURRENT_INSN_opt_case_dispatch #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_case_dispatch);}}} INSN_ENTRY(opt_checkenv){ { DEBUG_ENTER_INSN("opt_checkenv"); ADD_PC(1+0); PREFETCH(GET_PC()); #define CURRENT_INSN_opt_checkenv 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_checkenv_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(opt_checkenv)); { #line 1265 "insns.def" if (GET_CFP()->bp != GET_DFP() + 1) { VALUE *new_dfp = GET_CFP()->bp - 1; /* TODO: copy env and clean stack at creating env? */ *new_dfp = *GET_DFP(); SET_DFP(new_dfp); } #line 1814 "vm.inc" #undef CURRENT_INSN_opt_checkenv #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_checkenv);}}} INSN_ENTRY(opt_plus){ { VALUE val; VALUE recv = TOPN(1); VALUE obj = TOPN(0); DEBUG_ENTER_INSN("opt_plus"); ADD_PC(1+0); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_opt_plus 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_plus_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(opt_plus)); { #line 1287 "insns.def" if (0) { } #if 1 else if (FIXNUM_2_P(recv, obj) && BASIC_OP_UNREDEFINED_P(BOP_PLUS)) { /* fixnum + fixnum */ #ifndef LONG_LONG_VALUE val = (recv + (obj & (~1))); if ((~(recv ^ obj) & (recv ^ val)) & ((VALUE)0x01 << ((sizeof(VALUE) * CHAR_BIT) - 1))) { val = rb_big_plus(rb_int2big(FIX2LONG(recv)), rb_int2big(FIX2LONG(obj))); } #else long a, b, c; a = FIX2LONG(recv); b = FIX2LONG(obj); c = a + b; if (FIXABLE(c)) { val = LONG2FIX(c); } else { val = rb_big_plus(rb_int2big(a), rb_int2big(b)); } #endif } #endif else if (!SPECIAL_CONST_P(recv) && !SPECIAL_CONST_P(obj)) { if (0) { } #if 1 else if (HEAP_CLASS_OF(recv) == rb_cFloat && HEAP_CLASS_OF(obj) == rb_cFloat && BASIC_OP_UNREDEFINED_P(BOP_PLUS)) { val = DBL2NUM(RFLOAT_VALUE(recv) + RFLOAT_VALUE(obj)); } #endif #if 1 else if (HEAP_CLASS_OF(recv) == rb_cString && HEAP_CLASS_OF(obj) == rb_cString && BASIC_OP_UNREDEFINED_P(BOP_PLUS)) { val = rb_str_plus(recv, obj); } #endif #if 1 else if (HEAP_CLASS_OF(recv) == rb_cArray && BASIC_OP_UNREDEFINED_P(BOP_PLUS)) { val = rb_ary_plus(recv, obj); } #endif else { goto INSN_LABEL(normal_dispatch); } } else { INSN_LABEL(normal_dispatch): PUSH(recv); PUSH(obj); CALL_SIMPLE_METHOD(1, idPLUS, recv); } #line 1901 "vm.inc" PUSH(val); #undef CURRENT_INSN_opt_plus #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_plus);}}} INSN_ENTRY(opt_minus){ { VALUE val; VALUE recv = TOPN(1); VALUE obj = TOPN(0); DEBUG_ENTER_INSN("opt_minus"); ADD_PC(1+0); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_opt_minus 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_minus_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(opt_minus)); { #line 1363 "insns.def" if (FIXNUM_2_P(recv, obj) && BASIC_OP_UNREDEFINED_P(BOP_MINUS)) { long a, b, c; a = FIX2LONG(recv); b = FIX2LONG(obj); c = a - b; if (FIXABLE(c)) { val = LONG2FIX(c); } else { val = rb_big_minus(rb_int2big(a), rb_int2big(b)); } } else { /* other */ PUSH(recv); PUSH(obj); CALL_SIMPLE_METHOD(1, idMINUS, recv); } #line 1947 "vm.inc" PUSH(val); #undef CURRENT_INSN_opt_minus #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_minus);}}} INSN_ENTRY(opt_mult){ { VALUE val; VALUE recv = TOPN(1); VALUE obj = TOPN(0); DEBUG_ENTER_INSN("opt_mult"); ADD_PC(1+0); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_opt_mult 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_mult_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(opt_mult)); { #line 1397 "insns.def" if (FIXNUM_2_P(recv, obj) && BASIC_OP_UNREDEFINED_P(BOP_MULT)) { long a, b, c; a = FIX2LONG(recv); if (a == 0) { val = recv; } else { b = FIX2LONG(obj); c = a * b; if (FIXABLE(c) && c / a == b) { val = LONG2FIX(c); } else { val = rb_big_mul(rb_int2big(a), rb_int2big(b)); } } } else if (!SPECIAL_CONST_P(recv) && !SPECIAL_CONST_P(obj)) { if (0) { } #if 1 else if (HEAP_CLASS_OF(recv) == rb_cFloat && HEAP_CLASS_OF(obj) == rb_cFloat && BASIC_OP_UNREDEFINED_P(BOP_MULT)) { val = DBL2NUM(RFLOAT_VALUE(recv) * RFLOAT_VALUE(obj)); } #endif else { goto INSN_LABEL(normal_dispatch); } } else { INSN_LABEL(normal_dispatch): PUSH(recv); PUSH(obj); CALL_SIMPLE_METHOD(1, idMULT, recv); } #line 2012 "vm.inc" PUSH(val); #undef CURRENT_INSN_opt_mult #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_mult);}}} INSN_ENTRY(opt_div){ { VALUE val; VALUE recv = TOPN(1); VALUE obj = TOPN(0); DEBUG_ENTER_INSN("opt_div"); ADD_PC(1+0); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_opt_div 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_div_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(opt_div)); { #line 1450 "insns.def" if (FIXNUM_2_P(recv, obj) && BASIC_OP_UNREDEFINED_P(BOP_DIV)) { long x, y, div; x = FIX2LONG(recv); y = FIX2LONG(obj); { /* copied from numeric.c#fixdivmod */ long mod; if (y == 0) goto INSN_LABEL(normal_dispatch); if (y < 0) { if (x < 0) div = -x / -y; else div = -(x / -y); } else { if (x < 0) div = -(-x / y); else div = x / y; } mod = x - div * y; if ((mod < 0 && y > 0) || (mod > 0 && y < 0)) { mod += y; div -= 1; } } val = LONG2NUM(div); } else if (!SPECIAL_CONST_P(recv) && !SPECIAL_CONST_P(obj)) { if (0) { } #if 1 else if (HEAP_CLASS_OF(recv) == rb_cFloat && HEAP_CLASS_OF(obj) == rb_cFloat && BASIC_OP_UNREDEFINED_P(BOP_DIV)) { val = DBL2NUM(RFLOAT_VALUE(recv) / RFLOAT_VALUE(obj)); } #endif else { goto INSN_LABEL(normal_dispatch); } } else { INSN_LABEL(normal_dispatch): PUSH(recv); PUSH(obj); CALL_SIMPLE_METHOD(1, idDIV, recv); } #line 2088 "vm.inc" PUSH(val); #undef CURRENT_INSN_opt_div #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_div);}}} INSN_ENTRY(opt_mod){ { VALUE val; VALUE recv = TOPN(1); VALUE obj = TOPN(0); DEBUG_ENTER_INSN("opt_mod"); ADD_PC(1+0); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_opt_mod 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_mod_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(opt_mod)); { #line 1514 "insns.def" if (FIXNUM_2_P(recv, obj) && BASIC_OP_UNREDEFINED_P(BOP_MOD)) { long x, y, mod; x = FIX2LONG(recv); y = FIX2LONG(obj); { /* copied from numeric.c#fixdivmod */ long div; if (y == 0) rb_num_zerodiv(); if (y < 0) { if (x < 0) div = -x / -y; else div = -(x / -y); } else { if (x < 0) div = -(-x / y); else div = x / y; } mod = x - div * y; if ((mod < 0 && y > 0) || (mod > 0 && y < 0)) { mod += y; div -= 1; } } val = LONG2FIX(mod); } else if (!SPECIAL_CONST_P(recv) && !SPECIAL_CONST_P(obj)) { if (0) { } else if (HEAP_CLASS_OF(recv) == rb_cFloat && HEAP_CLASS_OF(obj) == rb_cFloat && BASIC_OP_UNREDEFINED_P(BOP_MOD)) { double x = RFLOAT_VALUE(recv); double y = RFLOAT_VALUE(obj); double div, mod; { double z; modf(x / y, &z); mod = x - z * y; } div = (x - mod) / y; if (y * mod < 0) { mod += y; div -= 1.0; } val = DBL2NUM(mod); } else { goto INSN_LABEL(normal_dispatch); } } else { INSN_LABEL(normal_dispatch): PUSH(recv); PUSH(obj); CALL_SIMPLE_METHOD(1, idMOD, recv); } #line 2179 "vm.inc" PUSH(val); #undef CURRENT_INSN_opt_mod #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_mod);}}} INSN_ENTRY(opt_eq){ { VALUE val; IC ic = (IC)GET_OPERAND(1); VALUE recv = TOPN(1); VALUE obj = TOPN(0); DEBUG_ENTER_INSN("opt_eq"); ADD_PC(1+1); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_opt_eq 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_eq_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(opt_eq)); USAGE_ANALYSIS_OPERAND(BIN(opt_eq), 0, ic); { #line 1593 "insns.def" val = opt_eq_func(recv, obj, ic); if (val == Qundef) { /* other */ PUSH(recv); PUSH(obj); CALL_SIMPLE_METHOD(1, idEq, recv); } #line 2213 "vm.inc" PUSH(val); #undef CURRENT_INSN_opt_eq #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_eq);}}} INSN_ENTRY(opt_neq){ { VALUE val; IC ic2 = (IC)GET_OPERAND(2); IC ic1 = (IC)GET_OPERAND(1); VALUE recv = TOPN(1); VALUE obj = TOPN(0); DEBUG_ENTER_INSN("opt_neq"); ADD_PC(1+2); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_opt_neq 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_neq_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(opt_neq)); USAGE_ANALYSIS_OPERAND(BIN(opt_neq), 0, ic1); USAGE_ANALYSIS_OPERAND(BIN(opt_neq), 1, ic2); { #line 1614 "insns.def" extern VALUE rb_obj_not_equal(VALUE obj1, VALUE obj2); NODE *mn = vm_method_search(idNeq, CLASS_OF(recv), ic1); val = Qundef; if (check_cfunc(mn, rb_obj_not_equal)) { val = opt_eq_func(recv, obj, ic2); if (val != Qundef) { val = RTEST(val) ? Qfalse : Qtrue; } } if (val == Qundef) { /* other */ PUSH(recv); PUSH(obj); CALL_SIMPLE_METHOD(1, idNeq, recv); } #line 2259 "vm.inc" PUSH(val); #undef CURRENT_INSN_opt_neq #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_neq);}}} INSN_ENTRY(opt_lt){ { VALUE val; VALUE recv = TOPN(1); VALUE obj = TOPN(0); DEBUG_ENTER_INSN("opt_lt"); ADD_PC(1+0); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_opt_lt 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_lt_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(opt_lt)); { #line 1645 "insns.def" if (FIXNUM_2_P(recv, obj) && BASIC_OP_UNREDEFINED_P(BOP_LT)) { SIGNED_VALUE a = recv, b = obj; if (a < b) { val = Qtrue; } else { val = Qfalse; } } else { PUSH(recv); PUSH(obj); CALL_SIMPLE_METHOD(1, idLT, recv); } #line 2300 "vm.inc" PUSH(val); #undef CURRENT_INSN_opt_lt #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_lt);}}} INSN_ENTRY(opt_le){ { VALUE val; VALUE recv = TOPN(1); VALUE obj = TOPN(0); DEBUG_ENTER_INSN("opt_le"); ADD_PC(1+0); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_opt_le 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_le_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(opt_le)); { #line 1674 "insns.def" if (FIXNUM_2_P(recv, obj) && BASIC_OP_UNREDEFINED_P(BOP_LE)) { SIGNED_VALUE a = recv, b = obj; if (a <= b) { val = Qtrue; } else { val = Qfalse; } } else { /* other */ PUSH(recv); PUSH(obj); CALL_SIMPLE_METHOD(1, idLE, recv); } #line 2342 "vm.inc" PUSH(val); #undef CURRENT_INSN_opt_le #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_le);}}} INSN_ENTRY(opt_gt){ { VALUE val; VALUE recv = TOPN(1); VALUE obj = TOPN(0); DEBUG_ENTER_INSN("opt_gt"); ADD_PC(1+0); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_opt_gt 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_gt_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(opt_gt)); { #line 1704 "insns.def" if (FIXNUM_2_P(recv, obj) && BASIC_OP_UNREDEFINED_P(BOP_GT)) { SIGNED_VALUE a = recv, b = obj; if (a > b) { val = Qtrue; } else { val = Qfalse; } } else { PUSH(recv); PUSH(obj); CALL_SIMPLE_METHOD(1, idGT, recv); } #line 2383 "vm.inc" PUSH(val); #undef CURRENT_INSN_opt_gt #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_gt);}}} INSN_ENTRY(opt_ge){ { VALUE val; VALUE recv = TOPN(1); VALUE obj = TOPN(0); DEBUG_ENTER_INSN("opt_ge"); ADD_PC(1+0); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_opt_ge 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_ge_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(opt_ge)); { #line 1733 "insns.def" if (FIXNUM_2_P(recv, obj) && BASIC_OP_UNREDEFINED_P(BOP_GE)) { SIGNED_VALUE a = recv, b = obj; if (a >= b) { val = Qtrue; } else { val = Qfalse; } } else { PUSH(recv); PUSH(obj); CALL_SIMPLE_METHOD(1, idGE, recv); } #line 2424 "vm.inc" PUSH(val); #undef CURRENT_INSN_opt_ge #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_ge);}}} INSN_ENTRY(opt_ltlt){ { VALUE val; VALUE recv = TOPN(1); VALUE obj = TOPN(0); DEBUG_ENTER_INSN("opt_ltlt"); ADD_PC(1+0); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_opt_ltlt 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_ltlt_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(opt_ltlt)); { #line 1762 "insns.def" if (!SPECIAL_CONST_P(recv)) { if (0) { } else if (HEAP_CLASS_OF(recv) == rb_cString && BASIC_OP_UNREDEFINED_P(BOP_LTLT)) { val = rb_str_concat(recv, obj); } else if (HEAP_CLASS_OF(recv) == rb_cArray && BASIC_OP_UNREDEFINED_P(BOP_LTLT)) { val = rb_ary_push(recv, obj); } else { goto INSN_LABEL(normal_dispatch); } } else { INSN_LABEL(normal_dispatch): PUSH(recv); PUSH(obj); CALL_SIMPLE_METHOD(1, idLTLT, recv); } #line 2470 "vm.inc" PUSH(val); #undef CURRENT_INSN_opt_ltlt #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_ltlt);}}} INSN_ENTRY(opt_aref){ { VALUE val; VALUE recv = TOPN(1); VALUE obj = TOPN(0); DEBUG_ENTER_INSN("opt_aref"); ADD_PC(1+0); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_opt_aref 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_aref_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(opt_aref)); { #line 1796 "insns.def" if (!SPECIAL_CONST_P(recv) && BASIC_OP_UNREDEFINED_P(BOP_AREF)) { if (HEAP_CLASS_OF(recv) == rb_cArray && FIXNUM_P(obj)) { val = rb_ary_entry(recv, FIX2LONG(obj)); } else if (HEAP_CLASS_OF(recv) == rb_cHash) { val = rb_hash_aref(recv, obj); } else { goto INSN_LABEL(normal_dispatch); } } else { INSN_LABEL(normal_dispatch): PUSH(recv); PUSH(obj); CALL_SIMPLE_METHOD(1, idAREF, recv); } #line 2512 "vm.inc" PUSH(val); #undef CURRENT_INSN_opt_aref #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_aref);}}} INSN_ENTRY(opt_aset){ { VALUE val; VALUE recv = TOPN(2); VALUE obj = TOPN(1); VALUE set = TOPN(0); DEBUG_ENTER_INSN("opt_aset"); ADD_PC(1+0); PREFETCH(GET_PC()); POPN(3); #define CURRENT_INSN_opt_aset 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_aset_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(opt_aset)); { #line 1826 "insns.def" if (!SPECIAL_CONST_P(recv) && BASIC_OP_UNREDEFINED_P(BOP_ASET)) { if (HEAP_CLASS_OF(recv) == rb_cArray && FIXNUM_P(obj)) { rb_ary_store(recv, FIX2LONG(obj), set); val = set; } else if (HEAP_CLASS_OF(recv) == rb_cHash) { rb_hash_aset(recv, obj, set); val = set; } else { goto INSN_LABEL(normal_dispatch); } } else { INSN_LABEL(normal_dispatch): PUSH(recv); PUSH(obj); PUSH(set); CALL_SIMPLE_METHOD(2, idASET, recv); } #line 2559 "vm.inc" PUSH(val); #undef CURRENT_INSN_opt_aset #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_aset);}}} INSN_ENTRY(opt_length){ { VALUE val; VALUE recv = TOPN(0); DEBUG_ENTER_INSN("opt_length"); ADD_PC(1+0); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_opt_length 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_length_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(opt_length)); { #line 1860 "insns.def" if (!SPECIAL_CONST_P(recv) && BASIC_OP_UNREDEFINED_P(BOP_LENGTH)) { if (HEAP_CLASS_OF(recv) == rb_cString) { val = rb_str_length(recv); } else if (HEAP_CLASS_OF(recv) == rb_cArray) { val = LONG2NUM(RARRAY_LEN(recv)); } else if (HEAP_CLASS_OF(recv) == rb_cHash) { val = INT2FIX(RHASH_SIZE(recv)); } else { goto INSN_LABEL(normal_dispatch); } } else { INSN_LABEL(normal_dispatch): PUSH(recv); CALL_SIMPLE_METHOD(0, idLength, recv); } #line 2603 "vm.inc" PUSH(val); #undef CURRENT_INSN_opt_length #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_length);}}} INSN_ENTRY(opt_succ){ { VALUE val; VALUE recv = TOPN(0); DEBUG_ENTER_INSN("opt_succ"); ADD_PC(1+0); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_opt_succ 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_succ_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(opt_succ)); { #line 1893 "insns.def" if (SPECIAL_CONST_P(recv)) { if (FIXNUM_P(recv) && BASIC_OP_UNREDEFINED_P(BOP_SUCC)) { const VALUE obj = INT2FIX(1); /* fixnum + INT2FIX(1) */ val = (recv + (obj & (~1))); if ((~(recv ^ obj) & (recv ^ val)) & ((unsigned long)LONG_MAX + 1)) { val = rb_big_plus(rb_int2big(FIX2LONG(recv)), rb_int2big(FIX2LONG(obj))); } } else { goto INSN_LABEL(normal_dispatch); } } else { if (HEAP_CLASS_OF(recv) == rb_cString && BASIC_OP_UNREDEFINED_P(BOP_SUCC)) { val = rb_str_succ(recv); } else if (HEAP_CLASS_OF(recv) == rb_cTime && BASIC_OP_UNREDEFINED_P(BOP_SUCC)) { val = rb_time_succ(recv); } else { goto INSN_LABEL(normal_dispatch); } } if (0) { INSN_LABEL(normal_dispatch): PUSH(recv); CALL_SIMPLE_METHOD(0, idSucc, recv); } #line 2661 "vm.inc" PUSH(val); #undef CURRENT_INSN_opt_succ #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_succ);}}} INSN_ENTRY(opt_not){ { VALUE val; IC ic = (IC)GET_OPERAND(1); VALUE recv = TOPN(0); DEBUG_ENTER_INSN("opt_not"); ADD_PC(1+1); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_opt_not 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_not_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(opt_not)); USAGE_ANALYSIS_OPERAND(BIN(opt_not), 0, ic); { #line 1940 "insns.def" extern VALUE rb_obj_not(VALUE obj); NODE *mn = vm_method_search(idNot, CLASS_OF(recv), ic); if (check_cfunc(mn, rb_obj_not)) { val = RTEST(recv) ? Qfalse : Qtrue; } else { PUSH(recv); CALL_SIMPLE_METHOD(0, idNot, recv); } #line 2696 "vm.inc" PUSH(val); #undef CURRENT_INSN_opt_not #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_not);}}} INSN_ENTRY(opt_regexpmatch1){ { VALUE val; VALUE r = (VALUE)GET_OPERAND(1); VALUE obj = TOPN(0); DEBUG_ENTER_INSN("opt_regexpmatch1"); ADD_PC(1+1); PREFETCH(GET_PC()); POPN(1); #define CURRENT_INSN_opt_regexpmatch1 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_regexpmatch1_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(opt_regexpmatch1)); USAGE_ANALYSIS_OPERAND(BIN(opt_regexpmatch1), 0, r); { #line 1964 "insns.def" val = rb_reg_match(r, obj); #line 2722 "vm.inc" PUSH(val); #undef CURRENT_INSN_opt_regexpmatch1 #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_regexpmatch1);}}} INSN_ENTRY(opt_regexpmatch2){ { VALUE val; VALUE obj2 = TOPN(1); VALUE obj1 = TOPN(0); DEBUG_ENTER_INSN("opt_regexpmatch2"); ADD_PC(1+0); PREFETCH(GET_PC()); POPN(2); #define CURRENT_INSN_opt_regexpmatch2 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_regexpmatch2_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(opt_regexpmatch2)); { #line 1978 "insns.def" if (TYPE(obj2) == T_STRING) { val = rb_reg_match(obj1, obj2); } else { val = rb_funcall(obj2, idEqTilde, 1, obj1); } #line 2753 "vm.inc" PUSH(val); #undef CURRENT_INSN_opt_regexpmatch2 #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_regexpmatch2);}}} INSN_ENTRY(opt_call_c_function){ { rb_insn_func_t funcptr = (rb_insn_func_t)GET_OPERAND(1); DEBUG_ENTER_INSN("opt_call_c_function"); ADD_PC(1+1); PREFETCH(GET_PC()); #define CURRENT_INSN_opt_call_c_function 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_opt_call_c_function_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(opt_call_c_function)); USAGE_ANALYSIS_OPERAND(BIN(opt_call_c_function), 0, funcptr); { #line 1997 "insns.def" reg_cfp = (funcptr)(th, reg_cfp); if (reg_cfp == 0) { VALUE err = th->errinfo; th->errinfo = Qnil; THROW_EXCEPTION(err); } RESTORE_REGS(); NEXT_INSN(); #line 2786 "vm.inc" #undef CURRENT_INSN_opt_call_c_function #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(opt_call_c_function);}}} INSN_ENTRY(bitblt){ { VALUE ret; DEBUG_ENTER_INSN("bitblt"); ADD_PC(1+0); PREFETCH(GET_PC()); #define CURRENT_INSN_bitblt 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_bitblt_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(bitblt)); { #line 2020 "insns.def" ret = rb_str_new2("a bit of bacon, lettuce and tomato"); #line 2809 "vm.inc" PUSH(ret); #undef CURRENT_INSN_bitblt #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(bitblt);}}} INSN_ENTRY(answer){ { VALUE ret; DEBUG_ENTER_INSN("answer"); ADD_PC(1+0); PREFETCH(GET_PC()); #define CURRENT_INSN_answer 1 #define INSN_IS_SC() 0 #define INSN_LABEL(lab) LABEL_answer_##lab #define LABEL_IS_SC(lab) LABEL_##lab##_##t USAGE_ANALYSIS_INSN(BIN(answer)); { #line 2034 "insns.def" ret = INT2FIX(42); #line 2833 "vm.inc" PUSH(ret); #undef CURRENT_INSN_answer #undef INSN_IS_SC #undef INSN_LABEL #undef LABEL_IS_SC END_INSN(answer);}}}