diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-09-26 16:09:07 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-09-29 00:18:55 +0900 |
| commit | 473b7d0efd210290d1093201254fa32b5473d5d1 (patch) | |
| tree | 840fcced6dafbf87df7c883bb155196b91e96a93 | |
| parent | 7b01b969f55b9666068104cde3c6c53106ba8080 (diff) | |
| download | mruby-473b7d0efd210290d1093201254fa32b5473d5d1.tar.gz mruby-473b7d0efd210290d1093201254fa32b5473d5d1.zip | |
Cut links from `irep` in heaps finalization.
| -rw-r--r-- | include/mruby/irep.h | 1 | ||||
| -rw-r--r-- | src/gc.c | 6 | ||||
| -rw-r--r-- | src/state.c | 27 |
3 files changed, 30 insertions, 4 deletions
diff --git a/include/mruby/irep.h b/include/mruby/irep.h index 2717b09c3..91ca8b54d 100644 --- a/include/mruby/irep.h +++ b/include/mruby/irep.h @@ -58,6 +58,7 @@ MRB_API mrb_value mrb_load_irep_cxt(mrb_state*, const uint8_t*, mrbc_context*); void mrb_irep_free(mrb_state*, struct mrb_irep*); void mrb_irep_incref(mrb_state*, struct mrb_irep*); void mrb_irep_decref(mrb_state*, struct mrb_irep*); +void mrb_irep_cutref(mrb_state*, struct mrb_irep*); MRB_END_DECL @@ -817,7 +817,11 @@ obj_free(mrb_state *mrb, struct RBasic *obj, int end) struct RProc *p = (struct RProc*)obj; if (!MRB_PROC_CFUNC_P(p) && p->body.irep) { - mrb_irep_decref(mrb, p->body.irep); + mrb_irep *irep = p->body.irep; + if (end) { + mrb_irep_cutref(mrb, irep); + } + mrb_irep_decref(mrb, irep); } } break; diff --git a/src/state.c b/src/state.c index 678f58e9c..463fa9059 100644 --- a/src/state.c +++ b/src/state.c @@ -135,6 +135,24 @@ mrb_irep_decref(mrb_state *mrb, mrb_irep *irep) } void +mrb_irep_cutref(mrb_state *mrb, mrb_irep *irep) +{ + mrb_irep *tmp; + int i; + + for (i=0; i<irep->rlen; i++) { + tmp = irep->reps[i]; + irep->reps[i] = NULL; + if (tmp) mrb_irep_decref(mrb, tmp); + } + if (irep->outer) { + tmp = irep->outer; + irep->outer = NULL; + if (tmp) mrb_irep_decref(mrb, tmp); + } +} + +void mrb_irep_free(mrb_state *mrb, mrb_irep *irep) { int i; @@ -155,10 +173,13 @@ mrb_irep_free(mrb_state *mrb, mrb_irep *irep) mrb_free(mrb, irep->pool); mrb_free(mrb, irep->syms); for (i=0; i<irep->rlen; i++) { - mrb_irep_decref(mrb, irep->reps[i]); + if (irep->reps[i]) + mrb_irep_decref(mrb, irep->reps[i]); + } + if (irep->outer) { + if (irep->outer) + mrb_irep_decref(mrb, irep->outer); } - if (irep->outer) - mrb_irep_decref(mrb, irep->outer); mrb_free(mrb, irep->reps); mrb_free(mrb, irep->lv); if (irep->own_filename) { |
