arena management

This commit is contained in:
Yuichi Nishiwaki 2014-01-18 22:35:36 -08:00
parent ae933252c9
commit 14eb6b334d
1 changed files with 25 additions and 2 deletions

View File

@ -281,11 +281,25 @@ new_cset(analyze_state *state, int depth, int idx, pic_value value)
return pic_list(state->pic, 4, pic_symbol_value(state->sCSET), pic_int_value(depth), pic_int_value(idx), value); return pic_list(state->pic, 4, pic_symbol_value(state->sCSET), pic_int_value(depth), pic_int_value(idx), value);
} }
static pic_value analyze_node(analyze_state *, pic_value, bool);
static pic_value analyze_call(analyze_state *, pic_value, bool); static pic_value analyze_call(analyze_state *, pic_value, bool);
static pic_value analyze_lambda(analyze_state *, pic_value); static pic_value analyze_lambda(analyze_state *, pic_value);
static pic_value static pic_value
analyze(analyze_state *state, pic_value obj, bool tailpos) analyze(analyze_state *state, pic_value obj, bool tailpos)
{
int ai = pic_gc_arena_preserve(state->pic);
pic_value res;
res = analyze_node(state, obj, tailpos);
pic_gc_arena_restore(state->pic, ai);
pic_gc_protect(state->pic, res);
return res;
}
static pic_value
analyze_node(analyze_state *state, pic_value obj, bool tailpos)
{ {
pic_state *pic = state->pic; pic_state *pic = state->pic;
analyze_scope *scope = state->scope; analyze_scope *scope = state->scope;
@ -603,6 +617,7 @@ static pic_value
analyze_call(analyze_state *state, pic_value obj, bool tailpos) analyze_call(analyze_state *state, pic_value obj, bool tailpos)
{ {
pic_state *pic = state->pic; pic_state *pic = state->pic;
int ai = pic_gc_arena_preserve(pic);
pic_value seq; pic_value seq;
pic_sym call; pic_sym call;
@ -615,13 +630,18 @@ analyze_call(analyze_state *state, pic_value obj, bool tailpos)
for (; ! pic_nil_p(seq); obj = pic_cdr(pic, obj)) { for (; ! pic_nil_p(seq); obj = pic_cdr(pic, obj)) {
seq = pic_cons(pic, analyze(state, pic_car(pic, obj), false), seq); seq = pic_cons(pic, analyze(state, pic_car(pic, obj), false), seq);
} }
return pic_reverse(pic, seq); seq = pic_reverse(pic, seq);
pic_gc_arena_restore(pic, ai);
pic_gc_protect(pic, seq);
return seq;
} }
static pic_value static pic_value
analyze_lambda(analyze_state *state, pic_value obj) analyze_lambda(analyze_state *state, pic_value obj)
{ {
pic_state *pic = state->pic; pic_state *pic = state->pic;
int ai = pic_gc_arena_preserve(pic);
pic_value args, body; pic_value args, body;
if (pic_length(pic, obj) < 2) { if (pic_length(pic, obj) < 2) {
@ -643,7 +663,10 @@ analyze_lambda(analyze_state *state, pic_value obj)
} }
pop_scope(state); pop_scope(state);
return pic_list(pic, 3, pic_symbol_value(pic->sLAMBDA), args, body); obj = pic_list(pic, 3, pic_symbol_value(pic->sLAMBDA), args, body);
pic_gc_arena_restore(pic, ai);
pic_gc_protect(pic, obj);
return obj;
} }
/** /**