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); }
struct object * pic_obj_alloc_unsafe(pic_state *pic, int type) { struct object *obj; if (pic->heap->pages == NULL) { heap_morecore(pic); } #if GC_STRESS pic_gc(pic); #endif obj = obj_alloc(pic, type); if (obj == NULL) { pic_gc(pic); obj = obj_alloc(pic, type); if (obj == NULL) pic_panic(pic, "GC memory exhausted"); } return obj; }
struct object * pic_obj_alloc_unsafe(pic_state *pic, int type) { struct object *obj; size_t size = type2size(type); if (pic->gc_count > PIC_GC_PERIOD) { pic_gc(pic); pic->gc_count -= PIC_GC_PERIOD; } obj = pic_malloc(pic, size); obj->tt = type; obj->next = pic->gc_head.next; pic->gc_head.next = obj; pic->gc_count += size; return obj; }