boolean constfolding(int op, expdesc e1, expdesc e2) { LuaValue v1, v2, r; if (!e1.isnumeral() || !e2.isnumeral()) return false; if ((op == OP_DIV || op == OP_MOD) && e2.u.nval().eq_b(LuaValue.ZERO)) return false; /* do not attempt to divide by 0 */ v1 = e1.u.nval(); v2 = e2.u.nval(); switch (op) { case OP_ADD: r = v1.add(v2); break; case OP_SUB: r = v1.sub(v2); break; case OP_MUL: r = v1.mul(v2); break; case OP_DIV: r = v1.div(v2); break; case OP_MOD: r = v1.mod(v2); break; case OP_POW: r = v1.pow(v2); break; case OP_UNM: r = v1.neg(); break; case OP_LEN: // r = v1.len(); // break; return false; /* no constant folding for 'len' */ default: _assert(false); r = null; break; } if (Double.isNaN(r.todouble())) return false; /* do not attempt to produce NaN */ e1.u.setNval(r); return true; }