aboutsummaryrefslogtreecommitdiff
path: root/lcode.c
diff options
context:
space:
mode:
Diffstat (limited to 'lcode.c')
-rw-r--r--lcode.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/lcode.c b/lcode.c
index 40efcff3..c2b5fc6d 100644
--- a/lcode.c
+++ b/lcode.c
@@ -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*/
73static 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*/
736void luaK_dischargevars (FuncState *fs, expdesc *e) { 749void 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 */