1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
//#define XERR
#include "semval.ih"
void SemVal::constBinary(Opcode::Byte opcode, SemVal const &rhs)
{
switch (opcode)
{
default: // to avoid compiler warnings
break;
case Opcode::mul:
d_value *= rhs.value();
break;
case Opcode::div:
if (rhs.value() == 0)
Error::msg(Error::DIVISION_BY_ZERO) << "/'\n";
else
d_value /= rhs.value();
break;
case Opcode::mod:
if (rhs.value() == 0)
Error::msg(Error::DIVISION_BY_ZERO) << "%'\n";
else
d_value %= rhs.value();
break;
case Opcode::add:
if (d_type & e_str)
{
catString(rhs);
return;
}
d_value += rhs.value();
break;
case Opcode::sub:
d_value -= rhs.value();
break;
case Opcode::eq:
d_value = constCompare(rhs) == 0;
break;
case Opcode::neq:
d_value = constCompare(rhs) != 0;
break;
case Opcode::sm:
d_value = constCompare(rhs) < 0;
break;
case Opcode::gr:
d_value = constCompare(rhs) > 0;
break;
case Opcode::smeq:
d_value = constCompare(rhs) <= 0;
break;
case Opcode::greq:
d_value = constCompare(rhs) >= 0;
break;
// case younger - only run-time
// case older
case Opcode::band:
d_value &= rhs.value();
break;
case Opcode::bor:
d_value |= rhs.value();
break;
case Opcode::bxor:
d_value ^= rhs.value();
break;
case Opcode::shl:
d_value <<= rhs.value();
break;
case Opcode::shr:
d_value >>= rhs.value();
break;
}
d_type = e_int | e_const;
}
|