diff --git a/include/mruby/proc.h b/include/mruby/proc.h index bd1b5a705..eca064946 100644 --- a/include/mruby/proc.h +++ b/include/mruby/proc.h @@ -135,71 +135,11 @@ MRB_API mrb_value mrb_proc_cfunc_env_get(mrb_state *mrb, mrb_int idx); MRB_API mrb_value mrb_load_proc(mrb_state *mrb, const struct RProc *proc); -static inline void -mrb_vm_ci_proc_set(mrb_callinfo *ci, const struct RProc *p) -{ - ci->proc = p; - ci->pc = (p && !MRB_PROC_CFUNC_P(p)) ? p->body.irep->iseq : NULL; -} - -static inline struct RClass * -mrb_vm_ci_target_class(const mrb_callinfo *ci) -{ - if (ci->u.env && ci->u.env->tt == MRB_TT_ENV) { - return ci->u.env->c; - } - else { - return ci->u.target_class; - } -} - -static inline void -mrb_vm_ci_target_class_set(mrb_callinfo *ci, struct RClass *tc) -{ - struct REnv *e = ci->u.env; - if (e && e->tt == MRB_TT_ENV) { - e->c = tc; - } - else { - ci->u.target_class = tc; - } -} - -static inline struct REnv * -mrb_vm_ci_env(const mrb_callinfo *ci) -{ - if (ci->u.env && ci->u.env->tt == MRB_TT_ENV) { - return ci->u.env; - } - else { - return NULL; - } -} - -static inline void -mrb_vm_ci_env_set(mrb_callinfo *ci, struct REnv *e) -{ - if (ci->u.env) { - if (ci->u.env->tt == MRB_TT_ENV) { - if (e) { - e->c = ci->u.env->c; - ci->u.env = e; - } - else { - ci->u.target_class = ci->u.env->c; - } - } - else { - if (e) { - e->c = ci->u.target_class; - ci->u.env = e; - } - } - } - else { - ci->u.env = e; - } -} +void mrb_vm_ci_proc_set(mrb_callinfo *ci, const struct RProc *p); +struct RClass * mrb_vm_ci_target_class(const mrb_callinfo *ci); +void mrb_vm_ci_target_class_set(mrb_callinfo *ci, struct RClass *tc); +struct REnv * mrb_vm_ci_env(const mrb_callinfo *ci); +void mrb_vm_ci_env_set(mrb_callinfo *ci, struct REnv *e); MRB_END_DECL diff --git a/src/vm.c b/src/vm.c index 25f43b0ed..63c11b891 100644 --- a/src/vm.c +++ b/src/vm.c @@ -260,6 +260,72 @@ top_proc(mrb_state *mrb, const struct RProc *proc) return proc; } +void +mrb_vm_ci_proc_set(mrb_callinfo *ci, const struct RProc *p) +{ + ci->proc = p; + ci->pc = (p && !MRB_PROC_CFUNC_P(p)) ? p->body.irep->iseq : NULL; +} + +struct RClass * +mrb_vm_ci_target_class(const mrb_callinfo *ci) +{ + if (ci->u.env && ci->u.env->tt == MRB_TT_ENV) { + return ci->u.env->c; + } + else { + return ci->u.target_class; + } +} + +void +mrb_vm_ci_target_class_set(mrb_callinfo *ci, struct RClass *tc) +{ + struct REnv *e = ci->u.env; + if (e && e->tt == MRB_TT_ENV) { + e->c = tc; + } + else { + ci->u.target_class = tc; + } +} + +struct REnv * +mrb_vm_ci_env(const mrb_callinfo *ci) +{ + if (ci->u.env && ci->u.env->tt == MRB_TT_ENV) { + return ci->u.env; + } + else { + return NULL; + } +} + +void +mrb_vm_ci_env_set(mrb_callinfo *ci, struct REnv *e) +{ + if (ci->u.env) { + if (ci->u.env->tt == MRB_TT_ENV) { + if (e) { + e->c = ci->u.env->c; + ci->u.env = e; + } + else { + ci->u.target_class = ci->u.env->c; + } + } + else { + if (e) { + e->c = ci->u.target_class; + ci->u.env = e; + } + } + } + else { + ci->u.env = e; + } +} + #define CINFO_NONE 0 #define CINFO_SKIP 1 #define CINFO_DIRECT 2