commit
e67996f8af
|
@ -530,6 +530,20 @@ gc_mark_trie(pic_state *pic, struct pic_trie *trie)
|
||||||
static void
|
static void
|
||||||
gc_mark_global_symbols(pic_state *pic)
|
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(sSYMBOLP); M(sPAIRP);
|
||||||
|
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(sCALL); M(sTAILCALL); M(sCALL_WITH_VALUES); M(sTAILCALL_WITH_VALUES);
|
||||||
|
M(sGREF); M(sLREF); M(sCREF); M(sRETURN);
|
||||||
|
|
||||||
M(rDEFINE); M(rLAMBDA); M(rIF); M(rBEGIN); M(rQUOTE); M(rSETBANG);
|
M(rDEFINE); M(rLAMBDA); M(rIF); M(rBEGIN); M(rQUOTE); M(rSETBANG);
|
||||||
M(rDEFINE_SYNTAX); M(rIMPORT); M(rEXPORT);
|
M(rDEFINE_SYNTAX); M(rIMPORT); M(rEXPORT);
|
||||||
M(rDEFINE_LIBRARY); M(rIN_LIBRARY);
|
M(rDEFINE_LIBRARY); M(rIN_LIBRARY);
|
||||||
|
@ -573,14 +587,9 @@ gc_mark_phase(pic_state *pic)
|
||||||
gc_mark_object(pic, pic->arena[j]);
|
gc_mark_object(pic, pic->arena[j]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* mark reserved uninterned symbols */
|
/* mark reserved symbols */
|
||||||
gc_mark_global_symbols(pic);
|
gc_mark_global_symbols(pic);
|
||||||
|
|
||||||
/* mark all interned symbols */
|
|
||||||
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);
|
||||||
|
@ -709,6 +718,31 @@ gc_finalize_object(pic_state *pic, struct pic_object *obj)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gc_sweep_symbols(pic_state *pic)
|
||||||
|
{
|
||||||
|
xh_entry *it;
|
||||||
|
xvect xv;
|
||||||
|
size_t i;
|
||||||
|
char *cstr;
|
||||||
|
|
||||||
|
xv_init(&xv, sizeof(xh_entry *));
|
||||||
|
|
||||||
|
for (it = xh_begin(&pic->syms); it != NULL; it = xh_next(it)) {
|
||||||
|
if (! gc_obj_is_marked((struct pic_object *)xh_val(it, pic_sym *))) {
|
||||||
|
xv_push(&xv, &it);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < xv_size(&xv); ++i) {
|
||||||
|
cstr = xh_key(*(xh_entry **)xv_get(&xv, i), char *);
|
||||||
|
|
||||||
|
xh_del_str(&pic->syms, cstr);
|
||||||
|
|
||||||
|
pic_free(pic, cstr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gc_sweep_page(pic_state *pic, struct heap_page *page)
|
gc_sweep_page(pic_state *pic, struct heap_page *page)
|
||||||
{
|
{
|
||||||
|
@ -775,6 +809,8 @@ gc_sweep_phase(pic_state *pic)
|
||||||
}
|
}
|
||||||
} while (it != NULL);
|
} while (it != NULL);
|
||||||
|
|
||||||
|
gc_sweep_symbols(pic);
|
||||||
|
|
||||||
while (page) {
|
while (page) {
|
||||||
gc_sweep_page(pic, page);
|
gc_sweep_page(pic, page);
|
||||||
page = page->next;
|
page = page->next;
|
||||||
|
|
Loading…
Reference in New Issue