move symbol constants to pic_state

This commit is contained in:
Yuichi Nishiwaki 2015-01-19 14:35:42 +09:00
parent 772a5ceae5
commit b9df96499d
4 changed files with 36 additions and 45 deletions

View File

@ -41,8 +41,6 @@ typedef struct analyze_state {
pic_sym rADD, rSUB, rMUL, rDIV; pic_sym rADD, rSUB, rMUL, rDIV;
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 sGREF, sLREF, sCREF, sRETURN;
} analyze_state; } analyze_state;
static bool push_scope(analyze_state *, pic_value); static bool push_scope(analyze_state *, pic_value);
@ -91,15 +89,6 @@ new_analyze_state(pic_state *pic)
register_renamed_symbol(pic, state, rVALUES, pic->PICRIN_BASE, "values"); register_renamed_symbol(pic, state, rVALUES, pic->PICRIN_BASE, "values");
register_renamed_symbol(pic, state, rCALL_WITH_VALUES, pic->PICRIN_BASE, "call-with-values"); register_renamed_symbol(pic, state, rCALL_WITH_VALUES, pic->PICRIN_BASE, "call-with-values");
register_symbol(pic, state, sCALL, "call");
register_symbol(pic, state, sTAILCALL, "tail-call");
register_symbol(pic, state, sCALL_WITH_VALUES, "call-with-values");
register_symbol(pic, state, sTAILCALL_WITH_VALUES, "tailcall-with-values");
register_symbol(pic, state, sGREF, "gref");
register_symbol(pic, state, sLREF, "lref");
register_symbol(pic, state, sCREF, "cref");
register_symbol(pic, state, sRETURN, "return");
/* push initial scope */ /* push initial scope */
push_scope(state, pic_nil_value()); push_scope(state, pic_nil_value());
@ -280,11 +269,11 @@ analyze(analyze_state *state, pic_value obj, bool tailpos)
tag = pic_sym(pic_car(pic, res)); tag = pic_sym(pic_car(pic, res));
if (tailpos) { if (tailpos) {
if (tag == pic->sIF || tag == pic->sBEGIN || tag == state->sTAILCALL || tag == state->sTAILCALL_WITH_VALUES || tag == state->sRETURN) { if (tag == pic->sIF || tag == pic->sBEGIN || tag == pic->sTAILCALL || tag == pic->sTAILCALL_WITH_VALUES || tag == pic->sRETURN) {
/* pass through */ /* pass through */
} }
else { else {
res = pic_list2(pic, pic_obj_value(state->sRETURN), res); res = pic_list2(pic, pic_obj_value(pic->sRETURN), res);
} }
} }
@ -299,7 +288,7 @@ analyze_global_var(analyze_state *state, pic_sym sym)
{ {
pic_state *pic = state->pic; pic_state *pic = state->pic;
return pic_list2(pic, pic_obj_value(state->sGREF), pic_obj_value(sym)); return pic_list2(pic, pic_obj_value(pic->sGREF), pic_obj_value(sym));
} }
static pic_value static pic_value
@ -307,7 +296,7 @@ analyze_local_var(analyze_state *state, pic_sym sym)
{ {
pic_state *pic = state->pic; pic_state *pic = state->pic;
return pic_list2(pic, pic_obj_value(state->sLREF), pic_obj_value(sym)); return pic_list2(pic, pic_obj_value(pic->sLREF), pic_obj_value(sym));
} }
static pic_value static pic_value
@ -315,7 +304,7 @@ analyze_free_var(analyze_state *state, pic_sym sym, int depth)
{ {
pic_state *pic = state->pic; pic_state *pic = state->pic;
return pic_list3(pic, pic_obj_value(state->sCREF), pic_int_value(depth), pic_obj_value(sym)); return pic_list3(pic, pic_obj_value(pic->sCREF), pic_int_value(depth), pic_obj_value(sym));
} }
static pic_value static pic_value
@ -344,7 +333,7 @@ analyze_defer(analyze_state *state, pic_value name, pic_value formal, pic_value
const pic_sym sNOWHERE = pic_intern_cstr(pic, "<<nowhere>>"); const pic_sym sNOWHERE = pic_intern_cstr(pic, "<<nowhere>>");
pic_value skel; pic_value skel;
skel = pic_list2(pic, pic_obj_value(state->sGREF), pic_obj_value(sNOWHERE)); skel = pic_list2(pic, pic_obj_value(pic->sGREF), pic_obj_value(sNOWHERE));
pic_push(pic, pic_list4(pic, name, formal, body, skel), state->scope->defer); pic_push(pic, pic_list4(pic, name, formal, body, skel), state->scope->defer);
@ -666,9 +655,9 @@ analyze_call(analyze_state *state, pic_value obj, bool tailpos)
pic_sym call; pic_sym call;
if (! tailpos) { if (! tailpos) {
call = state->sCALL; call = pic->sCALL;
} else { } else {
call = state->sTAILCALL; call = pic->sTAILCALL;
} }
seq = pic_list1(pic, pic_obj_value(call)); seq = pic_list1(pic, pic_obj_value(call));
pic_for_each (elt, obj) { pic_for_each (elt, obj) {
@ -687,7 +676,7 @@ analyze_values(analyze_state *state, pic_value obj, bool tailpos)
return analyze_call(state, obj, false); return analyze_call(state, obj, false);
} }
seq = pic_list1(pic, pic_obj_value(state->sRETURN)); seq = pic_list1(pic, pic_obj_value(pic->sRETURN));
pic_for_each (v, pic_cdr(pic, obj)) { pic_for_each (v, pic_cdr(pic, obj)) {
seq = pic_cons(pic, analyze(state, v, false), seq); seq = pic_cons(pic, analyze(state, v, false), seq);
} }
@ -706,9 +695,9 @@ analyze_call_with_values(analyze_state *state, pic_value obj, bool tailpos)
} }
if (! tailpos) { if (! tailpos) {
call = state->sCALL_WITH_VALUES; call = pic->sCALL_WITH_VALUES;
} else { } else {
call = state->sTAILCALL_WITH_VALUES; call = pic->sTAILCALL_WITH_VALUES;
} }
prod = analyze(state, pic_list_ref(pic, obj, 1), false); prod = analyze(state, pic_list_ref(pic, obj, 1), false);
cnsm = analyze(state, pic_list_ref(pic, obj, 2), false); cnsm = analyze(state, pic_list_ref(pic, obj, 2), false);
@ -899,9 +888,6 @@ typedef struct codegen_context {
typedef struct codegen_state { typedef struct codegen_state {
pic_state *pic; pic_state *pic;
codegen_context *cxt; codegen_context *cxt;
pic_sym sGREF, sCREF, sLREF;
pic_sym sCALL, sTAILCALL, sRETURN;
pic_sym sCALL_WITH_VALUES, sTAILCALL_WITH_VALUES;
} codegen_state; } codegen_state;
static void push_codegen_context(codegen_state *, pic_value, pic_value, pic_value, bool, pic_value); static void push_codegen_context(codegen_state *, pic_value, pic_value, pic_value, bool, pic_value);
@ -916,15 +902,6 @@ new_codegen_state(pic_state *pic)
state->pic = pic; state->pic = pic;
state->cxt = NULL; state->cxt = NULL;
register_symbol(pic, state, sCALL, "call");
register_symbol(pic, state, sTAILCALL, "tail-call");
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, sCALL_WITH_VALUES, "call-with-values");
register_symbol(pic, state, sTAILCALL_WITH_VALUES, "tailcall-with-values");
push_codegen_context(state, pic_false_value(), pic_nil_value(), pic_nil_value(), false, pic_nil_value()); push_codegen_context(state, pic_false_value(), pic_nil_value(), pic_nil_value(), false, pic_nil_value());
return state; return state;
@ -1144,12 +1121,12 @@ codegen(codegen_state *state, pic_value obj)
pic_sym sym; pic_sym sym;
sym = pic_sym(pic_car(pic, obj)); sym = pic_sym(pic_car(pic, obj));
if (sym == state->sGREF) { if (sym == pic->sGREF) {
cxt->code[cxt->clen].insn = OP_GREF; cxt->code[cxt->clen].insn = OP_GREF;
cxt->code[cxt->clen].u.i = index_symbol(state, pic_sym(pic_list_ref(pic, obj, 1))); cxt->code[cxt->clen].u.i = index_symbol(state, pic_sym(pic_list_ref(pic, obj, 1)));
cxt->clen++; cxt->clen++;
return; return;
} else if (sym == state->sCREF) { } else if (sym == pic->sCREF) {
pic_sym name; pic_sym name;
int depth; int depth;
@ -1160,7 +1137,7 @@ codegen(codegen_state *state, pic_value obj)
cxt->code[cxt->clen].u.r.idx = index_capture(state, name, depth); cxt->code[cxt->clen].u.r.idx = index_capture(state, name, depth);
cxt->clen++; cxt->clen++;
return; return;
} else if (sym == state->sLREF) { } else if (sym == pic->sLREF) {
pic_sym name; pic_sym name;
int i; int i;
@ -1184,7 +1161,7 @@ codegen(codegen_state *state, pic_value obj)
var = pic_list_ref(pic, obj, 1); var = pic_list_ref(pic, obj, 1);
type = pic_sym(pic_list_ref(pic, var, 0)); type = pic_sym(pic_list_ref(pic, var, 0));
if (type == state->sGREF) { if (type == pic->sGREF) {
cxt->code[cxt->clen].insn = OP_GSET; cxt->code[cxt->clen].insn = OP_GSET;
cxt->code[cxt->clen].u.i = index_symbol(state, pic_sym(pic_list_ref(pic, var, 1))); cxt->code[cxt->clen].u.i = index_symbol(state, pic_sym(pic_list_ref(pic, var, 1)));
cxt->clen++; cxt->clen++;
@ -1192,7 +1169,7 @@ codegen(codegen_state *state, pic_value obj)
cxt->clen++; cxt->clen++;
return; return;
} }
else if (type == state->sCREF) { else if (type == pic->sCREF) {
pic_sym name; pic_sym name;
int depth; int depth;
@ -1206,7 +1183,7 @@ codegen(codegen_state *state, pic_value obj)
cxt->clen++; cxt->clen++;
return; return;
} }
else if (type == state->sLREF) { else if (type == pic->sLREF) {
pic_sym name; pic_sym name;
int i; int i;
@ -1427,19 +1404,19 @@ codegen(codegen_state *state, pic_value obj)
cxt->clen++; cxt->clen++;
return; return;
} }
else if (sym == state->sCALL || sym == state->sTAILCALL) { else if (sym == pic->sCALL || sym == pic->sTAILCALL) {
int len = (int)pic_length(pic, obj); int len = (int)pic_length(pic, obj);
pic_value elt; pic_value elt;
pic_for_each (elt, pic_cdr(pic, obj)) { pic_for_each (elt, pic_cdr(pic, obj)) {
codegen(state, elt); codegen(state, elt);
} }
cxt->code[cxt->clen].insn = (sym == state->sCALL) ? OP_CALL : OP_TAILCALL; cxt->code[cxt->clen].insn = (sym == pic->sCALL) ? OP_CALL : OP_TAILCALL;
cxt->code[cxt->clen].u.i = len - 1; cxt->code[cxt->clen].u.i = len - 1;
cxt->clen++; cxt->clen++;
return; return;
} }
else if (sym == state->sCALL_WITH_VALUES || sym == state->sTAILCALL_WITH_VALUES) { else if (sym == pic->sCALL_WITH_VALUES || sym == pic->sTAILCALL_WITH_VALUES) {
/* stack consumer at first */ /* stack consumer at first */
codegen(state, pic_list_ref(pic, obj, 2)); codegen(state, pic_list_ref(pic, obj, 2));
codegen(state, pic_list_ref(pic, obj, 1)); codegen(state, pic_list_ref(pic, obj, 1));
@ -1448,12 +1425,12 @@ codegen(codegen_state *state, pic_value obj)
cxt->code[cxt->clen].u.i = 1; cxt->code[cxt->clen].u.i = 1;
cxt->clen++; cxt->clen++;
/* call consumer */ /* call consumer */
cxt->code[cxt->clen].insn = (sym == state->sCALL_WITH_VALUES) ? OP_CALL : OP_TAILCALL; cxt->code[cxt->clen].insn = (sym == pic->sCALL_WITH_VALUES) ? OP_CALL : OP_TAILCALL;
cxt->code[cxt->clen].u.i = -1; cxt->code[cxt->clen].u.i = -1;
cxt->clen++; cxt->clen++;
return; return;
} }
else if (sym == state->sRETURN) { else if (sym == pic->sRETURN) {
int len = (int)pic_length(pic, obj); int len = (int)pic_length(pic, obj);
pic_value elt; pic_value elt;

View File

@ -539,6 +539,8 @@ gc_mark_global_symbols(pic_state *pic)
M(sADD); M(sSUB); M(sMUL); M(sDIV); M(sMINUS); M(sADD); M(sSUB); M(sMUL); M(sDIV); M(sMINUS);
M(sEQ); M(sLT); M(sLE); M(sGT); M(sGE); M(sNOT); M(sEQ); M(sLT); M(sLE); M(sGT); M(sGE); M(sNOT);
M(sREAD); M(sFILE); 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);

View File

@ -100,6 +100,9 @@ typedef struct {
pic_sym sADD, sSUB, sMUL, sDIV, sMINUS; pic_sym sADD, sSUB, sMUL, sDIV, sMINUS;
pic_sym sEQ, sLT, sLE, sGT, sGE, sNOT; pic_sym sEQ, sLT, sLE, sGT, sGE, sNOT;
pic_sym sREAD, sFILE; pic_sym sREAD, sFILE;
pic_sym sGREF, sCREF, sLREF;
pic_sym sCALL, sTAILCALL, sRETURN;
pic_sym sCALL_WITH_VALUES, sTAILCALL_WITH_VALUES;
pic_sym rDEFINE, rLAMBDA, rIF, rBEGIN, rQUOTE, rSETBANG; pic_sym rDEFINE, rLAMBDA, rIF, rBEGIN, rQUOTE, rSETBANG;
pic_sym rDEFINE_SYNTAX, rIMPORT, rEXPORT; pic_sym rDEFINE_SYNTAX, rIMPORT, rEXPORT;

View File

@ -132,6 +132,15 @@ pic_open(int argc, char *argv[], char **envp)
S(sNOT, "not"); S(sNOT, "not");
S(sREAD, "read"); S(sREAD, "read");
S(sFILE, "file"); S(sFILE, "file");
S(sCALL, "call");
S(sTAILCALL, "tail-call");
S(sGREF, "gref");
S(sLREF, "lref");
S(sCREF, "cref");
S(sRETURN, "return");
S(sCALL_WITH_VALUES, "call-with-values");
S(sTAILCALL_WITH_VALUES, "tailcall-with-values");
pic_gc_arena_restore(pic, ai); pic_gc_arena_restore(pic, ai);
#define R(slot,name) pic->slot = pic_gensym(pic, pic_intern_cstr(pic, name)); #define R(slot,name) pic->slot = pic_gensym(pic, pic_intern_cstr(pic, name));