turn on GC
This commit is contained in:
parent
ccc7a2beed
commit
ca69048513
|
@ -390,6 +390,8 @@ gc_mark_object(pic_state *pic, struct pic_object *obj)
|
||||||
}
|
}
|
||||||
if (pic_proc_irep_p(proc)) {
|
if (pic_proc_irep_p(proc)) {
|
||||||
gc_mark_object(pic, (struct pic_object *)proc->u.irep);
|
gc_mark_object(pic, (struct pic_object *)proc->u.irep);
|
||||||
|
} else {
|
||||||
|
gc_mark_object(pic, (struct pic_object *)proc->u.func.name);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -398,7 +400,8 @@ gc_mark_object(pic_state *pic, struct pic_object *obj)
|
||||||
}
|
}
|
||||||
case PIC_TT_ERROR: {
|
case PIC_TT_ERROR: {
|
||||||
struct pic_error *err = (struct pic_error *)obj;
|
struct pic_error *err = (struct pic_error *)obj;
|
||||||
gc_mark_object(pic,(struct pic_object *)err->msg);
|
gc_mark_object(pic, (struct pic_object *)err->type);
|
||||||
|
gc_mark_object(pic, (struct pic_object *)err->msg);
|
||||||
gc_mark(pic, err->irrs);
|
gc_mark(pic, err->irrs);
|
||||||
gc_mark_object(pic, (struct pic_object *)err->stack);
|
gc_mark_object(pic, (struct pic_object *)err->stack);
|
||||||
break;
|
break;
|
||||||
|
@ -443,6 +446,9 @@ gc_mark_object(pic_state *pic, struct pic_object *obj)
|
||||||
for (i = 0; i < irep->plen; ++i) {
|
for (i = 0; i < irep->plen; ++i) {
|
||||||
gc_mark(pic, irep->pool[i]);
|
gc_mark(pic, irep->pool[i]);
|
||||||
}
|
}
|
||||||
|
for (i = 0; i < irep->slen; ++i) {
|
||||||
|
gc_mark_object(pic, (struct pic_object *)irep->syms[i]);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PIC_TT_DATA: {
|
case PIC_TT_DATA: {
|
||||||
|
@ -462,6 +468,7 @@ gc_mark_object(pic_state *pic, struct pic_object *obj)
|
||||||
xh_entry *it;
|
xh_entry *it;
|
||||||
|
|
||||||
for (it = xh_begin(&dict->hash); it != NULL; it = xh_next(it)) {
|
for (it = xh_begin(&dict->hash); it != NULL; it = xh_next(it)) {
|
||||||
|
gc_mark_object(pic, (struct pic_object *)xh_key(it, pic_sym));
|
||||||
gc_mark(pic, xh_val(it, pic_value));
|
gc_mark(pic, xh_val(it, pic_value));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -516,6 +523,28 @@ gc_mark_trie(pic_state *pic, struct pic_trie *trie)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define M(x) gc_mark_object(pic, (struct pic_object *)pic->x)
|
||||||
|
|
||||||
|
static void
|
||||||
|
gc_mark_global_symbols(pic_state *pic)
|
||||||
|
{
|
||||||
|
M(sDEFINE); M(sLAMBDA); M(sIF); M(sBEGIN); M(sQUOTE); M(sSETBANG);
|
||||||
|
M(sQUASIQUOTE); M(sUNQUOTE); M(sUNQUOTE_SPLICING);
|
||||||
|
M(sDEFINE_SYNTAX); M(sIMPORT); M(sEXPORT);
|
||||||
|
M(sDEFINE_LIBRARY); M(sIN_LIBRARY);
|
||||||
|
M(sCOND_EXPAND); M(sAND); M(sOR); M(sELSE); M(sLIBRARY);
|
||||||
|
M(sONLY); M(sRENAME); M(sPREFIX); M(sEXCEPT);
|
||||||
|
M(sCONS); M(sCAR); M(sCDR); M(sNILP);
|
||||||
|
M(sSYMBOL_P); M(sPAIR_P);
|
||||||
|
M(sADD); M(sSUB); M(sMUL); M(sDIV); M(sMINUS);
|
||||||
|
M(sEQ); M(sLT); M(sLE); M(sGT); M(sGE); M(sNOT);
|
||||||
|
M(sREAD); M(sFILE);
|
||||||
|
M(rDEFINE); M(rLAMBDA); M(rIF); M(rBEGIN); M(rQUOTE); M(rSETBANG);
|
||||||
|
M(rDEFINE_SYNTAX); M(rIMPORT); M(rEXPORT);
|
||||||
|
M(rDEFINE_LIBRARY); M(rIN_LIBRARY);
|
||||||
|
M(rCOND_EXPAND);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gc_mark_phase(pic_state *pic)
|
gc_mark_phase(pic_state *pic)
|
||||||
{
|
{
|
||||||
|
@ -553,6 +582,13 @@ gc_mark_phase(pic_state *pic)
|
||||||
gc_mark_object(pic, pic->arena[j]);
|
gc_mark_object(pic, pic->arena[j]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gc_mark_global_symbols(pic);
|
||||||
|
|
||||||
|
/* symbol table */
|
||||||
|
for (it = xh_begin(&pic->syms); it != NULL; it = xh_next(it)) {
|
||||||
|
gc_mark_object(pic, (struct pic_object *)xh_val(it, pic_sym));
|
||||||
|
}
|
||||||
|
|
||||||
/* global variables */
|
/* global variables */
|
||||||
if (pic->globals) {
|
if (pic->globals) {
|
||||||
gc_mark_object(pic, (struct pic_object *)pic->globals);
|
gc_mark_object(pic, (struct pic_object *)pic->globals);
|
||||||
|
@ -814,7 +850,7 @@ pic_obj_alloc_unsafe(pic_state *pic, size_t size, enum pic_tt tt)
|
||||||
|
|
||||||
obj = (struct pic_object *)gc_alloc(pic, size);
|
obj = (struct pic_object *)gc_alloc(pic, size);
|
||||||
if (obj == NULL) {
|
if (obj == NULL) {
|
||||||
/* pic_gc_run(pic); */
|
pic_gc_run(pic);
|
||||||
obj = (struct pic_object *)gc_alloc(pic, size);
|
obj = (struct pic_object *)gc_alloc(pic, size);
|
||||||
if (obj == NULL) {
|
if (obj == NULL) {
|
||||||
add_heap_page(pic);
|
add_heap_page(pic);
|
||||||
|
|
|
@ -202,6 +202,11 @@ pic_close(pic_state *pic)
|
||||||
pic->wind = pic->wind->prev;
|
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 */
|
/* clear out root objects */
|
||||||
pic->sp = pic->stbase;
|
pic->sp = pic->stbase;
|
||||||
pic->ci = pic->cibase;
|
pic->ci = pic->cibase;
|
||||||
|
@ -210,6 +215,7 @@ pic_close(pic_state *pic)
|
||||||
pic->err = pic_undef_value();
|
pic->err = pic_undef_value();
|
||||||
pic->globals = NULL;
|
pic->globals = NULL;
|
||||||
pic->macros = NULL;
|
pic->macros = NULL;
|
||||||
|
xh_clear(&pic->syms);
|
||||||
xh_clear(&pic->attrs);
|
xh_clear(&pic->attrs);
|
||||||
pic->features = pic_nil_value();
|
pic->features = pic_nil_value();
|
||||||
pic->libs = pic_nil_value();
|
pic->libs = pic_nil_value();
|
||||||
|
@ -230,11 +236,6 @@ pic_close(pic_state *pic)
|
||||||
pic_trie_delete(pic, pic->reader->trie);
|
pic_trie_delete(pic, pic->reader->trie);
|
||||||
free(pic->reader);
|
free(pic->reader);
|
||||||
|
|
||||||
/* free symbol names */
|
|
||||||
for (it = xh_begin(&pic->syms); it != NULL; it = xh_next(it)) {
|
|
||||||
free(xh_key(it, char *));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* free global stacks */
|
/* free global stacks */
|
||||||
xh_destroy(&pic->syms);
|
xh_destroy(&pic->syms);
|
||||||
xh_destroy(&pic->attrs);
|
xh_destroy(&pic->attrs);
|
||||||
|
|
Loading…
Reference in New Issue