From 473b7d0efd210290d1093201254fa32b5473d5d1 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Tue, 26 Sep 2017 16:09:07 +0900 Subject: Cut links from `irep` in heaps finalization. --- src/state.c | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) (limited to 'src/state.c') diff --git a/src/state.c b/src/state.c index 678f58e9c..463fa9059 100644 --- a/src/state.c +++ b/src/state.c @@ -134,6 +134,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; irlen; 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) { @@ -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; irlen; 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) { -- cgit v1.2.3