From d621a6ccc2638fcfea518b7b9f8c377ce93aad8b Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Mon, 9 Apr 2012 14:48:27 +0200 Subject: [PATCH] Fix discharge order of comparisons in Lua parser. --- src/lj_parse.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/lj_parse.c b/src/lj_parse.c index aca719a3..0f32d121 100644 --- a/src/lj_parse.c +++ b/src/lj_parse.c @@ -833,13 +833,14 @@ static void bcemit_comp(FuncState *fs, BinOpr opr, ExpDesc *e1, ExpDesc *e2) } } else { uint32_t op = opr-OPR_LT+BC_ISLT; - BCReg ra; + BCReg ra, rd; if ((op-BC_ISLT) & 1) { /* GT -> LT, GE -> LE */ e1 = e2; e2 = eret; /* Swap operands. */ op = ((op-BC_ISLT)^3)+BC_ISLT; } + rd = expr_toanyreg(fs, e2); ra = expr_toanyreg(fs, e1); - ins = BCINS_AD(op, ra, expr_toanyreg(fs, e2)); + ins = BCINS_AD(op, ra, rd); } /* Using expr_free might cause asserts if the order is wrong. */ if (e1->k == VNONRELOC && e1->u.s.info >= fs->nactvar) fs->freereg--;