'expdesc' doesn't depend on 'actvar' for var. info.
In preparation for 'global *', the structure 'expdesc' does not point to 'actvar.arr' for information about global variables.
This commit is contained in:
15
lparser.c
15
lparser.c
@@ -304,11 +304,9 @@ static void check_readonly (LexState *ls, expdesc *e) {
|
||||
varname = up->name;
|
||||
break;
|
||||
}
|
||||
case VINDEXUP: case VINDEXSTR: case VINDEXED: {
|
||||
int vidx = e->u.ind.vidx;
|
||||
/* is it a read-only declared global? */
|
||||
if (vidx != -1 && ls->dyd->actvar.arr[vidx].vd.kind == GDKCONST)
|
||||
varname = ls->dyd->actvar.arr[vidx].vd.name;
|
||||
case VINDEXUP: case VINDEXSTR: case VINDEXED: { /* global variable */
|
||||
if (e->u.ind.ro) /* read-only? */
|
||||
varname = tsvalue(&fs->f->k[e->u.ind.keystr]);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
@@ -483,8 +481,6 @@ static void buildvar (LexState *ls, TString *varname, expdesc *var) {
|
||||
if (var->k == VGLOBAL) { /* global name? */
|
||||
expdesc key;
|
||||
int info = var->u.info;
|
||||
lua_assert(info == -1 ||
|
||||
eqstr(ls->dyd->actvar.arr[info].vd.name, varname));
|
||||
/* global by default in the scope of a global declaration? */
|
||||
if (info == -1 && fs->bl->globdec)
|
||||
luaK_semerror(ls, "variable '%s' not declared", getstr(varname));
|
||||
@@ -495,7 +491,10 @@ static void buildvar (LexState *ls, TString *varname, expdesc *var) {
|
||||
luaK_exp2anyregup(fs, var); /* but could be a constant */
|
||||
codestring(&key, varname); /* key is variable name */
|
||||
luaK_indexed(fs, var, &key); /* env[varname] */
|
||||
var->u.ind.vidx = cast_short(info); /* mark it as a declared global */
|
||||
if (info != -1 && ls->dyd->actvar.arr[info].vd.kind == GDKCONST)
|
||||
var->u.ind.ro = 1; /* mark variable as read-only */
|
||||
else /* anyway must be a global */
|
||||
lua_assert(info == -1 || ls->dyd->actvar.arr[info].vd.kind == GDKREG);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user