summaryrefslogtreecommitdiffhomepage
path: root/src/state.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/state.c')
-rw-r--r--src/state.c37
1 files changed, 18 insertions, 19 deletions
diff --git a/src/state.c b/src/state.c
index 790f7ca13..1f85448a1 100644
--- a/src/state.c
+++ b/src/state.c
@@ -107,12 +107,14 @@ void mrb_free_symtbl(mrb_state *mrb);
void
mrb_irep_incref(mrb_state *mrb, mrb_irep *irep)
{
+ if (irep->flags & MRB_IREP_NO_FREE) return;
irep->refcnt++;
}
void
mrb_irep_decref(mrb_state *mrb, mrb_irep *irep)
{
+ if (irep->flags & MRB_IREP_NO_FREE) return;
irep->refcnt--;
if (irep->refcnt == 0) {
mrb_irep_free(mrb, irep);
@@ -122,12 +124,14 @@ mrb_irep_decref(mrb_state *mrb, mrb_irep *irep)
void
mrb_irep_cutref(mrb_state *mrb, mrb_irep *irep)
{
- mrb_irep *tmp;
+ mrb_irep **reps;
int i;
+ if (irep->flags & MRB_IREP_NO_FREE) return;
+ reps = (mrb_irep**)irep->reps;
for (i=0; i<irep->rlen; i++) {
- tmp = irep->reps[i];
- irep->reps[i] = NULL;
+ mrb_irep *tmp = reps[i];
+ reps[i] = NULL;
if (tmp) mrb_irep_decref(mrb, tmp);
}
}
@@ -137,29 +141,26 @@ mrb_irep_free(mrb_state *mrb, mrb_irep *irep)
{
int i;
+ if (irep->flags & MRB_IREP_NO_FREE) return;
if (!(irep->flags & MRB_ISEQ_NO_FREE))
mrb_free(mrb, (void*)irep->iseq);
- if (irep->pool) for (i=0; i<irep->plen; i++) {
- if (mrb_string_p(irep->pool[i])) {
- mrb_gc_free_str(mrb, RSTRING(irep->pool[i]));
- mrb_free(mrb, mrb_obj_ptr(irep->pool[i]));
+ if (irep->pool) {
+ for (i=0; i<irep->plen; i++) {
+ if ((irep->pool[i].tt & 3) == IREP_TT_STR) {
+ mrb_free(mrb, (void*)irep->pool[i].u.str);
+ }
}
-#if defined(MRB_WORD_BOXING) && !defined(MRB_WITHOUT_FLOAT)
- else if (mrb_float_p(irep->pool[i])) {
- mrb_free(mrb, mrb_obj_ptr(irep->pool[i]));
- }
-#endif
+ mrb_free(mrb, (void*)irep->pool);
}
- mrb_free(mrb, irep->pool);
- mrb_free(mrb, irep->syms);
+ mrb_free(mrb, (void*)irep->syms);
if (irep->reps) {
for (i=0; i<irep->rlen; i++) {
if (irep->reps[i])
- mrb_irep_decref(mrb, irep->reps[i]);
+ mrb_irep_decref(mrb, (mrb_irep*)irep->reps[i]);
}
+ mrb_free(mrb, (void*)irep->reps);
}
- mrb_free(mrb, irep->reps);
- mrb_free(mrb, irep->lv);
+ mrb_free(mrb, (void*)irep->lv);
mrb_debug_info_free(mrb, irep->debug_info);
mrb_free(mrb, irep);
}
@@ -170,8 +171,6 @@ mrb_free_context(mrb_state *mrb, struct mrb_context *c)
if (!c) return;
mrb_free(mrb, c->stbase);
mrb_free(mrb, c->cibase);
- mrb_free(mrb, c->rescue);
- mrb_free(mrb, c->ensure);
mrb_free(mrb, c);
}