bool UnaryOpExpression::preCompute(CVarRef value, Variant &result) {
  switch(m_op) {
  case '!':
    result = (!toBoolean(value)); break;
  case '+':
    result = value.unary_plus(); break;
  case '-':
    result = value.negate(); break;
  case '~':
    result = ~value; break;
  case '(':
  case '@':
    result = value; break;
  case T_INT_CAST:
    result = value.toInt64(); break;
  case T_DOUBLE_CAST:
    result = toDouble(value); break;
  case T_STRING_CAST:
    result = toString(value); break;
  case T_BOOL_CAST:
    result = toBoolean(value); break;
  case T_INC:
  case T_DEC:
    ASSERT(false);
  default:
    return false;
  }
  return true;
}
bool UnaryOpExpression::preCompute(CVarRef value, Variant &result) {
  bool ret = true;
  try {
    g_context->setThrowAllErrors(true);
    switch(m_op) {
      case '!':
        result = (!toBoolean(value)); break;
      case '+':
        result = value.unary_plus(); break;
      case '-':
        result = value.negate(); break;
      case '~':
        result = value.bitNot(); break;
      case '@':
        result = value; break;
      case T_INT_CAST:
        result = value.toInt64(); break;
      case T_DOUBLE_CAST:
        result = toDouble(value); break;
      case T_STRING_CAST:
        result = toString(value); break;
      case T_BOOL_CAST:
        result = toBoolean(value); break;
      case T_EMPTY:
        result = empty(value); break;
      case T_ISSET:
        result = isset(value); break;
      case T_INC:
      case T_DEC:
        assert(false);
      default:
        ret = false;
        break;
    }
  } catch (...) {
    ret = false;
  }
  g_context->setThrowAllErrors(false);
  return ret;
}