summaryrefslogtreecommitdiffhomepage
path: root/src/state.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-09-26 16:09:07 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2017-09-29 00:18:55 +0900
commit473b7d0efd210290d1093201254fa32b5473d5d1 (patch)
tree840fcced6dafbf87df7c883bb155196b91e96a93 /src/state.c
parent7b01b969f55b9666068104cde3c6c53106ba8080 (diff)
downloadmruby-473b7d0efd210290d1093201254fa32b5473d5d1.tar.gz
mruby-473b7d0efd210290d1093201254fa32b5473d5d1.zip
Cut links from `irep` in heaps finalization.
Diffstat (limited to 'src/state.c')
-rw-r--r--src/state.c27
1 files changed, 24 insertions, 3 deletions
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) {