diff options
| author | dearblue <[email protected]> | 2021-04-04 15:44:19 +0900 |
|---|---|---|
| committer | dearblue <[email protected]> | 2021-04-04 15:44:19 +0900 |
| commit | caeacea86ea1bb76dfc709359031a44f7528cb3a (patch) | |
| tree | 538d68ee91676e60df410de94197c151c457190e /mrbgems/mruby-catch | |
| parent | fb8e12f37c86cfbdc6a8c4fa3b327bae24a8ce27 (diff) | |
| download | mruby-caeacea86ea1bb76dfc709359031a44f7528cb3a.tar.gz mruby-caeacea86ea1bb76dfc709359031a44f7528cb3a.zip | |
Making a proc object static for a method with static irep
The following methods will be made static.
- `Class#new`
- `Proc#call`
- `Kernel#catch`
Previously, static const RProc could not be registered as a method, but this has been changed to allow it.
Diffstat (limited to 'mrbgems/mruby-catch')
| -rw-r--r-- | mrbgems/mruby-catch/src/catch.c | 16 |
1 files changed, 6 insertions, 10 deletions
diff --git a/mrbgems/mruby-catch/src/catch.c b/mrbgems/mruby-catch/src/catch.c index d910cac7f..148639530 100644 --- a/mrbgems/mruby-catch/src/catch.c +++ b/mrbgems/mruby-catch/src/catch.c @@ -61,21 +61,20 @@ static const mrb_irep catch_irep = { 29,0,3,1,0 }; -#define ID_PRESERVED_CATCH MRB_SYM(__preserved_catch_proc) +static const struct RProc catch_proc = { + NULL, NULL, MRB_TT_PROC, 7 /* GC_RED */, MRB_FL_OBJ_IS_FROZEN | MRB_PROC_SCOPE | MRB_PROC_STRICT, + { &catch_irep }, NULL, { NULL } +}; static const mrb_callinfo * find_catcher(mrb_state *mrb, mrb_value tag) { - mrb_value pval = mrb_obj_iv_get(mrb, (struct RObject *)mrb->kernel_module, ID_PRESERVED_CATCH); - mrb_assert(mrb_proc_p(pval)); - const struct RProc *proc = mrb_proc_ptr(pval); - const mrb_callinfo *ci = mrb->c->ci; size_t n = ci - mrb->c->cibase; ci--; for (; n > 0; n--, ci--) { const mrb_value *arg1 = ci->stack + 1; - if (ci->proc == proc && mrb_obj_eq(mrb, *arg1, tag)) { + if (ci->proc == &catch_proc && mrb_obj_eq(mrb, *arg1, tag)) { return ci; } } @@ -109,15 +108,12 @@ mrb_f_throw(mrb_state *mrb, mrb_value self) void mrb_mruby_catch_gem_init(mrb_state *mrb) { - struct RProc *p; mrb_method_t m; MRB_PRESYM_INIT_SYMBOLS(mrb, catch_syms_3); MRB_PRESYM_INIT_SYMBOLS(mrb, catch_syms_1); - p = mrb_proc_new(mrb, &catch_irep); - MRB_METHOD_FROM_PROC(m, p); + MRB_METHOD_FROM_PROC(m, &catch_proc); mrb_define_method_raw(mrb, mrb->kernel_module, MRB_SYM(catch), m); - mrb_obj_iv_set(mrb, (struct RObject *)mrb->kernel_module, ID_PRESERVED_CATCH, mrb_obj_value(p)); mrb_define_method(mrb, mrb->kernel_module, "throw", mrb_f_throw, MRB_ARGS_ARG(1,1)); } |
