Automatically invoke code GC

slava 2006-10-16 21:43:11 +00:00
parent c91cd333e9
commit b5039442ab
2 changed files with 75 additions and 8 deletions

View File

@ -1,8 +1,7 @@
- auto-invoke code gc
- live search: timer delay would be nice
- help responder has no way to access { "foo" "bar" }
- httpd search tools
- code-gc instability with callbacks
- lock callbacks
+ ui:

View File

@ -208,18 +208,86 @@ CELL add_compiled_block(CELL code_format, F_VECTOR *code,
return start + sizeof(F_COMPILED);
}
#define FROB \
CELL code_format = to_cell(get(ds)); \
F_VECTOR *code = untag_vector(get(ds - CELLS)); \
F_VECTOR *words = untag_vector(get(ds - CELLS * 2)); \
F_VECTOR *literals = untag_vector(get(ds - CELLS * 3)); \
F_VECTOR *rel = untag_vector(get(ds - CELLS * 4)); \
CELL code_length = align8(untag_fixnum_fast(code->top) * code_format); \
CELL rel_length = untag_fixnum_fast(rel->top) * CELLS; \
CELL literal_length = untag_fixnum_fast(literals->top) * CELLS; \
CELL words_length = untag_fixnum_fast(words->top) * CELLS;
void primitive_add_compiled_block(void)
{
CELL code_format = to_cell(dpop());
F_VECTOR *code = untag_vector(dpop());
F_VECTOR *words = untag_vector(dpop());
F_VECTOR *literals = untag_vector(dpop());
F_VECTOR *rel = untag_vector(dpop());
CELL start;
{
/* read parameters from stack, leaving them on the stack */
FROB
/* try allocating a new code block */
CELL total_length = sizeof(F_COMPILED) + code_length
+ rel_length + literal_length + words_length;
start = heap_allot(&compiling,total_length);
/* if allocation failed, do a code GC */
if(start == 0)
{
garbage_collection(TENURED,true);
start = heap_allot(&compiling,total_length);
/* insufficient room even after code GC, give up */
if(start == 0)
critical_error("code heap exhausted",0);
}
}
/* we have to read the parameters again, since we may have called
code GC in which case the data heap semi-spaces will have switched */
FROB
/* now we can pop the parameters from the stack */
ds -= CELLS * 5;
/* begin depositing the code block's contents */
CELL here = start;
/* compiled header */
F_COMPILED header;
header.code_length = code_length;
header.reloc_length = rel_length;
header.literal_length = literal_length;
header.words_length = words_length;
header.finalized = false;
memcpy((void*)here,&header,sizeof(F_COMPILED));
here += sizeof(F_COMPILED);
/* code */
deposit_integers(here,code,code_format);
here += code_length;
/* relation info */
deposit_integers(here,rel,CELLS);
here += rel_length;
/* literals */
deposit_objects(here,literals,literal_length);
here += literal_length;
/* words */
deposit_objects(here,words,words_length);
here += words_length;
/* push the XT of the new word on the stack */
box_unsigned_cell(add_compiled_block(code_format,code,literals,words,rel));
box_unsigned_cell(start + sizeof(F_COMPILED));
}
#undef FROB
void primitive_finalize_compile(void)
{
F_ARRAY *array = untag_array(dpop());