emit error message when compiling a reference to a closed variable
This commit is contained in:
parent
840593f5f3
commit
3ecfe821e2
12
src/vm.c
12
src/vm.c
|
@ -26,6 +26,7 @@ pic_assq(pic_state *pic, pic_value key, pic_value assoc)
|
||||||
|
|
||||||
enum scope_type {
|
enum scope_type {
|
||||||
SCOPE_GLOBAL,
|
SCOPE_GLOBAL,
|
||||||
|
SCOPE_NONLOCAL,
|
||||||
SCOPE_LOCAL,
|
SCOPE_LOCAL,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -33,6 +34,7 @@ static enum scope_type
|
||||||
env_lookup(pic_state *pic, pic_value sym, struct pic_env *env, struct pic_pair **p)
|
env_lookup(pic_state *pic, pic_value sym, struct pic_env *env, struct pic_pair **p)
|
||||||
{
|
{
|
||||||
pic_value v;
|
pic_value v;
|
||||||
|
bool f = true;
|
||||||
|
|
||||||
enter:
|
enter:
|
||||||
|
|
||||||
|
@ -41,6 +43,7 @@ env_lookup(pic_state *pic, pic_value sym, struct pic_env *env, struct pic_pair *
|
||||||
*p = pic_pair_ptr(v);
|
*p = pic_pair_ptr(v);
|
||||||
goto leave;
|
goto leave;
|
||||||
}
|
}
|
||||||
|
f = false;
|
||||||
if (env->parent) {
|
if (env->parent) {
|
||||||
env = env->parent;
|
env = env->parent;
|
||||||
goto enter;
|
goto enter;
|
||||||
|
@ -51,7 +54,12 @@ env_lookup(pic_state *pic, pic_value sym, struct pic_env *env, struct pic_pair *
|
||||||
leave:
|
leave:
|
||||||
|
|
||||||
if (env->parent) {
|
if (env->parent) {
|
||||||
return SCOPE_LOCAL;
|
if (f) {
|
||||||
|
return SCOPE_LOCAL;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return SCOPE_NONLOCAL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return SCOPE_GLOBAL;
|
return SCOPE_GLOBAL;
|
||||||
|
@ -250,6 +258,8 @@ pic_gen(pic_state *pic, struct pic_irep *irep, pic_value obj, struct pic_env *en
|
||||||
irep->code[irep->clen].u.gvar = gvar;
|
irep->code[irep->clen].u.gvar = gvar;
|
||||||
irep->clen++;
|
irep->clen++;
|
||||||
break;
|
break;
|
||||||
|
case SCOPE_NONLOCAL:
|
||||||
|
pic_raise(pic, "reference to closed variable not supported");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue