Esempio n. 1
0
 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;
 }