@ -81,9 +81,8 @@ int luaK_exp2const (FuncState *fs, const expdesc *e, TValue *v) {
case VNIL :
setnilvalue ( v ) ;
return 1 ;
case VK : {
TValue * k = & fs - > f - > k [ e - > u . info ] ;
setobj ( fs - > ls - > L , v , k ) ;
case VKSTR : {
setsvalue ( fs - > ls - > L , v , e - > u . strval ) ;
return 1 ;
}
default : return tonumeral ( e , v ) ;
@ -561,7 +560,7 @@ static int addk (FuncState *fs, TValue *key, TValue *v) {
/*
* * Add a string to list of constants and return its index .
*/
int luaK_ stringK ( FuncState * fs , TString * s ) {
static int stringK ( FuncState * fs , TString * s ) {
TValue o ;
setsvalue ( fs - > ls - > L , & o , s ) ;
return addk ( fs , & o , & o ) ; /* use string itself as key */
@ -656,7 +655,7 @@ static void luaK_float (FuncState *fs, int reg, lua_Number f) {
/*
* * Convert a constant in ' v ' into an expression description ' e '
*/
static void const2exp ( FuncState * fs , TValue * v , expdesc * e ) {
static void const2exp ( TValue * v , expdesc * e ) {
switch ( ttypetag ( v ) ) {
case LUA_TNUMINT :
e - > k = VKINT ; e - > u . ival = ivalue ( v ) ;
@ -671,7 +670,7 @@ static void const2exp (FuncState *fs, TValue *v, expdesc *e) {
e - > k = VNIL ;
break ;
case LUA_TSHRSTR : case LUA_TLNGSTR :
e - > k = VK ; e - > u . info = luaK_stringK ( fs , tsvalue ( v ) ) ;
e - > k = VKSTR ; e - > u . strval = tsvalue ( v ) ;
break ;
default : lua_assert ( 0 ) ;
}
@ -696,6 +695,16 @@ void luaK_setreturns (FuncState *fs, expdesc *e, int nresults) {
}
/*
* * Convert a VKSTR to a VK
*/
static void str2K ( FuncState * fs , expdesc * e ) {
lua_assert ( e - > k = = VKSTR ) ;
e - > u . info = stringK ( fs , e - > u . strval ) ;
e - > k = VK ;
}
/*
* * Fix an expression to return one result .
* * If expression is not a multi - ret expression ( function call or
@ -728,7 +737,7 @@ void luaK_dischargevars (FuncState *fs, expdesc *e) {
switch ( e - > k ) {
case VCONST : {
TValue * val = & fs - > ls - > dyd - > actvar . arr [ e - > u . info ] . k ;
const2exp ( fs , val , e ) ;
const2exp ( val , e ) ;
break ;
}
case VLOCAL : { /* already in a register */
@ -789,6 +798,9 @@ static void discharge2reg (FuncState *fs, expdesc *e, int reg) {
luaK_codeABC ( fs , OP_LOADBOOL , reg , e - > k = = VTRUE , 0 ) ;
break ;
}
case VKSTR : {
str2K ( fs , e ) ;
} /* FALLTHROUGH */
case VK : {
luaK_codek ( fs , reg , e - > u . info ) ;
break ;
@ -949,6 +961,7 @@ static int luaK_exp2K (FuncState *fs, expdesc *e) {
case VNIL : info = nilK ( fs ) ; break ;
case VKINT : info = luaK_intK ( fs , e - > u . ival ) ; break ;
case VKFLT : info = luaK_numberK ( fs , e - > u . nval ) ; break ;
case VKSTR : info = stringK ( fs , e - > u . strval ) ; break ;
case VK : info = e - > u . info ; break ;
default : return 0 ; /* not a constant */
}
@ -1083,7 +1096,7 @@ void luaK_goiftrue (FuncState *fs, expdesc *e) {
pc = e - > u . info ; /* save jump position */
break ;
}
case VK : case VKFLT : case VKINT : case VTRUE : {
case VK : case VKFLT : case VKINT : case VKSTR : case V TRUE : {
pc = NO_JUMP ; /* always true; do nothing */
break ;
}
@ -1133,7 +1146,7 @@ static void codenot (FuncState *fs, expdesc *e) {
e - > k = VTRUE ; /* true == not nil == not false */
break ;
}
case VK : case VKFLT : case VKINT : case VTRUE : {
case VK : case VKFLT : case VKINT : case VKSTR : case V TRUE : {
e - > k = VFALSE ; /* false == not "x" == not 0.5 == not 1 == not true */
break ;
}
@ -1219,9 +1232,11 @@ static int isSCnumber (expdesc *e, lua_Integer *i, int *isfloat) {
* * values in registers .
*/
void luaK_indexed ( FuncState * fs , expdesc * t , expdesc * k ) {
if ( k - > k = = VKSTR )
str2K ( fs , k ) ;
lua_assert ( ! hasjumps ( t ) & &
( t - > k = = VLOCAL | | t - > k = = VNONRELOC | | t - > k = = VUPVAL ) ) ;
if ( t - > k = = VUPVAL & & ! isKstr ( fs , k ) ) /* upvalue indexed by non string ? */
if ( t - > k = = VUPVAL & & ! isKstr ( fs , k ) ) /* upvalue indexed by non 'Kstr' ? */
luaK_exp2anyreg ( fs , t ) ; /* put it in a register */
if ( t - > k = = VUPVAL ) {
t - > u . ind . t = t - > u . info ; /* upvalue index */