コード例 #1
0
ファイル: state.c プロジェクト: omasanori/benz
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);
}
コード例 #2
0
ファイル: state.c プロジェクト: johnwcowan/picrin
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);
}