dynamically allocate GC arena

This commit is contained in:
Yuichi Nishiwaki 2014-05-26 15:51:18 +09:00
parent 4bc38ace95
commit a003b42435
5 changed files with 17 additions and 5 deletions

View File

@ -105,7 +105,8 @@ typedef struct {
struct pic_jmpbuf *try_jmps; struct pic_jmpbuf *try_jmps;
struct pic_heap *heap; struct pic_heap *heap;
struct pic_object *arena[PIC_ARENA_SIZE]; struct pic_object **arena;
size_t arena_size;
int arena_idx; int arena_idx;
char *native_stack_start; char *native_stack_start;

View File

@ -26,7 +26,8 @@ struct pic_cont {
pic_code *ip; pic_code *ip;
struct pic_object *arena[PIC_ARENA_SIZE]; struct pic_object **arena;
size_t arena_size;
int arena_idx; int arena_idx;
pic_value results; pic_value results;

View File

@ -139,7 +139,9 @@ save_cont(pic_state *pic, struct pic_cont **c)
cont->ip = pic->ip; cont->ip = pic->ip;
cont->arena_idx = pic->arena_idx; cont->arena_idx = pic->arena_idx;
memcpy(cont->arena, pic->arena, sizeof(struct pic_object *) * PIC_ARENA_SIZE); cont->arena_size = pic->arena_size;
cont->arena = (struct pic_object **)pic_alloc(pic, sizeof(struct pic_object *) * pic->arena_size);
memcpy(cont->arena, pic->arena, sizeof(struct pic_object *) * pic->arena_size);
cont->results = pic_undef_value(); cont->results = pic_undef_value();
} }
@ -182,7 +184,9 @@ restore_cont(pic_state *pic, struct pic_cont *cont)
pic->ip = cont->ip; pic->ip = cont->ip;
memcpy(pic->arena, cont->arena, sizeof(struct pic_object *) * PIC_ARENA_SIZE); pic->arena = (struct pic_object **)pic_realloc(pic, pic->arena, sizeof(struct pic_object *) * cont->arena_size);
memcpy(pic->arena, cont->arena, sizeof(struct pic_object *) * cont->arena_size);
pic->arena_size = cont->arena_size;
pic->arena_idx = cont->arena_idx; pic->arena_idx = cont->arena_idx;
memcpy(cont->stk_pos, cont->stk_ptr, cont->stk_len); memcpy(cont->stk_pos, cont->stk_ptr, cont->stk_len);

View File

@ -179,7 +179,7 @@ pic_free(pic_state *pic, void *ptr)
static void static void
gc_protect(pic_state *pic, struct pic_object *obj) gc_protect(pic_state *pic, struct pic_object *obj)
{ {
if (pic->arena_idx >= PIC_ARENA_SIZE) { if (pic->arena_idx >= pic->arena_size) {
pic_abort(pic, "arena overflow"); pic_abort(pic, "arena overflow");
} }
pic->arena[pic->arena_idx++] = obj; pic->arena[pic->arena_idx++] = obj;
@ -618,6 +618,7 @@ gc_finalize_object(pic_state *pic, struct pic_object *obj)
pic_free(pic, cont->stk_ptr); pic_free(pic, cont->stk_ptr);
pic_free(pic, cont->st_ptr); pic_free(pic, cont->st_ptr);
pic_free(pic, cont->ci_ptr); pic_free(pic, cont->ci_ptr);
pic_free(pic, cont->arena);
PIC_BLK_DECREF(pic, cont->blk); PIC_BLK_DECREF(pic, cont->blk);
break; break;
} }

View File

@ -70,6 +70,8 @@ pic_open(int argc, char *argv[], char **envp)
pic->try_jmps = NULL; pic->try_jmps = NULL;
/* GC arena */ /* GC arena */
pic->arena = (struct pic_object **)calloc(PIC_ARENA_SIZE, sizeof(struct pic_object **));
pic->arena_size = PIC_ARENA_SIZE;
pic->arena_idx = 0; pic->arena_idx = 0;
/* native stack marker */ /* native stack marker */
@ -153,6 +155,9 @@ pic_close(pic_state *pic)
xh_destroy(&pic->global_tbl); xh_destroy(&pic->global_tbl);
xh_destroy(&pic->macros); xh_destroy(&pic->macros);
/* free GC arena */
free(pic->arena);
/* free symbol names */ /* free symbol names */
xh_begin(&it, &pic->sym_names); xh_begin(&it, &pic->sym_names);
while (xh_next(&it)) { while (xh_next(&it)) {