12 #ifndef RUBY_INSNHELPER_H 13 #define RUBY_INSNHELPER_H 17 #if VM_COLLECT_USAGE_DETAILS 18 #define COLLECT_USAGE_INSN(insn) vm_collect_usage_insn(insn) 19 #define COLLECT_USAGE_OPERAND(insn, n, op) vm_collect_usage_operand((insn), (n), ((VALUE)(op))) 21 #define COLLECT_USAGE_REGISTER(reg, s) vm_collect_usage_register((reg), (s)) 23 #define COLLECT_USAGE_INSN(insn) 24 #define COLLECT_USAGE_OPERAND(insn, n, op) 25 #define COLLECT_USAGE_REGISTER(reg, s) 32 #define PUSH(x) (SET_SV(x), INC_SP(1)) 33 #define TOPN(n) (*(GET_SP()-(n)-1)) 34 #define POPN(n) (DEC_SP(n)) 35 #define POP() (DEC_SP(1)) 36 #define STACK_ADDR_FROM_TOP(n) (GET_SP()-(n)) 38 #define GET_TOS() (tos) 44 #define VM_REG_CFP (reg_cfp) 45 #define VM_REG_PC (VM_REG_CFP->pc) 46 #define VM_REG_SP (VM_REG_CFP->sp) 47 #define VM_REG_EP (VM_REG_CFP->ep) 49 #define RESTORE_REGS() do { \ 50 VM_REG_CFP = th->cfp; \ 69 #if VM_COLLECT_USAGE_DETAILS 70 #define COLLECT_USAGE_REGISTER_HELPER(a, b, v) \ 71 (COLLECT_USAGE_REGISTER((VM_REGAN_##a), (VM_REGAN_ACT_##b)), (v)) 73 #define COLLECT_USAGE_REGISTER_HELPER(a, b, v) (v) 77 #define GET_PC() (COLLECT_USAGE_REGISTER_HELPER(PC, GET, VM_REG_PC)) 78 #define SET_PC(x) (VM_REG_PC = (COLLECT_USAGE_REGISTER_HELPER(PC, SET, (x)))) 79 #define GET_CURRENT_INSN() (*GET_PC()) 80 #define GET_OPERAND(n) (GET_PC()[(n)]) 81 #define ADD_PC(n) (SET_PC(VM_REG_PC + (n))) 82 #define JUMP(dst) (VM_REG_PC += (dst)) 85 #define GET_CFP() (COLLECT_USAGE_REGISTER_HELPER(CFP, GET, VM_REG_CFP)) 86 #define GET_EP() (COLLECT_USAGE_REGISTER_HELPER(EP, GET, VM_REG_EP)) 87 #define SET_EP(x) (VM_REG_EP = (COLLECT_USAGE_REGISTER_HELPER(EP, SET, (x)))) 88 #define GET_LEP() (VM_EP_LEP(GET_EP())) 91 #define GET_SP() (COLLECT_USAGE_REGISTER_HELPER(SP, GET, VM_REG_SP)) 92 #define SET_SP(x) (VM_REG_SP = (COLLECT_USAGE_REGISTER_HELPER(SP, SET, (x)))) 93 #define INC_SP(x) (VM_REG_SP += (COLLECT_USAGE_REGISTER_HELPER(SP, SET, (x)))) 94 #define DEC_SP(x) (VM_REG_SP -= (COLLECT_USAGE_REGISTER_HELPER(SP, SET, (x)))) 95 #define SET_SV(x) (*GET_SP() = (x)) 98 #define GET_SP_COUNT() (VM_REG_SP - th->stack) 101 #define GET_ISEQ() (GET_CFP()->iseq) 107 #define GET_PREV_EP(ep) ((VALUE *)((ep)[VM_ENV_DATA_INDEX_SPECVAL] & ~0x03)) 109 #define GET_GLOBAL(entry) rb_gvar_get((struct rb_global_entry*)(entry)) 110 #define SET_GLOBAL(entry, val) rb_gvar_set((struct rb_global_entry*)(entry), (val)) 112 #define GET_CONST_INLINE_CACHE(dst) ((IC) * (GET_PC() + (dst) + 2)) 118 #define GET_SELF() (COLLECT_USAGE_REGISTER_HELPER(SELF, GET, GET_CFP()->self)) 124 #define CALL_METHOD(calling, ci, cc) do { \ 125 VALUE v = (*(cc)->call)(th, GET_CFP(), (calling), (ci), (cc)); \ 139 #ifndef OPT_CALL_FASTPATH 140 #define OPT_CALL_FASTPATH 1 143 #if OPT_CALL_FASTPATH 144 #define CI_SET_FASTPATH(cc, func, enabled) do { \ 145 if (LIKELY(enabled)) ((cc)->call = (func)); \ 148 #define CI_SET_FASTPATH(ci, func, enabled) 151 #define GET_BLOCK_HANDLER() (GET_LEP()[VM_ENV_DATA_INDEX_SPECVAL]) 163 #define FIXNUM_2_P(a, b) ((a) & (b) & 1) 165 #define FLONUM_2_P(a, b) (((((a)^2) | ((b)^2)) & 3) == 0) 167 #define FLONUM_2_P(a, b) 0 170 #ifndef USE_IC_FOR_SPECIALIZED_METHOD 171 #define USE_IC_FOR_SPECIALIZED_METHOD 1 174 #define CALL_SIMPLE_METHOD(recv_) do { \ 175 struct rb_calling_info calling; \ 176 calling.block_handler = VM_BLOCK_HANDLER_NONE; \ 177 calling.argc = ci->orig_argc; \ 178 vm_search_method(ci, cc, calling.recv = (recv_)); \ 179 CALL_METHOD(&calling, ci, cc); \ 182 #define NEXT_CLASS_SERIAL() (++ruby_vm_class_serial) 183 #define GET_GLOBAL_METHOD_STATE() (ruby_vm_global_method_state) 184 #define INC_GLOBAL_METHOD_STATE() (++ruby_vm_global_method_state) 185 #define GET_GLOBAL_CONSTANT_STATE() (ruby_vm_global_constant_state) 186 #define INC_GLOBAL_CONSTANT_STATE() (++ruby_vm_global_constant_state) static VALUE make_no_method_exception(VALUE exc, VALUE format, VALUE obj, int argc, const VALUE *argv, int priv)
VALUE rb_imemo_new(enum imemo_type type, VALUE v1, VALUE v2, VALUE v3, VALUE v0)
static int THROW_DATA_CONSUMED_P(const struct vm_throw_data *obj)
#define THROW_DATA_P(err)
#define THROW_DATA_CONSUMED
static const rb_control_frame_t * THROW_DATA_CATCH_FRAME(const struct vm_throw_data *obj)
static VALUE THROW_DATA_VAL(const struct vm_throw_data *obj)
const struct rb_control_frame_struct * catch_frame
static void THROW_DATA_CATCH_FRAME_SET(struct vm_throw_data *obj, const rb_control_frame_t *cfp)
static int THROW_DATA_STATE(const struct vm_throw_data *obj)
static void THROW_DATA_CONSUMED_SET(struct vm_throw_data *obj)
VALUE ruby_vm_const_missing_count
static void THROW_DATA_STATE_SET(struct vm_throw_data *obj, int st)
static struct vm_throw_data * THROW_DATA_NEW(VALUE val, const rb_control_frame_t *cf, VALUE st)