'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:
Roberto Ierusalimschy
2025-05-11 11:51:58 -03:00
parent 7ade155762
commit 5b1ab8efdc
3 changed files with 23 additions and 17 deletions

View File

@@ -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);
}
}