Merge branch 'analyzer'

This commit is contained in:
Yuichi Nishiwaki 2014-01-30 13:28:44 +09:00
commit 6de7d610ee
11 changed files with 1145 additions and 700 deletions

View File

@ -71,9 +71,9 @@ typedef struct {
pic_sym sQUASIQUOTE, sUNQUOTE, sUNQUOTE_SPLICING; pic_sym sQUASIQUOTE, sUNQUOTE, sUNQUOTE_SPLICING;
pic_sym sDEFINE_SYNTAX, sDEFINE_MACRO; pic_sym sDEFINE_SYNTAX, sDEFINE_MACRO;
pic_sym sDEFINE_LIBRARY, sIMPORT, sEXPORT; pic_sym sDEFINE_LIBRARY, sIMPORT, sEXPORT;
pic_sym rCONS, rCAR, rCDR, rNILP; pic_sym sCONS, sCAR, sCDR, sNILP;
pic_sym rADD, rSUB, rMUL, rDIV; pic_sym sADD, sSUB, sMUL, sDIV, sMINUS;
pic_sym rEQ, rLT, rLE, rGT, rGE; pic_sym sEQ, sLT, sLE, sGT, sGE;
struct xhash *sym_tbl; struct xhash *sym_tbl;
const char **sym_pool; const char **sym_pool;
@ -152,7 +152,7 @@ pic_value pic_load(pic_state *, const char *);
pic_value pic_apply(pic_state *pic, struct pic_proc *, pic_value); pic_value pic_apply(pic_state *pic, struct pic_proc *, pic_value);
pic_value pic_apply_argv(pic_state *pic, struct pic_proc *, size_t, ...); pic_value pic_apply_argv(pic_state *pic, struct pic_proc *, size_t, ...);
struct pic_proc *pic_codegen(pic_state *, pic_value); struct pic_proc *pic_compile(pic_state *, pic_value);
pic_value pic_macroexpand(pic_state *, pic_value); pic_value pic_macroexpand(pic_state *, pic_value);
void pic_in_library(pic_state *, pic_value); void pic_in_library(pic_state *, pic_value);

View File

@ -69,6 +69,9 @@ struct pic_irep {
size_t clen, ilen, plen; size_t clen, ilen, plen;
}; };
pic_value pic_analyze(pic_state *, pic_value);
struct pic_irep *pic_codegen(pic_state *pic, pic_value obj);
void pic_dump_irep(pic_state *, struct pic_irep *); void pic_dump_irep(pic_state *, struct pic_irep *);
#if defined(__cplusplus) #if defined(__cplusplus)

File diff suppressed because it is too large Load Diff

View File

