diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2021-06-29 09:49:59 +0900 |
|---|---|---|
| committer | GitHub <[email protected]> | 2021-06-29 09:49:59 +0900 |
| commit | f09eb196da7a956afae2be75d99dd2b3955c2b28 (patch) | |
| tree | 071580ae70476899c928d136aac241d9bcbee8ef /src | |
| parent | f05f6963f87ac6632f5048575e9f0f76cc769a5a (diff) | |
| parent | 59201b59046b9e73c309508350cd3c0fafd20e4d (diff) | |
| download | mruby-f09eb196da7a956afae2be75d99dd2b3955c2b28.tar.gz mruby-f09eb196da7a956afae2be75d99dd2b3955c2b28.zip | |
Merge pull request #5497 from dearblue/drop-upper
Drop unnecessary upper procs linked from class/module/def syntax
Diffstat (limited to 'src')
| -rw-r--r-- | src/vm.c | 15 |
1 files changed, 15 insertions, 0 deletions
@@ -1068,6 +1068,19 @@ get_send_args(mrb_state *mrb, mrb_int argc, mrb_value *regs) return mrb_ary_new_from_values(mrb, argc, regs); } +static void +proc_adjust_upper(struct RProc *p) +{ + /* skip upper procs while unnamed blocks and method closures */ + while (p->upper) { + if (MRB_FLAG_TEST(p->upper, MRB_PROC_SCOPE) && + !MRB_FLAG_TEST(p->upper, MRB_PROC_STRICT)) { + break; + } + p->upper = p->upper->upper; + } +} + mrb_value mrb_obj_missing(mrb_state *mrb, mrb_value mod); void mrb_hash_check_kdict(mrb_state *mrb, mrb_value self); void mrb_method_added(mrb_state *mrb, struct RClass *c, mrb_sym mid); @@ -2718,6 +2731,7 @@ RETRY_TRY_BLOCK: p->flags |= MRB_PROC_SCOPE; } if (c & OP_L_STRICT) p->flags |= MRB_PROC_STRICT; + if (c == OP_L_METHOD) proc_adjust_upper(p); regs[a] = mrb_obj_value(p); mrb_gc_arena_restore(mrb, ai); NEXT; @@ -2812,6 +2826,7 @@ RETRY_TRY_BLOCK: mrb_field_write_barrier(mrb, (struct RBasic*)p, (struct RBasic*)proc); MRB_PROC_SET_TARGET_CLASS(p, mrb_class_ptr(recv)); p->flags |= MRB_PROC_SCOPE; + proc_adjust_upper(p); /* prepare call stack */ cipush(mrb, a, a, mrb_class_ptr(recv), p, 0, 0); |
