diff options
Diffstat (limited to 'lcode.c')
-rw-r--r-- | lcode.c | 22 |
1 files changed, 5 insertions, 17 deletions
@@ -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 | ||
640 | static int constfolding (OpCode op, expdesc *e1, expdesc *e2) { | 640 | static 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; |