use xh_new_int
This commit is contained in:
parent
104fd823b2
commit
a4062b5b76
|
@ -104,7 +104,7 @@ static void pop_scope(analyze_state *);
|
|||
|
||||
#define register_renamed_symbol(pic, state, slot, lib, name) do { \
|
||||
struct xh_entry *e; \
|
||||
if (! (e = xh_get(lib->senv->tbl, name))) \
|
||||
if (! (e = xh_get_int(lib->senv->tbl, pic_intern_cstr(pic, name)))) \
|
||||
pic_error(pic, "internal error! native VM procedure not found"); \
|
||||
state->slot = e->val; \
|
||||
} while (0)
|
||||
|
@ -149,7 +149,7 @@ new_analyze_state(pic_state *pic)
|
|||
|
||||
global_tbl = pic->global_tbl;
|
||||
for (xh_begin(global_tbl, &it); ! xh_isend(&it); xh_next(&it)) {
|
||||
xh_put(state->scope->var_tbl, it.e->key, 0);
|
||||
xh_put_int(state->scope->var_tbl, (long)it.e->key, 0);
|
||||
}
|
||||
|
||||
return state;
|
||||
|
@ -171,7 +171,7 @@ push_scope(analyze_state *state, pic_value args)
|
|||
|
||||
scope = (analyze_scope *)pic_alloc(pic, sizeof(analyze_scope));
|
||||
scope->up = state->scope;
|
||||
scope->var_tbl = xh_new();
|
||||
scope->var_tbl = xh_new_int();
|
||||
scope->varg = false;
|
||||
scope->vars = analyze_args(pic, args, &scope->varg, &scope->argc, &scope->localc);
|
||||
|
||||
|
@ -180,7 +180,7 @@ push_scope(analyze_state *state, pic_value args)
|
|||
}
|
||||
|
||||
for (i = 1; i < scope->argc + scope->localc; ++i) {
|
||||
xh_put(scope->var_tbl, pic_symbol_name(pic, scope->vars[i]), 0);
|
||||
xh_put_int(scope->var_tbl, scope->vars[i], 0);
|
||||
}
|
||||
|
||||
state->scope = scope;
|
||||
|
@ -206,14 +206,13 @@ lookup_var(analyze_state *state, pic_sym sym)
|
|||
analyze_scope *scope = state->scope;
|
||||
struct xh_entry *e;
|
||||
int depth = 0;
|
||||
const char *key = pic_symbol_name(state->pic, sym);
|
||||
|
||||
enter:
|
||||
|
||||
e = xh_get(scope->var_tbl, key);
|
||||
e = xh_get_int(scope->var_tbl, sym);
|
||||
if (e) {
|
||||
if (depth > 0) { /* mark dirty */
|
||||
xh_put(scope->var_tbl, key, 1);
|
||||
xh_put_int(scope->var_tbl, sym, 1);
|
||||
}
|
||||
return depth;
|
||||
}
|
||||
|
@ -230,9 +229,8 @@ define_var(analyze_state *state, pic_sym sym)
|
|||
{
|
||||
pic_state *pic = state->pic;
|
||||
analyze_scope *scope = state->scope;
|
||||
const char *name = pic_symbol_name(pic, sym);
|
||||
|
||||
xh_put(state->scope->var_tbl, name, 0);
|
||||
xh_put_int(state->scope->var_tbl, sym, 0);
|
||||
|
||||
scope->localc++;
|
||||
scope->vars = (pic_sym *)pic_realloc(pic, scope->vars, sizeof(pic_sym) * (scope->argc + scope->localc));
|
||||
|
@ -638,7 +636,7 @@ analyze_lambda(analyze_state *state, pic_value obj)
|
|||
closes = pic_nil_value();
|
||||
for (i = 1; i < scope->argc + scope->localc; ++i) {
|
||||
pic_sym var = scope->vars[i];
|
||||
if (xh_get(scope->var_tbl, pic_symbol_name(pic, var))->val == 1) {
|
||||
if (xh_get_int(scope->var_tbl, var)->val == 1) {
|
||||
closes = pic_cons(pic, pic_symbol_value(var), closes);
|
||||
}
|
||||
}
|
||||
|
@ -721,26 +719,26 @@ push_resolver_scope(resolver_state *state, pic_value args, pic_value locals, boo
|
|||
scope = (resolver_scope *)pic_alloc(pic, sizeof(resolver_scope));
|
||||
scope->up = state->scope;
|
||||
scope->depth = scope->up ? scope->up->depth + 1 : 0;
|
||||
scope->lvs = xh_new();
|
||||
scope->cvs = xh_new();
|
||||
scope->lvs = xh_new_int();
|
||||
scope->cvs = xh_new_int();
|
||||
scope->argc = pic_length(pic, args) + 1;
|
||||
scope->localc = pic_length(pic, locals);
|
||||
scope->varg = varg;
|
||||
|
||||
/* arguments */
|
||||
for (i = 1; i < scope->argc; ++i) {
|
||||
xh_put(scope->lvs, pic_symbol_name(pic, pic_sym(pic_list_ref(pic, args, i - 1))), i);
|
||||
xh_put_int(scope->lvs, pic_sym(pic_list_ref(pic, args, i - 1)), i);
|
||||
}
|
||||
|
||||
/* locals */
|
||||
for (i = 0; i < scope->localc; ++i) {
|
||||
xh_put(scope->lvs, pic_symbol_name(pic, pic_sym(pic_list_ref(pic, locals, i))), scope->argc + i);
|
||||
xh_put_int(scope->lvs, pic_sym(pic_list_ref(pic, locals, i)), scope->argc + i);
|
||||
}
|
||||
|
||||
/* closed variables */
|
||||
scope->cv_num = 0;
|
||||
for (i = 0, c = pic_length(pic, closes); i < c; ++i) {
|
||||
xh_put(scope->cvs, pic_symbol_name(pic, pic_sym(pic_list_ref(pic, closes, i))), scope->cv_num++);
|
||||
xh_put_int(scope->cvs, pic_sym(pic_list_ref(pic, closes, i)), scope->cv_num++);
|
||||
}
|
||||
|
||||
state->scope = scope;
|
||||
|
@ -763,18 +761,17 @@ pop_resolver_scope(resolver_state *state)
|
|||
static bool
|
||||
is_closed(resolver_state *state, pic_sym sym)
|
||||
{
|
||||
return xh_get(state->scope->cvs, pic_symbol_name(state->pic, sym)) != NULL;
|
||||
return xh_get_int(state->scope->cvs, sym) != NULL;
|
||||
}
|
||||
|
||||
static pic_value
|
||||
resolve_gref(resolver_state *state, pic_sym sym)
|
||||
{
|
||||
pic_state *pic = state->pic;
|
||||
const char *name = pic_symbol_name(pic, sym);
|
||||
struct xh_entry *e;
|
||||
size_t i;
|
||||
|
||||
if ((e = xh_get(pic->global_tbl, name))) {
|
||||
if ((e = xh_get_int(pic->global_tbl, sym))) {
|
||||
i = e->val;
|
||||
}
|
||||
else {
|
||||
|
@ -782,7 +779,7 @@ resolve_gref(resolver_state *state, pic_sym sym)
|
|||
if (i >= pic->gcapa) {
|
||||
pic_error(pic, "global table overflow");
|
||||
}
|
||||
xh_put(pic->global_tbl, name, i);
|
||||
xh_put_int(pic->global_tbl, sym, i);
|
||||
}
|
||||
return pic_list(pic, 2, pic_symbol_value(state->sGREF), pic_int_value(i));
|
||||
}
|
||||
|
@ -793,7 +790,7 @@ resolve_lref(resolver_state *state, pic_sym sym)
|
|||
pic_state *pic = state->pic;
|
||||
int i;
|
||||
|
||||
i = xh_get(state->scope->lvs, pic_symbol_name(pic, sym))->val;
|
||||
i = xh_get_int(state->scope->lvs, sym)->val;
|
||||
|
||||
return pic_list(pic, 2, pic_symbol_value(state->sLREF), pic_int_value(i));
|
||||
}
|
||||
|
@ -810,7 +807,7 @@ resolve_cref(resolver_state *state, int depth, pic_sym sym)
|
|||
scope = scope->up;
|
||||
}
|
||||
|
||||
i = xh_get(scope->cvs, pic_symbol_name(pic, sym))->val;
|
||||
i = xh_get_int(scope->cvs, sym)->val;
|
||||
|
||||
return pic_list(pic, 3,
|
||||
pic_symbol_value(state->sCREF),
|
||||
|
@ -993,12 +990,12 @@ push_codegen_context(codegen_state *state, pic_value args, pic_value locals, boo
|
|||
cxt->varg = varg;
|
||||
|
||||
/* number local variables */
|
||||
vars = xh_new();
|
||||
vars = xh_new_int();
|
||||
for (i = 1; i < cxt->argc; ++i) {
|
||||
xh_put(vars, pic_symbol_name(pic, pic_sym(pic_list_ref(pic, args, i - 1))), i);
|
||||
xh_put_int(vars, pic_sym(pic_list_ref(pic, args, i - 1)), i);
|
||||
}
|
||||
for (i = 0; i < cxt->localc; ++i) {
|
||||
xh_put(vars, pic_symbol_name(pic, pic_sym(pic_list_ref(pic, locals, i))), cxt->argc + i);
|
||||
xh_put_int(vars, pic_sym(pic_list_ref(pic, locals, i)), cxt->argc + i);
|
||||
}
|
||||
|
||||
/* closed variables */
|
||||
|
@ -1007,7 +1004,7 @@ push_codegen_context(codegen_state *state, pic_value args, pic_value locals, boo
|
|||
for (i = 0, c = pic_length(pic, closes); i < c; ++i) {
|
||||
i = cxt->cv_num++;
|
||||
cxt->cv_tbl = (unsigned *)pic_realloc(pic, cxt->cv_tbl, sizeof(unsigned) * cxt->cv_num);
|
||||
cxt->cv_tbl[i] = xh_get(vars, pic_symbol_name(pic, pic_sym(pic_list_ref(pic, closes, i))))->val;
|
||||
cxt->cv_tbl[i] = xh_get_int(vars, pic_sym(pic_list_ref(pic, closes, i)))->val;
|
||||
}
|
||||
|
||||
xh_destroy(vars);
|
||||
|
@ -1439,15 +1436,15 @@ pic_compile(pic_state *pic, pic_value obj)
|
|||
}
|
||||
|
||||
static int
|
||||
scope_global_define(pic_state *pic, const char *name)
|
||||
scope_global_define(pic_state *pic, pic_sym sym)
|
||||
{
|
||||
struct xh_entry *e;
|
||||
|
||||
if ((e = xh_get(pic->global_tbl, name))) {
|
||||
if ((e = xh_get_int(pic->global_tbl, sym))) {
|
||||
pic_warn(pic, "redefining global");
|
||||
return e->val;
|
||||
}
|
||||
e = xh_put(pic->global_tbl, name, pic->glen++);
|
||||
e = xh_put_int(pic->global_tbl, sym, pic->glen++);
|
||||
if (pic->glen >= pic->gcapa) {
|
||||
pic_error(pic, "global table overflow");
|
||||
}
|
||||
|
@ -1458,16 +1455,17 @@ void
|
|||
pic_define(pic_state *pic, const char *name, pic_value val)
|
||||
{
|
||||
int idx;
|
||||
pic_sym gsym;
|
||||
pic_sym sym, gsym;
|
||||
|
||||
gsym = pic_gensym(pic, pic_intern_cstr(pic, name));
|
||||
sym = pic_intern_cstr(pic, name);
|
||||
gsym = pic_gensym(pic, sym);
|
||||
|
||||
/* push to the global arena */
|
||||
idx = scope_global_define(pic, pic_symbol_name(pic, gsym));
|
||||
idx = scope_global_define(pic, gsym);
|
||||
pic->globals[idx] = val;
|
||||
|
||||
/* register to the senv */
|
||||
xh_put(pic->lib->senv->tbl, name, gsym);
|
||||
xh_put_int(pic->lib->senv->tbl, sym, gsym);
|
||||
|
||||
/* export! */
|
||||
pic_export(pic, pic_intern_cstr(pic, name));
|
||||
|
@ -1477,12 +1475,14 @@ static int
|
|||
global_ref(pic_state *pic, const char *name)
|
||||
{
|
||||
struct xh_entry *e;
|
||||
pic_sym sym;
|
||||
|
||||
if (! (e = xh_get(pic->lib->senv->tbl, name))) {
|
||||
sym = pic_intern_cstr(pic, name);
|
||||
if (! (e = xh_get_int(pic->lib->senv->tbl, sym))) {
|
||||
pic_error(pic, "symbol not defined");
|
||||
}
|
||||
assert(e->val >= 0);
|
||||
if (! (e = xh_get(pic->global_tbl, pic_symbol_name(pic, (pic_sym)e->val)))) {
|
||||
if (! (e = xh_get_int(pic->global_tbl, e->val))) {
|
||||
pic_abort(pic, "logic flaw");
|
||||
}
|
||||
return e->val;
|
||||
|
|
|
@ -29,7 +29,7 @@ pic_make_library(pic_state *pic, pic_value name)
|
|||
|
||||
lib = (struct pic_lib *)pic_obj_alloc(pic, sizeof(struct pic_lib), PIC_TT_LIB);
|
||||
lib->senv = senv;
|
||||
lib->exports = xh_new();
|
||||
lib->exports = xh_new_int();
|
||||
lib->name = name;
|
||||
|
||||
/* register! */
|
||||
|
|
37
src/macro.c
37
src/macro.c
|
@ -23,7 +23,7 @@ pic_null_syntactic_env(pic_state *pic)
|
|||
|
||||
senv = (struct pic_senv *)pic_obj_alloc(pic, sizeof(struct pic_senv), PIC_TT_SENV);
|
||||
senv->up = NULL;
|
||||
senv->tbl = xh_new();
|
||||
senv->tbl = xh_new_int();
|
||||
senv->stx = (struct pic_syntax **)pic_calloc(pic, PIC_MACROS_SIZE, sizeof(struct pic_syntax *));
|
||||
senv->xlen = 0;
|
||||
senv->xcapa = PIC_MACROS_SIZE;
|
||||
|
@ -32,8 +32,9 @@ pic_null_syntactic_env(pic_state *pic)
|
|||
}
|
||||
|
||||
#define register_core_syntax(pic,senv,kind,name) do { \
|
||||
senv->stx[senv->xlen] = pic_syntax_new(pic, kind, pic_intern_cstr(pic, name)); \
|
||||
xh_put(senv->tbl, name, ~senv->xlen); \
|
||||
pic_sym sym = pic_intern_cstr(pic, name); \
|
||||
senv->stx[senv->xlen] = pic_syntax_new(pic, kind, sym); \
|
||||
xh_put_int(senv->tbl, sym, ~senv->xlen); \
|
||||
senv->xlen++; \
|
||||
} while (0)
|
||||
|
||||
|
@ -83,7 +84,7 @@ new_local_senv(pic_state *pic, pic_value formals, struct pic_senv *up)
|
|||
|
||||
senv = (struct pic_senv *)pic_obj_alloc(pic, sizeof(struct pic_senv), PIC_TT_SENV);
|
||||
senv->up = up;
|
||||
senv->tbl = xh_new();
|
||||
senv->tbl = xh_new_int();
|
||||
senv->stx = NULL;
|
||||
senv->xlen = 0;
|
||||
senv->xcapa = 0;
|
||||
|
@ -98,14 +99,14 @@ new_local_senv(pic_state *pic, pic_value formals, struct pic_senv *up)
|
|||
pic_error(pic, "syntax error");
|
||||
}
|
||||
sym = pic_sym(v);
|
||||
xh_put(senv->tbl, pic_symbol_name(pic, sym), (int)pic_gensym(pic, sym));
|
||||
xh_put_int(senv->tbl, sym, pic_gensym(pic, sym));
|
||||
}
|
||||
if (! pic_sym_p(a)) {
|
||||
a = macroexpand(pic, a, up);
|
||||
}
|
||||
if (pic_sym_p(a)) {
|
||||
sym = pic_sym(a);
|
||||
xh_put(senv->tbl, pic_symbol_name(pic, sym), (int)pic_gensym(pic, sym));
|
||||
xh_put_int(senv->tbl, sym, pic_gensym(pic, sym));
|
||||
}
|
||||
else if (! pic_nil_p(a)) {
|
||||
pic_error(pic, "syntax error");
|
||||
|
@ -196,7 +197,7 @@ pic_import(pic_state *pic, pic_value spec)
|
|||
}
|
||||
#endif
|
||||
if (it.e->val >= 0) {
|
||||
xh_put(pic->lib->senv->tbl, it.e->key, it.e->val);
|
||||
xh_put_int(pic->lib->senv->tbl, (long)it.e->key, it.e->val);
|
||||
}
|
||||
else { /* syntax object */
|
||||
size_t idx;
|
||||
|
@ -208,7 +209,7 @@ pic_import(pic_state *pic, pic_value spec)
|
|||
}
|
||||
/* bring macro object from imported lib */
|
||||
senv->stx[idx] = lib->senv->stx[~it.e->val];
|
||||
xh_put(senv->tbl, it.e->key, ~idx);
|
||||
xh_put_int(senv->tbl, (long)it.e->key, ~idx);
|
||||
senv->xlen++;
|
||||
}
|
||||
}
|
||||
|
@ -219,28 +220,30 @@ pic_export(pic_state *pic, pic_sym sym)
|
|||
{
|
||||
struct xh_entry *e;
|
||||
|
||||
e = xh_get(pic->lib->senv->tbl, pic_symbol_name(pic, sym));
|
||||
e = xh_get_int(pic->lib->senv->tbl, sym);
|
||||
if (! e) {
|
||||
pic_error(pic, "symbol not defined");
|
||||
}
|
||||
xh_put(pic->lib->exports, e->key, e->val);
|
||||
xh_put_int(pic->lib->exports, (long)e->key, e->val);
|
||||
}
|
||||
|
||||
static void
|
||||
pic_defsyntax(pic_state *pic, const char *name, struct pic_proc *macro, struct pic_senv *mac_env)
|
||||
{
|
||||
pic_sym sym;
|
||||
struct pic_syntax *stx;
|
||||
struct pic_senv *global_senv = pic->lib->senv;
|
||||
size_t idx;
|
||||
|
||||
stx = pic_syntax_new_macro(pic, pic_intern_cstr(pic, name), macro, mac_env);
|
||||
sym = pic_intern_cstr(pic, name);
|
||||
stx = pic_syntax_new_macro(pic, sym, macro, mac_env);
|
||||
|
||||
idx = global_senv->xlen;
|
||||
if (idx >= global_senv->xcapa) {
|
||||
pic_abort(pic, "macro table overflow");
|
||||
}
|
||||
global_senv->stx[idx] = stx;
|
||||
xh_put(global_senv->tbl, name, ~idx);
|
||||
xh_put_int(global_senv->tbl, sym, ~idx);
|
||||
global_senv->xlen++;
|
||||
}
|
||||
|
||||
|
@ -276,9 +279,9 @@ macroexpand(pic_state *pic, pic_value expr, struct pic_senv *senv)
|
|||
return expr;
|
||||
}
|
||||
while (true) {
|
||||
if ((e = xh_get(senv->tbl, pic_symbol_name(pic, pic_sym(expr)))) != NULL) {
|
||||
if ((e = xh_get_int(senv->tbl, pic_sym(expr))) != NULL) {
|
||||
if (e->val >= 0)
|
||||
return pic_symbol_value((pic_sym)e->val);
|
||||
return pic_symbol_value(e->val);
|
||||
else
|
||||
return pic_obj_value(senv->stx[~e->val]);
|
||||
}
|
||||
|
@ -287,7 +290,7 @@ macroexpand(pic_state *pic, pic_value expr, struct pic_senv *senv)
|
|||
senv = senv->up;
|
||||
}
|
||||
uniq = pic_gensym(pic, pic_sym(expr));
|
||||
xh_put(senv->tbl, pic_symbol_name(pic, pic_sym(expr)), (int)uniq);
|
||||
xh_put_int(senv->tbl, pic_sym(expr), uniq);
|
||||
return pic_symbol_value(uniq);
|
||||
}
|
||||
case PIC_TT_PAIR: {
|
||||
|
@ -475,7 +478,7 @@ macroexpand(pic_state *pic, pic_value expr, struct pic_senv *senv)
|
|||
pic_error(pic, "binding to non-symbol object");
|
||||
}
|
||||
sym = pic_sym(a);
|
||||
xh_put(senv->tbl, pic_symbol_name(pic, sym), (int)pic_gensym(pic, sym));
|
||||
xh_put_int(senv->tbl, sym, pic_gensym(pic, sym));
|
||||
|
||||
/* binding value */
|
||||
v = pic_cons(pic, pic_symbol_value(pic_syntax(car)->sym),
|
||||
|
@ -495,7 +498,7 @@ macroexpand(pic_state *pic, pic_value expr, struct pic_senv *senv)
|
|||
pic_error(pic, "binding to non-symbol object");
|
||||
}
|
||||
uniq = pic_gensym(pic, pic_sym(var));
|
||||
xh_put(senv->tbl, pic_symbol_name(pic, pic_sym(var)), (int)uniq);
|
||||
xh_put_int(senv->tbl, pic_sym(var), (int)uniq);
|
||||
}
|
||||
FALLTHROUGH;
|
||||
case PIC_STX_SET:
|
||||
|
|
|
@ -53,14 +53,14 @@ pic_open(int argc, char *argv[], char **envp)
|
|||
init_heap(pic->heap);
|
||||
|
||||
/* symbol table */
|
||||
pic->sym_tbl = xh_new();
|
||||
pic->sym_tbl = xh_new_str();
|
||||
pic->sym_pool = (const char **)calloc(PIC_SYM_POOL_SIZE, sizeof(const char *));
|
||||
pic->slen = 0;
|
||||
pic->scapa = pic->slen + PIC_SYM_POOL_SIZE;
|
||||
pic->uniq_sym_count = 0;
|
||||
|
||||
/* global variables */
|
||||
pic->global_tbl = xh_new();
|
||||
pic->global_tbl = xh_new_int();
|
||||
pic->globals = (pic_value *)calloc(PIC_GLOBALS_SIZE, sizeof(pic_value));
|
||||
pic->glen = 0;
|
||||
pic->gcapa = PIC_GLOBALS_SIZE;
|
||||
|
|
Loading…
Reference in New Issue