global variable table may be weak
This commit is contained in:
parent
673198bbb6
commit
5fa24f9767
|
@ -436,7 +436,7 @@ define_var(pic_state *pic, analyze_scope *scope, pic_sym *sym)
|
|||
int ret;
|
||||
|
||||
if (search_scope(scope, sym)) {
|
||||
if (scope->depth > 0 || (pic_dict_has(pic, pic->globals, sym) && ! pic_invalid_p(pic_box_ptr(pic_dict_ref(pic, pic->globals, sym))->value))) {
|
||||
if (scope->depth > 0 || (pic_reg_has(pic, pic->globals, sym) && ! pic_invalid_p(pic_box_ptr(pic_reg_ref(pic, pic->globals, sym))->value))) {
|
||||
pic_warnf(pic, "redefining variable: ~s", pic_obj_value(sym));
|
||||
}
|
||||
return;
|
||||
|
|
|
@ -484,6 +484,7 @@ gc_mark_phase(pic_state *pic)
|
|||
|
||||
M(uDEFINE); M(uLAMBDA); M(uIF); M(uBEGIN); M(uQUOTE); M(uSETBANG); M(uDEFINE_MACRO);
|
||||
M(uDEFINE_LIBRARY); M(uIMPORT); M(uEXPORT); M(uCOND_EXPAND);
|
||||
|
||||
M(uCONS); M(uCAR); M(uCDR); M(uNILP); M(uSYMBOLP); M(uPAIRP);
|
||||
M(uADD); M(uSUB); M(uMUL); M(uDIV); M(uEQ); M(uLT); M(uLE); M(uGT); M(uGE); M(uNOT);
|
||||
|
||||
|
@ -491,6 +492,9 @@ gc_mark_phase(pic_state *pic)
|
|||
P(pCONS); P(pCAR); P(pCDR); P(pNILP); P(pSYMBOLP); P(pPAIRP); P(pNOT);
|
||||
P(pADD); P(pSUB); P(pMUL); P(pDIV); P(pEQ); P(pLT); P(pLE); P(pGT); P(pGE);
|
||||
|
||||
M(cCONS); M(cCAR); M(cCDR); M(cNILP); M(cSYMBOLP); M(cPAIRP); M(cNOT);
|
||||
M(cADD); M(cSUB); M(cMUL); M(cDIV); M(cEQ); M(cLT); M(cLE); M(cGT); M(cGE);
|
||||
|
||||
/* global variables */
|
||||
if (pic->globals) {
|
||||
gc_mark_object(pic, (union object *)pic->globals);
|
||||
|
|
|
@ -119,7 +119,7 @@ struct pic_state {
|
|||
|
||||
khash_t(s) syms; /* name to symbol */
|
||||
int ucnt;
|
||||
struct pic_dict *globals;
|
||||
struct pic_reg *globals;
|
||||
struct pic_dict *macros;
|
||||
pic_value libs;
|
||||
struct pic_reg *attrs;
|
||||
|
|
|
@ -407,7 +407,7 @@ pic_open(pic_allocf allocf, void *userdata)
|
|||
pic->pGE = pic_invalid_value();
|
||||
|
||||
/* root tables */
|
||||
pic->globals = pic_make_dict(pic);
|
||||
pic->globals = pic_make_reg(pic);
|
||||
pic->macros = pic_make_dict(pic);
|
||||
pic->attrs = pic_make_reg(pic);
|
||||
|
||||
|
|
|
@ -387,15 +387,15 @@ pic_get_args(pic_state *pic, const char *format, ...)
|
|||
}
|
||||
|
||||
struct pic_box *
|
||||
pic_vm_gref_slot(pic_state *pic, pic_sym *uid)
|
||||
pic_vm_gref_slot(pic_state *pic, pic_sym *uid) /* TODO: make this static */
|
||||
{
|
||||
struct pic_box *box;
|
||||
|
||||
if (pic_dict_has(pic, pic->globals, uid)) {
|
||||
return pic_box_ptr(pic_dict_ref(pic, pic->globals, uid));
|
||||
if (pic_reg_has(pic, pic->globals, uid)) {
|
||||
return pic_box_ptr(pic_reg_ref(pic, pic->globals, uid));
|
||||
}
|
||||
box = pic_box(pic, pic_invalid_value());
|
||||
pic_dict_set(pic, pic->globals, uid, pic_obj_value(box));
|
||||
pic_reg_set(pic, pic->globals, uid, pic_obj_value(box));
|
||||
return box;
|
||||
}
|
||||
|
||||
|
@ -1112,7 +1112,7 @@ pic_define_(pic_state *pic, const char *name, pic_value val)
|
|||
if ((uid = pic_find_variable(pic, pic->lib->env, pic_obj_value(sym))) == NULL) {
|
||||
uid = pic_add_variable(pic, pic->lib->env, pic_obj_value(sym));
|
||||
} else {
|
||||
if (pic_dict_has(pic, pic->globals, uid)) {
|
||||
if (pic_reg_has(pic, pic->globals, uid)) {
|
||||
pic_warnf(pic, "redefining variable: ~s", pic_obj_value(uid));
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue