use registries for parameter table
This commit is contained in:
parent
111779c39e
commit
b983c77767
|
@ -92,6 +92,8 @@ typedef struct {
|
|||
|
||||
pic_code *ip;
|
||||
|
||||
pic_value ptable;
|
||||
|
||||
struct pic_lib *lib, *prev_lib;
|
||||
|
||||
pic_sym *sDEFINE, *sLAMBDA, *sIF, *sBEGIN, *sQUOTE, *sSETBANG;
|
||||
|
@ -130,9 +132,6 @@ typedef struct {
|
|||
pic_value libs;
|
||||
struct pic_reg *attrs;
|
||||
|
||||
pic_value ptable;
|
||||
size_t pnum;
|
||||
|
||||
struct pic_reader *reader;
|
||||
|
||||
bool gc_enable;
|
||||
|
|
|
@ -237,7 +237,6 @@ pic_open(int argc, char *argv[], char **envp, pic_allocf allocf)
|
|||
|
||||
/* parameter table */
|
||||
pic->ptable = pic_nil_value();
|
||||
pic->pnum = 0;
|
||||
|
||||
/* native stack marker */
|
||||
pic->native_stack_start = &t;
|
||||
|
|
|
@ -17,15 +17,12 @@ static pic_value
|
|||
var_get(pic_state *pic, struct pic_proc *var)
|
||||
{
|
||||
pic_value elem, it;
|
||||
pic_sym *id;
|
||||
struct pic_dict *dict;
|
||||
|
||||
id = pic_sym_ptr(pic_proc_env_ref(pic, var, "id"));
|
||||
struct pic_reg *reg;
|
||||
|
||||
pic_for_each (elem, pic->ptable, it) {
|
||||
dict = pic_dict_ptr(elem);
|
||||
if (pic_dict_has(pic, dict, id)) {
|
||||
return pic_dict_ref(pic, dict, id);
|
||||
reg = pic_reg_ptr(elem);
|
||||
if (pic_reg_has(pic, reg, var)) {
|
||||
return pic_reg_ref(pic, reg, var);
|
||||
}
|
||||
}
|
||||
pic_panic(pic, "logic flaw");
|
||||
|
@ -34,14 +31,11 @@ var_get(pic_state *pic, struct pic_proc *var)
|
|||
static pic_value
|
||||
var_set(pic_state *pic, struct pic_proc *var, pic_value val)
|
||||
{
|
||||
pic_sym *id;
|
||||
struct pic_dict *dict;
|
||||
struct pic_reg *reg;
|
||||
|
||||
id = pic_sym_ptr(pic_proc_env_ref(pic, var, "id"));
|
||||
reg = pic_reg_ptr(pic_car(pic, pic->ptable));
|
||||
|
||||
dict = pic_dict_ptr(pic_car(pic, pic->ptable));
|
||||
|
||||
pic_dict_set(pic, dict, id, val);
|
||||
pic_reg_set(pic, reg, var, val);
|
||||
|
||||
return pic_undef_value();
|
||||
}
|
||||
|
@ -66,16 +60,12 @@ struct pic_proc *
|
|||
pic_make_var(pic_state *pic, pic_value init, struct pic_proc *conv)
|
||||
{
|
||||
struct pic_proc *var;
|
||||
pic_value converter = conv ? pic_obj_value(conv) : pic_false_value();
|
||||
pic_sym *id;
|
||||
|
||||
var = pic_make_proc(pic, var_call, "<var-call>");
|
||||
|
||||
if (conv != NULL) {
|
||||
pic_proc_env_set(pic, var, "conv", converter);
|
||||
pic_proc_env_set(pic, var, "conv", pic_obj_value(conv));
|
||||
}
|
||||
id = pic_intern(pic, pic_format(pic, "%d", pic->pnum++));
|
||||
pic_proc_env_set(pic, var, "id", pic_obj_value(id));
|
||||
|
||||
pic_apply1(pic, var, init);
|
||||
|
||||
|
@ -101,7 +91,7 @@ pic_var_with_parameter(pic_state *pic)
|
|||
|
||||
pic_get_args(pic, "l", &body);
|
||||
|
||||
pic->ptable = pic_cons(pic, pic_obj_value(pic_make_dict(pic)), pic->ptable);
|
||||
pic->ptable = pic_cons(pic, pic_obj_value(pic_make_reg(pic)), pic->ptable);
|
||||
|
||||
val = pic_apply0(pic, body);
|
||||
|
||||
|
|
Loading…
Reference in New Issue