void pic_close(pic_state *pic) { xh_entry *it; /* invoke exit handlers */ while (pic->wind) { if (pic->wind->out) { pic_apply0(pic, pic->wind->out); } pic->wind = pic->wind->prev; } /* free symbol names */ for (it = xh_begin(&pic->syms); it != NULL; it = xh_next(it)) { free(xh_key(it, char *)); } /* clear out root objects */ pic->sp = pic->stbase; pic->ci = pic->cibase; pic->xp = pic->xpbase; pic->arena_idx = 0; pic->err = pic_undef_value(); pic->globals = NULL; pic->macros = NULL; xh_clear(&pic->syms); xh_clear(&pic->attrs); pic->features = pic_nil_value(); pic->libs = pic_nil_value(); /* free all heap objects */ pic_gc_run(pic); /* free heaps */ pic_heap_close(pic->heap); /* free runtime context */ free(pic->stbase); free(pic->cibase); free(pic->xpbase); /* free reader struct */ xh_destroy(&pic->reader->labels); pic_trie_delete(pic, pic->reader->trie); free(pic->reader); /* free global stacks */ xh_destroy(&pic->syms); xh_destroy(&pic->attrs); /* free GC arena */ free(pic->arena); free(pic); }
void pic_close(pic_state *pic) { size_t i; /* free global stacks */ free(pic->stbase); free(pic->cibase); free(pic->rescue); free(pic->globals); xh_destroy(pic->sym_tbl); xh_destroy(pic->global_tbl); pic->glen = 0; pic->rlen = 0; pic->arena_idx = 0; pic->lib_tbl = pic_undef_value(); /* free all values */ pic_gc_run(pic); /* free heaps */ finalize_heap(pic->heap); free(pic->heap); /* free symbol names */ for (i = 0; i < pic->slen; ++i) { free((void *)pic->sym_pool[i]); } free(pic->sym_pool); PIC_BLK_DECREF(pic, pic->blk); free(pic); }