rename pic_scope -> codegen_scope
This commit is contained in:
parent
406775e8dc
commit
d12ed0a139
230
src/codegen.c
230
src/codegen.c
|
@ -6,34 +6,34 @@
|
|||
#include "picrin/proc.h"
|
||||
#include "xhash/xhash.h"
|
||||
|
||||
struct pic_scope {
|
||||
struct pic_scope *up;
|
||||
typedef struct codegen_scope {
|
||||
struct codegen_scope *up;
|
||||
|
||||
struct xhash *local_tbl;
|
||||
size_t localc;
|
||||
};
|
||||
} codegen_scope;
|
||||
|
||||
static struct pic_scope *
|
||||
static codegen_scope *
|
||||
new_global_scope(pic_state *pic)
|
||||
{
|
||||
struct pic_scope *scope;
|
||||
codegen_scope *scope;
|
||||
|
||||
scope = (struct pic_scope *)pic_alloc(pic, sizeof(struct pic_scope));
|
||||
scope = (codegen_scope *)pic_alloc(pic, sizeof(codegen_scope));
|
||||
scope->up = NULL;
|
||||
scope->local_tbl = pic->global_tbl;
|
||||
scope->localc = -1;
|
||||
return scope;
|
||||
}
|
||||
|
||||
static struct pic_scope *
|
||||
new_local_scope(pic_state *pic, pic_value args, struct pic_scope *scope)
|
||||
static codegen_scope *
|
||||
new_local_scope(pic_state *pic, pic_value args, codegen_scope *scope)
|
||||
{
|
||||
struct pic_scope *new_scope;
|
||||
codegen_scope *new_scope;
|
||||
pic_value v;
|
||||
int i;
|
||||
struct xhash *x;
|
||||
|
||||
new_scope = (struct pic_scope *)pic_alloc(pic, sizeof(struct pic_scope));
|
||||
new_scope = (codegen_scope *)pic_alloc(pic, sizeof(codegen_scope));
|
||||
new_scope->up = scope;
|
||||
new_scope->local_tbl = x = xh_new();
|
||||
|
||||
|
@ -50,7 +50,7 @@ new_local_scope(pic_state *pic, pic_value args, struct pic_scope *scope)
|
|||
}
|
||||
|
||||
static void
|
||||
destory_scope(pic_state *pic, struct pic_scope *scope)
|
||||
destory_scope(pic_state *pic, codegen_scope *scope)
|
||||
{
|
||||
if (scope->up) {
|
||||
xh_destory(scope->local_tbl);
|
||||
|
@ -59,7 +59,7 @@ destory_scope(pic_state *pic, struct pic_scope *scope)
|
|||
}
|
||||
|
||||
static bool
|
||||
scope_lookup(pic_state *pic, const char *key, struct pic_scope *scope, int *depth, int *idx)
|
||||
scope_lookup(pic_state *pic, codegen_scope *scope, const char *key, int *depth, int *idx)
|
||||
{
|
||||
struct xh_entry *e;
|
||||
int d = 0;
|
||||
|
@ -100,100 +100,6 @@ scope_global_define(pic_state *pic, const char *name)
|
|||
return e->val;
|
||||
}
|
||||
|
||||
void
|
||||
pic_defun(pic_state *pic, const char *name, pic_func_t cfunc)
|
||||
{
|
||||
struct pic_proc *proc;
|
||||
int idx;
|
||||
|
||||
proc = pic_proc_new_cfunc(pic, cfunc, pic_undef_value());
|
||||
idx = scope_global_define(pic, name);
|
||||
pic->globals[idx] = pic_obj_value(proc);
|
||||
}
|
||||
|
||||
static void
|
||||
print_irep(pic_state *pic, struct pic_irep *irep)
|
||||
{
|
||||
int i;
|
||||
|
||||
printf("## irep %p [clen = %zd, ccapa = %zd]\n", irep, irep->clen, irep->ccapa);
|
||||
for (i = 0; i < irep->clen; ++i) {
|
||||
switch (irep->code[i].insn) {
|
||||
case OP_POP:
|
||||
puts("OP_POP");
|
||||
break;
|
||||
case OP_PUSHNIL:
|
||||
puts("OP_PUSHNIL");
|
||||
break;
|
||||
case OP_PUSHTRUE:
|
||||
puts("OP_PUSHTRUE");
|
||||
break;
|
||||
case OP_PUSHFALSE:
|
||||
puts("OP_PUSHFALSE");
|
||||
break;
|
||||
case OP_PUSHNUM:
|
||||
printf("OP_PUSHNUM\t%g\n", irep->code[i].u.f);
|
||||
break;
|
||||
case OP_PUSHCONST:
|
||||
printf("OP_PUSHCONST\t");
|
||||
pic_debug(pic, pic->pool[irep->code[i].u.i]);
|
||||
puts("");
|
||||
break;
|
||||
case OP_GREF:
|
||||
printf("OP_GREF\t%i\n", irep->code[i].u.i);
|
||||
break;
|
||||
case OP_GSET:
|
||||
printf("OP_GSET\t%i\n", irep->code[i].u.i);
|
||||
break;
|
||||
case OP_LREF:
|
||||
printf("OP_LREF\t%d\n", irep->code[i].u.i);
|
||||
break;
|
||||
case OP_JMP:
|
||||
printf("OP_JMP\t%d\n", irep->code[i].u.i);
|
||||
break;
|
||||
case OP_JMPIF:
|
||||
printf("OP_JMPIF\t%d\n", irep->code[i].u.i);
|
||||
break;
|
||||
case OP_CALL:
|
||||
printf("OP_CALL\t%d\n", irep->code[i].u.i);
|
||||
break;
|
||||
case OP_RET:
|
||||
puts("OP_RET");
|
||||
break;
|
||||
case OP_LAMBDA:
|
||||
printf("OP_LAMBDA\t%d\n", irep->code[i].u.i);
|
||||
break;
|
||||
case OP_CONS:
|
||||
puts("OP_CONS");
|
||||
break;
|
||||
case OP_CAR:
|
||||
puts("OP_CAR");
|
||||
break;
|
||||
case OP_NILP:
|
||||
puts("OP_NILP");
|
||||
break;
|
||||
case OP_CDR:
|
||||
puts("OP_CDR");
|
||||
break;
|
||||
case OP_ADD:
|
||||
puts("OP_ADD");
|
||||
break;
|
||||
case OP_SUB:
|
||||
puts("OP_SUB");
|
||||
break;
|
||||
case OP_MUL:
|
||||
puts("OP_MUL");
|
||||
break;
|
||||
case OP_DIV:
|
||||
puts("OP_DIV");
|
||||
break;
|
||||
case OP_STOP:
|
||||
puts("OP_STOP");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static struct pic_irep *
|
||||
new_irep(pic_state *pic)
|
||||
{
|
||||
|
@ -206,11 +112,13 @@ new_irep(pic_state *pic)
|
|||
return irep;
|
||||
}
|
||||
|
||||
static void pic_gen_call(pic_state *, struct pic_irep *, pic_value, struct pic_scope *);
|
||||
static struct pic_irep *pic_gen_lambda(pic_state *, pic_value, struct pic_scope *);
|
||||
static void print_irep(pic_state *, struct pic_irep *);
|
||||
|
||||
static void pic_gen_call(pic_state *, struct pic_irep *, pic_value, codegen_scope *);
|
||||
static struct pic_irep *pic_gen_lambda(pic_state *, pic_value, codegen_scope *);
|
||||
|
||||
static void
|
||||
pic_gen(pic_state *pic, struct pic_irep *irep, pic_value obj, struct pic_scope *scope)
|
||||
pic_gen(pic_state *pic, struct pic_irep *irep, pic_value obj, codegen_scope *scope)
|
||||
{
|
||||
pic_value sDEFINE, sLAMBDA, sIF, sBEGIN, sQUOTE;
|
||||
pic_value sCONS, sCAR, sCDR, sNILP;
|
||||
|
@ -237,7 +145,7 @@ pic_gen(pic_state *pic, struct pic_irep *irep, pic_value obj, struct pic_scope *
|
|||
const char *name;
|
||||
|
||||
name = pic_symbol_ptr(obj)->name;
|
||||
b = scope_lookup(pic, name, scope, &depth, &idx);
|
||||
b = scope_lookup(pic, scope, name, &depth, &idx);
|
||||
if (! b) {
|
||||
pic_error(pic, "unbound variable");
|
||||
}
|
||||
|
@ -424,7 +332,7 @@ pic_gen(pic_state *pic, struct pic_irep *irep, pic_value obj, struct pic_scope *
|
|||
}
|
||||
|
||||
static void
|
||||
pic_gen_call(pic_state *pic, struct pic_irep *irep, pic_value obj, struct pic_scope *scope)
|
||||
pic_gen_call(pic_state *pic, struct pic_irep *irep, pic_value obj, codegen_scope *scope)
|
||||
{
|
||||
pic_value seq;
|
||||
int i = 0;
|
||||
|
@ -443,9 +351,9 @@ pic_gen_call(pic_state *pic, struct pic_irep *irep, pic_value obj, struct pic_sc
|
|||
}
|
||||
|
||||
static struct pic_irep *
|
||||
pic_gen_lambda(pic_state *pic, pic_value obj, struct pic_scope *scope)
|
||||
pic_gen_lambda(pic_state *pic, pic_value obj, codegen_scope *scope)
|
||||
{
|
||||
struct pic_scope *new_scope;
|
||||
codegen_scope *new_scope;
|
||||
pic_value args, body, v;
|
||||
struct pic_irep *irep;
|
||||
|
||||
|
@ -480,7 +388,7 @@ pic_gen_lambda(pic_state *pic, pic_value obj, struct pic_scope *scope)
|
|||
struct pic_proc *
|
||||
pic_codegen(pic_state *pic, pic_value obj)
|
||||
{
|
||||
struct pic_scope *global_scope;
|
||||
codegen_scope *global_scope;
|
||||
struct pic_proc *proc;
|
||||
struct pic_irep *irep;
|
||||
|
||||
|
@ -513,3 +421,97 @@ pic_codegen(pic_state *pic, pic_value obj)
|
|||
|
||||
return proc;
|
||||
}
|
||||
|
||||
void
|
||||
pic_defun(pic_state *pic, const char *name, pic_func_t cfunc)
|
||||
{
|
||||
struct pic_proc *proc;
|
||||
int idx;
|
||||
|
||||
proc = pic_proc_new_cfunc(pic, cfunc, pic_undef_value());
|
||||
idx = scope_global_define(pic, name);
|
||||
pic->globals[idx] = pic_obj_value(proc);
|
||||
}
|
||||
|
||||
static void
|
||||
print_irep(pic_state *pic, struct pic_irep *irep)
|
||||
{
|
||||
int i;
|
||||
|
||||
printf("## irep %p [clen = %zd, ccapa = %zd]\n", irep, irep->clen, irep->ccapa);
|
||||
for (i = 0; i < irep->clen; ++i) {
|
||||
switch (irep->code[i].insn) {
|
||||
case OP_POP:
|
||||
puts("OP_POP");
|
||||
break;
|
||||
case OP_PUSHNIL:
|
||||
puts("OP_PUSHNIL");
|
||||
break;
|
||||
case OP_PUSHTRUE:
|
||||
puts("OP_PUSHTRUE");
|
||||
break;
|
||||
case OP_PUSHFALSE:
|
||||
puts("OP_PUSHFALSE");
|
||||
break;
|
||||
case OP_PUSHNUM:
|
||||
printf("OP_PUSHNUM\t%g\n", irep->code[i].u.f);
|
||||
break;
|
||||
case OP_PUSHCONST:
|
||||
printf("OP_PUSHCONST\t");
|
||||
pic_debug(pic, pic->pool[irep->code[i].u.i]);
|
||||
puts("");
|
||||
break;
|
||||
case OP_GREF:
|
||||
printf("OP_GREF\t%i\n", irep->code[i].u.i);
|
||||
break;
|
||||
case OP_GSET:
|
||||
printf("OP_GSET\t%i\n", irep->code[i].u.i);
|
||||
break;
|
||||
case OP_LREF:
|
||||
printf("OP_LREF\t%d\n", irep->code[i].u.i);
|
||||
break;
|
||||
case OP_JMP:
|
||||
printf("OP_JMP\t%d\n", irep->code[i].u.i);
|
||||
break;
|
||||
case OP_JMPIF:
|
||||
printf("OP_JMPIF\t%d\n", irep->code[i].u.i);
|
||||
break;
|
||||
case OP_CALL:
|
||||
printf("OP_CALL\t%d\n", irep->code[i].u.i);
|
||||
break;
|
||||
case OP_RET:
|
||||
puts("OP_RET");
|
||||
break;
|
||||
case OP_LAMBDA:
|
||||
printf("OP_LAMBDA\t%d\n", irep->code[i].u.i);
|
||||
break;
|
||||
case OP_CONS:
|
||||
puts("OP_CONS");
|
||||
break;
|
||||
case OP_CAR:
|
||||
puts("OP_CAR");
|
||||
break;
|
||||
case OP_NILP:
|
||||
puts("OP_NILP");
|
||||
break;
|
||||
case OP_CDR:
|
||||
puts("OP_CDR");
|
||||
break;
|
||||
case OP_ADD:
|
||||
puts("OP_ADD");
|
||||
break;
|
||||
case OP_SUB:
|
||||
puts("OP_SUB");
|
||||
break;
|
||||
case OP_MUL:
|
||||
puts("OP_MUL");
|
||||
break;
|
||||
case OP_DIV:
|
||||
puts("OP_DIV");
|
||||
break;
|
||||
case OP_STOP:
|
||||
puts("OP_STOP");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
4
src/vm.c
4
src/vm.c
|
@ -308,8 +308,8 @@ pic_run(pic_state *pic, struct pic_proc *proc, pic_value args)
|
|||
|
||||
#if VM_DEBUG
|
||||
puts("**VM END STATE**");
|
||||
printf("stbase = %p\nsp = %p\n", pic->stbase, pic->sp);
|
||||
printf("cibase = %p\nci = %p\n", pic->cibase, pic->ci);
|
||||
printf("stbase\t= %p\nsp\t= %p\n", pic->stbase, pic->sp);
|
||||
printf("cibase\t= %p\nci\t= %p\n", pic->cibase, pic->ci);
|
||||
if (pic->stbase != pic->sp) {
|
||||
pic_value *sp;
|
||||
printf("* stack trace:");
|
||||
|
|
Loading…
Reference in New Issue