aboutsummaryrefslogtreecommitdiff
path: root/lcode.c
diff options
context:
space:
mode:
Diffstat (limited to 'lcode.c')
-rw-r--r--lcode.c22
1 files changed, 5 insertions, 17 deletions
diff --git a/lcode.c b/lcode.c
index 87bf2f92..bbf4e813 100644
--- a/lcode.c
+++ b/lcode.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lcode.c,v 2.37 2009/06/10 16:52:03 roberto Exp roberto $ 2** $Id: lcode.c,v 2.38 2009/06/15 13:52:08 roberto Exp roberto $
3** Code generator for Lua 3** Code generator for Lua
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -638,23 +638,11 @@ void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k) {
638 638
639 639
640static int constfolding (OpCode op, expdesc *e1, expdesc *e2) { 640static int constfolding (OpCode op, expdesc *e1, expdesc *e2) {
641 lua_Number v1, v2, r; 641 lua_Number r;
642 if (!isnumeral(e1) || !isnumeral(e2)) return 0; 642 if (!isnumeral(e1) || !isnumeral(e2)) return 0;
643 v1 = e1->u.nval; 643 if ((op == OP_DIV || op == OP_MOD) && e2->u.nval == 0)
644 v2 = e2->u.nval; 644 return 0; /* do not attempt to divide by 0 */
645 switch (op) { 645 r = luaO_arith(op - OP_ADD + LUA_OPADD, e1->u.nval, e2->u.nval);
646 case OP_ADD: r = luai_numadd(NULL, v1, v2); break;
647 case OP_SUB: r = luai_numsub(NULL, v1, v2); break;
648 case OP_MUL: r = luai_nummul(NULL, v1, v2); break;
649 case OP_DIV:
650 if (v2 == 0) return 0; /* do not attempt to divide by 0 */
651 r = luai_numdiv(NULL, v1, v2); break;
652 case OP_MOD:
653 if (v2 == 0) return 0; /* do not attempt to divide by 0 */
654 r = luai_nummod(NULL, v1, v2); break;
655 case OP_POW: r = luai_numpow(NULL, v1, v2); break;
656 default: lua_assert(0); r = 0; break;
657 }
658 if (luai_numisnan(NULL, r)) return 0; /* do not attempt to produce NaN */ 646 if (luai_numisnan(NULL, r)) return 0; /* do not attempt to produce NaN */
659 e1->u.nval = r; 647 e1->u.nval = r;
660 return 1; 648 return 1;