move rSYMBOLs from pic_state to codegen_state

This commit is contained in:
Yuichi Nishiwaki 2014-01-18 11:47:18 -08:00
parent 9495e9bf5c
commit 395f48bc81
3 changed files with 41 additions and 38 deletions

View File

@ -71,9 +71,6 @@ typedef struct {
pic_sym sQUASIQUOTE, sUNQUOTE, sUNQUOTE_SPLICING;
pic_sym sDEFINE_SYNTAX, sDEFINE_MACRO;
pic_sym sDEFINE_LIBRARY, sIMPORT, sEXPORT;
pic_sym rCONS, rCAR, rCDR, rNILP;
pic_sym rADD, rSUB, rMUL, rDIV;
pic_sym rEQ, rLT, rLE, rGT, rGE;
struct xhash *sym_tbl;
const char **sym_pool;

View File

@ -153,17 +153,45 @@ destroy_scope(pic_state *pic, codegen_scope *scope)
typedef struct codegen_state {
pic_state *pic;
codegen_scope *scope;
pic_sym rCONS, rCAR, rCDR, rNILP;
pic_sym rADD, rSUB, rMUL, rDIV;
pic_sym rEQ, rLT, rLE, rGT, rGE;
} codegen_state;
#define register_renamed_symbol(pic, state, slot, lib, name) do { \
struct xh_entry *e; \
if (! (e = xh_get(lib->senv->tbl, name))) \
pic_error(pic, "internal error! native VM procedure not found"); \
state->slot = e->val; \
} while (0)
static codegen_state *
new_codegen_state(pic_state *pic)
{
codegen_state *state;
struct pic_lib *stdlib;
state = (codegen_state *)pic_alloc(pic, sizeof(codegen_state));
state->pic = pic;
state->scope = new_global_scope(pic);
stdlib = pic_find_library(pic, pic_parse(pic, "(scheme base)"));
/* native VM procedures */
register_renamed_symbol(pic, state, rCONS, stdlib, "cons");
register_renamed_symbol(pic, state, rCAR, stdlib, "car");
register_renamed_symbol(pic, state, rCDR, stdlib, "cdr");
register_renamed_symbol(pic, state, rNILP, stdlib, "null?");
register_renamed_symbol(pic, state, rADD, stdlib, "+");
register_renamed_symbol(pic, state, rSUB, stdlib, "-");
register_renamed_symbol(pic, state, rMUL, stdlib, "*");
register_renamed_symbol(pic, state, rDIV, stdlib, "/");
register_renamed_symbol(pic, state, rEQ, stdlib, "=");
register_renamed_symbol(pic, state, rLT, stdlib, "<");
register_renamed_symbol(pic, state, rLE, stdlib, "<=");
register_renamed_symbol(pic, state, rGT, stdlib, ">");
register_renamed_symbol(pic, state, rGE, stdlib, ">=");
return state;
}
@ -475,7 +503,7 @@ codegen(codegen_state *state, pic_value obj, bool tailpos)
} \
} while (0)
else if (sym == pic->rCONS) {
else if (sym == state->rCONS) {
ARGC_ASSERT(2);
codegen(state, pic_car(pic, pic_cdr(pic, obj)), false);
codegen(state, pic_car(pic, pic_cdr(pic, pic_cdr(pic, obj))), false);
@ -483,21 +511,21 @@ codegen(codegen_state *state, pic_value obj, bool tailpos)
scope->clen++;
break;
}
else if (sym == pic->rCAR) {
else if (sym == state->rCAR) {
ARGC_ASSERT(1);
codegen(state, pic_car(pic, pic_cdr(pic, obj)), false);
scope->code[scope->clen].insn = OP_CAR;
scope->clen++;
break;
}
else if (sym == pic->rCDR) {
else if (sym == state->rCDR) {
ARGC_ASSERT(1);
codegen(state, pic_car(pic, pic_cdr(pic, obj)), false);
scope->code[scope->clen].insn = OP_CDR;
scope->clen++;
break;
}
else if (sym == pic->rNILP) {
else if (sym == state->rNILP) {
ARGC_ASSERT(1);
codegen(state, pic_car(pic, pic_cdr(pic, obj)), false);
scope->code[scope->clen].insn = OP_NILP;
@ -511,7 +539,7 @@ codegen(codegen_state *state, pic_value obj, bool tailpos)
} \
} while (0)
else if (sym == pic->rADD) {
else if (sym == state->rADD) {
pic_value args;
ARGC_ASSERT_GE(0);
@ -537,7 +565,7 @@ codegen(codegen_state *state, pic_value obj, bool tailpos)
}
break;
}
else if (sym == pic->rSUB) {
else if (sym == state->rSUB) {
pic_value args;
ARGC_ASSERT_GE(1);
@ -560,7 +588,7 @@ codegen(codegen_state *state, pic_value obj, bool tailpos)
}
break;
}
else if (sym == pic->rMUL) {
else if (sym == state->rMUL) {
pic_value args;
ARGC_ASSERT_GE(0);
@ -586,7 +614,7 @@ codegen(codegen_state *state, pic_value obj, bool tailpos)
}
break;
}
else if (sym == pic->rDIV) {
else if (sym == state->rDIV) {
pic_value args;
ARGC_ASSERT_GE(1);
@ -612,7 +640,7 @@ codegen(codegen_state *state, pic_value obj, bool tailpos)
}
break;
}
else if (sym == pic->rEQ) {
else if (sym == state->rEQ) {
ARGC_ASSERT(2);
codegen(state, pic_car(pic, pic_cdr(pic, obj)), false);
codegen(state, pic_car(pic, pic_cdr(pic, pic_cdr(pic, obj))), false);
@ -620,7 +648,7 @@ codegen(codegen_state *state, pic_value obj, bool tailpos)
scope->clen++;
break;
}
else if (sym == pic->rLT) {
else if (sym == state->rLT) {
ARGC_ASSERT(2);
codegen(state, pic_car(pic, pic_cdr(pic, obj)), false);
codegen(state, pic_car(pic, pic_cdr(pic, pic_cdr(pic, obj))), false);
@ -628,7 +656,7 @@ codegen(codegen_state *state, pic_value obj, bool tailpos)
scope->clen++;
break;
}
else if (sym == pic->rLE) {
else if (sym == state->rLE) {
ARGC_ASSERT(2);
codegen(state, pic_car(pic, pic_cdr(pic, obj)), false);
codegen(state, pic_car(pic, pic_cdr(pic, pic_cdr(pic, obj))), false);
@ -636,7 +664,7 @@ codegen(codegen_state *state, pic_value obj, bool tailpos)
scope->clen++;
break;
}
else if (sym == pic->rGT) {
else if (sym == state->rGT) {
ARGC_ASSERT(2);
codegen(state, pic_car(pic, pic_cdr(pic, pic_cdr(pic, obj))), false);
codegen(state, pic_car(pic, pic_cdr(pic, obj)), false);
@ -644,7 +672,7 @@ codegen(codegen_state *state, pic_value obj, bool tailpos)
scope->clen++;
break;
}
else if (sym == pic->rGE) {
else if (sym == state->rGE) {
ARGC_ASSERT(2);
codegen(state, pic_car(pic, pic_cdr(pic, pic_cdr(pic, obj))), false);
codegen(state, pic_car(pic, pic_cdr(pic, obj)), false);

View File

@ -74,13 +74,6 @@ pic_features(pic_state *pic)
return fs;
}
#define register_renamed_symbol(pic, slot, name) do { \
struct xh_entry *e; \
if (! (e = xh_get(pic->lib->senv->tbl, name))) \
pic_error(pic, "internal error! native VM procedure not found"); \
pic->slot = e->val; \
} while (0)
#define DONE pic_gc_arena_restore(pic, ai);
void
@ -122,21 +115,6 @@ pic_init_core(pic_state *pic)
pic_init_load(pic); DONE;
pic_init_write(pic); DONE;
/* native VM procedures */
register_renamed_symbol(pic, rCONS, "cons");
register_renamed_symbol(pic, rCAR, "car");
register_renamed_symbol(pic, rCDR, "cdr");
register_renamed_symbol(pic, rNILP, "null?");
register_renamed_symbol(pic, rADD, "+");
register_renamed_symbol(pic, rSUB, "-");
register_renamed_symbol(pic, rMUL, "*");
register_renamed_symbol(pic, rDIV, "/");
register_renamed_symbol(pic, rEQ, "=");
register_renamed_symbol(pic, rLT, "<");
register_renamed_symbol(pic, rLE, "<=");
register_renamed_symbol(pic, rGT, ">");
register_renamed_symbol(pic, rGE, ">=");
pic_load_stdlib(pic); DONE;
pic_defun(pic, "features", pic_features);