@ -74,13 +74,6 @@ pic_features(pic_state *pic)
return fs; 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); #define DONE pic_gc_arena_restore(pic, ai);
void void
@ -122,21 +115,6 @@ pic_init_core(pic_state *pic)
pic_init_load(pic); DONE; pic_init_load(pic); DONE;
pic_init_write(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_load_stdlib(pic); DONE;
pic_defun(pic, "features", pic_features); pic_defun(pic, "features", pic_features);

View File

@ -27,7 +27,7 @@ pic_load(pic_state *pic, const char *fn)
for (i = 0; i < n; ++i, vs = pic_cdr(pic, vs)) { for (i = 0; i < n; ++i, vs = pic_cdr(pic, vs)) {
v = pic_car(pic, vs); v = pic_car(pic, vs);
proc = pic_codegen(pic, v); proc = pic_compile(pic, v);
if (proc == NULL) { if (proc == NULL) {
pic_error(pic, "load: compilation failure"); pic_error(pic, "load: compilation failure");
} }

View File

@ -317,7 +317,7 @@ macroexpand(pic_state *pic, pic_value expr, struct pic_senv *senv)
for (exprs = pic_cddr(pic, expr); ! pic_nil_p(exprs); exprs = pic_cdr(pic, exprs)) { for (exprs = pic_cddr(pic, expr); ! pic_nil_p(exprs); exprs = pic_cdr(pic, exprs)) {
v = pic_car(pic, exprs); v = pic_car(pic, exprs);
proc = pic_codegen(pic, v); proc = pic_compile(pic, v);
if (proc == NULL) { if (proc == NULL) {
abort(); abort();
} }
@ -364,7 +364,7 @@ macroexpand(pic_state *pic, pic_value expr, struct pic_senv *senv)
} }
val = pic_cadr(pic, pic_cdr(pic, expr)); val = pic_cadr(pic, pic_cdr(pic, expr));
proc = pic_codegen(pic, val); proc = pic_compile(pic, val);
if (pic->errmsg) { if (pic->errmsg) {
printf("macroexpand error: %s\n", pic->errmsg); printf("macroexpand error: %s\n", pic->errmsg);
abort(); abort();
@ -406,7 +406,7 @@ macroexpand(pic_state *pic, pic_value expr, struct pic_senv *senv)
pic_error(pic, "syntax error"); pic_error(pic, "syntax error");
} }
proc = pic_codegen(pic, val); proc = pic_compile(pic, val);
if (pic->errmsg) { if (pic->errmsg) {
printf("macroexpand error: %s\n", pic->errmsg); printf("macroexpand error: %s\n", pic->errmsg);
abort(); abort();

View File

@ -58,6 +58,7 @@ pic_list_p(pic_state *pic, pic_value obj)
pic_value pic_value
pic_list(pic_state *pic, size_t c, ...) pic_list(pic_state *pic, size_t c, ...)
{ {
int ai = pic_gc_arena_preserve(pic);
va_list ap; va_list ap;
pic_value v; pic_value v;
@ -69,6 +70,10 @@ pic_list(pic_state *pic, size_t c, ...)
} }
va_end(ap); va_end(ap);
pic_gc_arena_restore(pic, ai);
pic_gc_protect(pic, v);
return pic_reverse(pic, v); return pic_reverse(pic, v);
} }

View File

@ -98,6 +98,20 @@ pic_open(int argc, char *argv[], char **envp)
register_core_symbol(pic, sDEFINE_LIBRARY, "define-library"); register_core_symbol(pic, sDEFINE_LIBRARY, "define-library");
register_core_symbol(pic, sIMPORT, "import"); register_core_symbol(pic, sIMPORT, "import");
register_core_symbol(pic, sEXPORT, "export"); register_core_symbol(pic, sEXPORT, "export");
register_core_symbol(pic, sCONS, "cons");
register_core_symbol(pic, sCAR, "car");
register_core_symbol(pic, sCDR, "cdr");
register_core_symbol(pic, sNILP, "null?");
register_core_symbol(pic, sADD, "+");
register_core_symbol(pic, sSUB, "-");
register_core_symbol(pic, sMUL, "*");
register_core_symbol(pic, sDIV, "/");
register_core_symbol(pic, sMINUS, "minus");
register_core_symbol(pic, sEQ, "=");
register_core_symbol(pic, sLT, "<");
register_core_symbol(pic, sLE, "<=");
register_core_symbol(pic, sGT, ">");
register_core_symbol(pic, sGE, ">=");
pic_gc_arena_restore(pic, ai); pic_gc_arena_restore(pic, ai);
pic_init_core(pic); pic_init_core(pic);

View File

@ -616,18 +616,13 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value argv)
} }
/* prepare env */ /* prepare env */
if (proc->u.irep->cv_num == 0) { ci->env = (struct pic_env *)pic_obj_alloc(pic, sizeof(struct pic_env), PIC_TT_ENV);
ci->env = proc->env; ci->env->up = proc->env;
} ci->env->valuec = proc->u.irep->cv_num;
else { ci->env->values = (pic_value *)pic_calloc(pic, ci->env->valuec, sizeof(pic_value));
ci->env = (struct pic_env *)pic_obj_alloc(pic, sizeof(struct pic_env), PIC_TT_ENV); for (i = 0; i < ci->env->valuec; ++i) {
ci->env->up = proc->env; ci->env->values[i] = ci->fp[proc->u.irep->cv_tbl[i]];
ci->env->valuec = proc->u.irep->cv_num; }
ci->env->values = (pic_value *)pic_calloc(pic, ci->env->valuec, sizeof(pic_value));
for (i = 0; i < ci->env->valuec; ++i) {
ci->env->values[i] = ci->fp[proc->u.irep->cv_tbl[i]];
}
}
pc = proc->u.irep->code; pc = proc->u.irep->code;
pic_gc_arena_restore(pic, ai); pic_gc_arena_restore(pic, ai);

View File

@ -156,6 +156,7 @@ void
pic_debug(pic_state *pic, pic_value obj) pic_debug(pic_state *pic, pic_value obj)
{ {
write(pic, obj); write(pic, obj);
fflush(stdout);
} }
static pic_value static pic_value

View File

@ -122,7 +122,7 @@ repl(pic_state *pic)
#endif #endif
/* eval */ /* eval */
proc = pic_codegen(pic, v); proc = pic_compile(pic, v);
if (proc == NULL) { if (proc == NULL) {
printf("compilation error: %s\n", pic->errmsg); printf("compilation error: %s\n", pic->errmsg);
pic->errmsg = NULL; pic->errmsg = NULL;
@ -183,7 +183,7 @@ exec_file(pic_state *pic, const char *fname)
v = pic_car(pic, vs); v = pic_car(pic, vs);
proc = pic_codegen(pic, v); proc = pic_compile(pic, v);
if (proc == NULL) { if (proc == NULL) {
fputs(pic->errmsg, stderr); fputs(pic->errmsg, stderr);
fprintf(stderr, "fatal error: %s compilation failure\n", fname); fprintf(stderr, "fatal error: %s compilation failure\n", fname);
@ -223,7 +223,7 @@ exec_string(pic_state *pic, const char *str)
for (i = 0; i < n; ++i) { for (i = 0; i < n; ++i) {
v = pic_car(pic, vs); v = pic_car(pic, vs);
proc = pic_codegen(pic, v); proc = pic_compile(pic, v);
if (proc == NULL) { if (proc == NULL) {
goto abort; goto abort;
} }