void pic_close(pic_state *pic) { pic_allocf allocf = pic->allocf; /* clear out root objects */ pic->cxt = &pic->default_cxt; pic->ai = 0; pic->halt = pic_invalid_value(pic); pic->globals = pic_invalid_value(pic); pic->features = pic_invalid_value(pic); pic->dyn_env = pic_invalid_value(pic); assert(pic->cxt->ai == 0); assert(pic->cxt->pc == NULL); assert(pic->cxt->fp == NULL); assert(pic->cxt->sp == NULL); assert(pic->cxt->irep == NULL); assert(pic->cxt->prev == NULL); /* free all heap objects */ pic_gc(pic); /* free heaps */ pic_heap_close(pic, pic->heap); /* free global stacks */ kh_destroy(oblist, &pic->oblist); /* free GC arena */ allocf(pic->userdata, pic->arena, 0); allocf(pic->userdata, pic, 0); }
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); }