# # # patch "lua/lcode.cc" # from [f755a494252ee0fae30ff6257e3220a52d06971c] # to [7dcb0971d2d8ecbf2e73607798cfc961ceded859] # ============================================================ --- lua/lcode.cc f755a494252ee0fae30ff6257e3220a52d06971c +++ lua/lcode.cc 7dcb0971d2d8ecbf2e73607798cfc961ceded859 @@ -657,10 +657,16 @@ static void codearith (FuncState *fs, Op if (constfolding(op, e1, e2)) return; else { + int o2 = (op != OP_UNM && op != OP_LEN) ? luaK_exp2RK(fs, e2) : 0; int o1 = luaK_exp2RK(fs, e1); - int o2 = (op != OP_UNM && op != OP_LEN) ? luaK_exp2RK(fs, e2) : 0; - freeexp(fs, e2); - freeexp(fs, e1); + if (o1 > o2) { + freeexp(fs, e1); + freeexp(fs, e2); + } + else { + freeexp(fs, e2); + freeexp(fs, e1); + } e1->u.s.info = luaK_codeABC(fs, op, 0, o1, o2); e1->k = VRELOCABLE; } @@ -718,10 +724,15 @@ void luaK_infix (FuncState *fs, BinOpr o luaK_exp2nextreg(fs, v); /* operand must be on the `stack' */ break; } - default: { + case OPR_ADD: case OPR_SUB: case OPR_MUL: case OPR_DIV: + case OPR_MOD: case OPR_POW: { if (!isnumeral(v)) luaK_exp2RK(fs, v); break; } + default: { + luaK_exp2RK(fs, v); + break; + } } }