diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2019-07-17 14:50:42 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2019-07-17 14:50:42 -0300 |
commit | 8082906c059f2b1473de4363ca57fe19b52f281f (patch) | |
tree | 1ef5607d4c2a3dc54777bf882849b0260ca8eb56 /lcode.c | |
parent | d6af81084df569bc8e3bd0949ad6fc0b40c8468d (diff) | |
download | lua-8082906c059f2b1473de4363ca57fe19b52f281f.tar.gz lua-8082906c059f2b1473de4363ca57fe19b52f281f.tar.bz2 lua-8082906c059f2b1473de4363ca57fe19b52f281f.zip |
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.
Diffstat (limited to '')
-rw-r--r-- | lcode.c | 18 |
1 files changed, 15 insertions, 3 deletions
@@ -68,6 +68,15 @@ static int tonumeral (const expdesc *e, TValue *v) { | |||
68 | 68 | ||
69 | 69 | ||
70 | /* | 70 | /* |
71 | ** Get the constant value from a constant expression | ||
72 | */ | ||
73 | static TValue *const2val (FuncState *fs, const expdesc *e) { | ||
74 | lua_assert(e->k == VCONST); | ||
75 | return &fs->ls->dyd->actvar.arr[e->u.info].k; | ||
76 | } | ||
77 | |||
78 | |||
79 | /* | ||
71 | ** If expression is a constant, fills 'v' with its value | 80 | ** If expression is a constant, fills 'v' with its value |
72 | ** and returns 1. Otherwise, returns 0. | 81 | ** and returns 1. Otherwise, returns 0. |
73 | */ | 82 | */ |
@@ -85,6 +94,10 @@ int luaK_exp2const (FuncState *fs, const expdesc *e, TValue *v) { | |||
85 | setsvalue(fs->ls->L, v, e->u.strval); | 94 | setsvalue(fs->ls->L, v, e->u.strval); |
86 | return 1; | 95 | return 1; |
87 | } | 96 | } |
97 | case VCONST: { | ||
98 | setobj(fs->ls->L, v, const2val(fs, e)); | ||
99 | return 1; | ||
100 | } | ||
88 | default: return tonumeral(e, v); | 101 | default: return tonumeral(e, v); |
89 | } | 102 | } |
90 | } | 103 | } |
@@ -730,14 +743,13 @@ void luaK_setoneret (FuncState *fs, expdesc *e) { | |||
730 | 743 | ||
731 | 744 | ||
732 | /* | 745 | /* |
733 | ** Ensure that expression 'e' is not a variable. | 746 | ** Ensure that expression 'e' is not a variable (nor a constant). |
734 | ** (Expression still may have jump lists.) | 747 | ** (Expression still may have jump lists.) |
735 | */ | 748 | */ |
736 | void luaK_dischargevars (FuncState *fs, expdesc *e) { | 749 | void luaK_dischargevars (FuncState *fs, expdesc *e) { |
737 | switch (e->k) { | 750 | switch (e->k) { |
738 | case VCONST: { | 751 | case VCONST: { |
739 | TValue *val = &fs->ls->dyd->actvar.arr[e->u.info].k; | 752 | const2exp(const2val(fs, e), e); |
740 | const2exp(val, e); | ||
741 | break; | 753 | break; |
742 | } | 754 | } |
743 | case VLOCAL: { /* already in a register */ | 755 | case VLOCAL: { /* already in a register */ |