distinguish lref and cref at analysis stage
This commit is contained in:
parent
0bcb970842
commit
312c977c17
|
@ -30,7 +30,7 @@ typedef struct analyze_state {
|
||||||
pic_sym rEQ, rLT, rLE, rGT, rGE, rNOT;
|
pic_sym rEQ, rLT, rLE, rGT, rGE, rNOT;
|
||||||
pic_sym rVALUES, rCALL_WITH_VALUES;
|
pic_sym rVALUES, rCALL_WITH_VALUES;
|
||||||
pic_sym sCALL, sTAILCALL, sCALL_WITH_VALUES, sTAILCALL_WITH_VALUES;
|
pic_sym sCALL, sTAILCALL, sCALL_WITH_VALUES, sTAILCALL_WITH_VALUES;
|
||||||
pic_sym sREF, sGREF, sRETURN;
|
pic_sym sGREF, sLREF, sCREF, sRETURN;
|
||||||
} analyze_state;
|
} analyze_state;
|
||||||
|
|
||||||
static bool push_scope(analyze_state *, pic_value);
|
static bool push_scope(analyze_state *, pic_value);
|
||||||
|
@ -83,8 +83,9 @@ new_analyze_state(pic_state *pic)
|
||||||
register_symbol(pic, state, sTAILCALL, "tail-call");
|
register_symbol(pic, state, sTAILCALL, "tail-call");
|
||||||
register_symbol(pic, state, sCALL_WITH_VALUES, "call-with-values");
|
register_symbol(pic, state, sCALL_WITH_VALUES, "call-with-values");
|
||||||
register_symbol(pic, state, sTAILCALL_WITH_VALUES, "tailcall-with-values");
|
register_symbol(pic, state, sTAILCALL_WITH_VALUES, "tailcall-with-values");
|
||||||
register_symbol(pic, state, sREF, "ref");
|
|
||||||
register_symbol(pic, state, sGREF, "gref");
|
register_symbol(pic, state, sGREF, "gref");
|
||||||
|
register_symbol(pic, state, sLREF, "lref");
|
||||||
|
register_symbol(pic, state, sCREF, "cref");
|
||||||
register_symbol(pic, state, sRETURN, "return");
|
register_symbol(pic, state, sRETURN, "return");
|
||||||
|
|
||||||
/* push initial scope */
|
/* push initial scope */
|
||||||
|
@ -249,15 +250,6 @@ define_var(analyze_state *state, pic_sym sym)
|
||||||
xv_push(&scope->locals, &sym);
|
xv_push(&scope->locals, &sym);
|
||||||
}
|
}
|
||||||
|
|
||||||
static pic_value
|
|
||||||
new_ref(analyze_state *state, int depth, pic_sym sym)
|
|
||||||
{
|
|
||||||
return pic_list3(state->pic,
|
|
||||||
pic_symbol_value(state->sREF),
|
|
||||||
pic_int_value(depth),
|
|
||||||
pic_symbol_value(sym));
|
|
||||||
}
|
|
||||||
|
|
||||||
static pic_value analyze_node(analyze_state *, pic_value, bool);
|
static pic_value analyze_node(analyze_state *, pic_value, bool);
|
||||||
|
|
||||||
static pic_value
|
static pic_value
|
||||||
|
@ -305,6 +297,22 @@ analyze_global_var(analyze_state *state, pic_sym sym)
|
||||||
return pic_list2(pic, pic_symbol_value(state->sGREF), pic_int_value(i));
|
return pic_list2(pic, pic_symbol_value(state->sGREF), pic_int_value(i));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static pic_value
|
||||||
|
analyze_local_var(analyze_state *state, pic_sym sym)
|
||||||
|
{
|
||||||
|
pic_state *pic = state->pic;
|
||||||
|
|
||||||
|
return pic_list2(pic, pic_symbol_value(state->sLREF), pic_sym_value(sym));
|
||||||
|
}
|
||||||
|
|
||||||
|
static pic_value
|
||||||
|
analyze_free_var(analyze_state *state, pic_sym sym, int depth)
|
||||||
|
{
|
||||||
|
pic_state *pic = state->pic;
|
||||||
|
|
||||||
|
return pic_list3(pic, pic_symbol_value(state->sCREF), pic_int_value(depth), pic_sym_value(sym));
|
||||||
|
}
|
||||||
|
|
||||||
static pic_value
|
static pic_value
|
||||||
analyze_var(analyze_state *state, pic_value obj)
|
analyze_var(analyze_state *state, pic_value obj)
|
||||||
{
|
{
|
||||||
|
@ -319,8 +327,11 @@ analyze_var(analyze_state *state, pic_value obj)
|
||||||
|
|
||||||
if (depth == state->scope->depth) {
|
if (depth == state->scope->depth) {
|
||||||
return analyze_global_var(state, sym);
|
return analyze_global_var(state, sym);
|
||||||
|
} else if (depth == 0) {
|
||||||
|
return analyze_local_var(state, sym);
|
||||||
|
} else {
|
||||||
|
return analyze_free_var(state, sym, depth);
|
||||||
}
|
}
|
||||||
return new_ref(state, depth, sym);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static pic_value
|
static pic_value
|
||||||
|
@ -810,7 +821,6 @@ typedef struct resolver_scope {
|
||||||
typedef struct resolver_state {
|
typedef struct resolver_state {
|
||||||
pic_state *pic;
|
pic_state *pic;
|
||||||
resolver_scope *scope;
|
resolver_scope *scope;
|
||||||
pic_sym sREF;
|
|
||||||
pic_sym sGREF, sCREF, sLREF;
|
pic_sym sGREF, sCREF, sLREF;
|
||||||
} resolver_state;
|
} resolver_state;
|
||||||
|
|
||||||
|
@ -826,7 +836,6 @@ new_resolver_state(pic_state *pic)
|
||||||
state->pic = pic;
|
state->pic = pic;
|
||||||
state->scope = NULL;
|
state->scope = NULL;
|
||||||
|
|
||||||
register_symbol(pic, state, sREF, "ref");
|
|
||||||
register_symbol(pic, state, sGREF, "gref");
|
register_symbol(pic, state, sGREF, "gref");
|
||||||
register_symbol(pic, state, sLREF, "lref");
|
register_symbol(pic, state, sLREF, "lref");
|
||||||
register_symbol(pic, state, sCREF, "cref");
|
register_symbol(pic, state, sCREF, "cref");
|
||||||
|
@ -953,18 +962,24 @@ resolve_reference_node(resolver_state *state, pic_value obj)
|
||||||
return obj;
|
return obj;
|
||||||
|
|
||||||
tag = pic_sym(pic_car(pic, obj));
|
tag = pic_sym(pic_car(pic, obj));
|
||||||
if (tag == state->sREF) {
|
if (tag == state->sLREF) {
|
||||||
|
pic_sym sym;
|
||||||
|
|
||||||
|
sym = pic_sym(pic_list_ref(pic, obj, 1));
|
||||||
|
if (! is_closed(state, sym)) {
|
||||||
|
return resolve_lref(state, sym);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return resolve_cref(state, 0, sym);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (tag == state->sCREF) {
|
||||||
int depth;
|
int depth;
|
||||||
pic_sym sym;
|
pic_sym sym;
|
||||||
|
|
||||||
depth = pic_int(pic_list_ref(pic, obj, 1));
|
depth = pic_int(pic_list_ref(pic, obj, 1));
|
||||||
sym = pic_sym(pic_list_ref(pic, obj, 2));
|
sym = pic_sym(pic_list_ref(pic, obj, 2));
|
||||||
if (depth == 0 && ! is_closed(state, sym)) {
|
return resolve_cref(state, depth, sym);
|
||||||
return resolve_lref(state, sym);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return resolve_cref(state, depth, sym);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (tag == pic->sLAMBDA) {
|
else if (tag == pic->sLAMBDA) {
|
||||||
pic_value args, locals, closes, body;
|
pic_value args, locals, closes, body;
|
||||||
|
|
Loading…
Reference in New Issue