Fixed small issue with constant propagation
Constants directly assigned to other constants were not propagating: For instance, in local <const> k1 = 10 local <const> k2 = k1 'k2' were not treated as a compile-time constant.
This commit is contained in:
18
lcode.c
18
lcode.c
@@ -67,6 +67,15 @@ static int tonumeral (const expdesc *e, TValue *v) {
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** Get the constant value from a constant expression
|
||||
*/
|
||||
static TValue *const2val (FuncState *fs, const expdesc *e) {
|
||||
lua_assert(e->k == VCONST);
|
||||
return &fs->ls->dyd->actvar.arr[e->u.info].k;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** If expression is a constant, fills 'v' with its value
|
||||
** and returns 1. Otherwise, returns 0.
|
||||
@@ -85,6 +94,10 @@ int luaK_exp2const (FuncState *fs, const expdesc *e, TValue *v) {
|
||||
setsvalue(fs->ls->L, v, e->u.strval);
|
||||
return 1;
|
||||
}
|
||||
case VCONST: {
|
||||
setobj(fs->ls->L, v, const2val(fs, e));
|
||||
return 1;
|
||||
}
|
||||
default: return tonumeral(e, v);
|
||||
}
|
||||
}
|
||||
@@ -730,14 +743,13 @@ void luaK_setoneret (FuncState *fs, expdesc *e) {
|
||||
|
||||
|
||||
/*
|
||||
** Ensure that expression 'e' is not a variable.
|
||||
** Ensure that expression 'e' is not a variable (nor a constant).
|
||||
** (Expression still may have jump lists.)
|
||||
*/
|
||||
void luaK_dischargevars (FuncState *fs, expdesc *e) {
|
||||
switch (e->k) {
|
||||
case VCONST: {
|
||||
TValue *val = &fs->ls->dyd->actvar.arr[e->u.info].k;
|
||||
const2exp(val, e);
|
||||
const2exp(const2val(fs, e), e);
|
||||
break;
|
||||
}
|
||||
case VLOCAL: { /* already in a register */
|
||||
|
||||
Reference in New Issue
Block a user