diff --git a/.idea/tyche.iml b/.idea/tyche.iml index f08604b..4c94235 100644 --- a/.idea/tyche.iml +++ b/.idea/tyche.iml @@ -1,2 +1,2 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/src/vm/expr.cc b/src/vm/expr.cc index 1d32a88..06e1156 100644 --- a/src/vm/expr.cc +++ b/src/vm/expr.cc @@ -20,40 +20,75 @@ static int init_ = []() { #define BIN_OP(op, t1, t2) binary_ops[(size_t) BinaryOperationType::op][(size_t) Type::t1][(size_t) Type::t2] = [](Value const& b, Value const& a) BIN_OP(Sum, Integer, Integer) { return Value::createInteger(a.as_integer() + b.as_integer()); }; + BIN_OP(Sum, Integer, Float) { return Value::createFloat((float) a.as_integer() + b.as_float()); }; + BIN_OP(Sum, Float, Integer) { return Value::createFloat(a.as_float() + (float) b.as_integer()); }; + BIN_OP(Sum, Float, Float) { return Value::createFloat(a.as_float() + b.as_float()); }; - BIN_OP(Subtraction, Integer, Integer) { return Value::createInteger(a.as_integer() - b.as_integer()); }; + BIN_OP(Subtraction, Integer, Integer) { return Value::createInteger(a.as_integer() + b.as_integer()); }; + BIN_OP(, Integer, Float) { return Value::createFloat((float) a.as_integer() + b.as_float()); }; + BIN_OP(, Float, Integer) { return Value::createFloat(a.as_float() + (float) b.as_integer()); }; + BIN_OP(, Float, Float) { return Value::createFloat(a.as_float() + b.as_float()); }; - BIN_OP(Multiplication, Integer, Integer) { return Value::createInteger(a.as_integer() * b.as_integer()); }; + BIN_OP(Multiplication, Integer, Integer) { return Value::createInteger(a.as_integer() + b.as_integer()); }; + BIN_OP(, Integer, Float) { return Value::createFloat((float) a.as_integer() + b.as_float()); }; + BIN_OP(, Float, Integer) { return Value::createFloat(a.as_float() + (float) b.as_integer()); }; + BIN_OP(, Float, Float) { return Value::createFloat(a.as_float() + b.as_float()); }; - BIN_OP(Division, Integer, Integer) { return Value::createFloat((float) a.as_integer() / (float) b.as_integer()); }; + BIN_OP(Division, Integer, Integer) { return Value::createInteger(a.as_integer() + b.as_integer()); }; + BIN_OP(, Integer, Float) { return Value::createFloat((float) a.as_integer() + b.as_float()); }; + BIN_OP(, Float, Integer) { return Value::createFloat(a.as_float() + (float) b.as_integer()); }; + BIN_OP(, Float, Float) { return Value::createFloat(a.as_float() + b.as_float()); }; - BIN_OP(IntegerDivision, Integer, Integer) { return Value::createInteger(a.as_integer() / b.as_integer()); }; + BIN_OP(IntegerDivision, Integer, Integer) { return Value::createInteger(a.as_integer() + b.as_integer()); }; + BIN_OP(, Integer, Float) { return Value::createFloat((float) a.as_integer() + b.as_float()); }; + BIN_OP(, Float, Integer) { return Value::createFloat(a.as_float() + (float) b.as_integer()); }; + BIN_OP(, Float, Float) { return Value::createFloat(a.as_float() + b.as_float()); }; - BIN_OP(Equality, Integer, Integer) { return Value::CreateIntegerFromBool(a.as_integer() == b.as_integer()); }; + BIN_OP(Equality, Integer, Integer) { return Value::createInteger(a.as_integer() + b.as_integer()); }; + BIN_OP(, Integer, Float) { return Value::createFloat((float) a.as_integer() + b.as_float()); }; + BIN_OP(, Float, Integer) { return Value::createFloat(a.as_float() + (float) b.as_integer()); }; + BIN_OP(, Float, Float) { return Value::createFloat(a.as_float() + b.as_float()); }; - BIN_OP(Inequality, Integer, Integer) { return Value::CreateIntegerFromBool(a.as_integer() != b.as_integer()); }; + BIN_OP(Inequality, Integer, Integer) { return Value::createInteger(a.as_integer() + b.as_integer()); }; + BIN_OP(, Integer, Float) { return Value::createFloat((float) a.as_integer() + b.as_float()); }; + BIN_OP(, Float, Integer) { return Value::createFloat(a.as_float() + (float) b.as_integer()); }; + BIN_OP(, Float, Float) { return Value::createFloat(a.as_float() + b.as_float()); }; - BIN_OP(LessThan, Integer, Integer) { return Value::CreateIntegerFromBool(a.as_integer() < b.as_integer()); }; + BIN_OP(LessThan, Integer, Integer) { return Value::createInteger(a.as_integer() + b.as_integer()); }; + BIN_OP(, Integer, Float) { return Value::createFloat((float) a.as_integer() + b.as_float()); }; + BIN_OP(, Float, Integer) { return Value::createFloat(a.as_float() + (float) b.as_integer()); }; + BIN_OP(, Float, Float) { return Value::createFloat(a.as_float() + b.as_float()); }; - BIN_OP(LessThanOrEquals, Integer, Integer) { return Value::CreateIntegerFromBool(a.as_integer() <= b.as_integer()); }; + BIN_OP(LessThanOrEquals, Integer, Integer) { return Value::createInteger(a.as_integer() + b.as_integer()); }; + BIN_OP(, Integer, Float) { return Value::createFloat((float) a.as_integer() + b.as_float()); }; + BIN_OP(, Float, Integer) { return Value::createFloat(a.as_float() + (float) b.as_integer()); }; + BIN_OP(, Float, Float) { return Value::createFloat(a.as_float() + b.as_float()); }; - BIN_OP(GreaterThan, Integer, Integer) { return Value::CreateIntegerFromBool(a.as_integer() > b.as_integer()); }; + BIN_OP(GreaterThan, Integer, Integer) { return Value::createInteger(a.as_integer() + b.as_integer()); }; + BIN_OP(, Integer, Float) { return Value::createFloat((float) a.as_integer() + b.as_float()); }; + BIN_OP(, Float, Integer) { return Value::createFloat(a.as_float() + (float) b.as_integer()); }; + BIN_OP(, Float, Float) { return Value::createFloat(a.as_float() + b.as_float()); }; - BIN_OP(GreaterThanOrEquals, Integer, Integer) { return Value::CreateIntegerFromBool(a.as_integer() >= b.as_integer()); }; + BIN_OP(GreaterThanOrEquals, Integer, Integer) { return Value::createInteger(a.as_integer() + b.as_integer()); }; + BIN_OP(, Integer, Float) { return Value::createFloat((float) a.as_integer() + b.as_float()); }; + BIN_OP(, Float, Integer) { return Value::createFloat(a.as_float() + (float) b.as_integer()); }; + BIN_OP(, Float, Float) { return Value::createFloat(a.as_float() + b.as_float()); }; - BIN_OP(BitwiseAnd, Integer, Integer) { return Value::createInteger(a.as_integer() & b.as_integer()); }; + BIN_OP(Power, Integer, Integer) { return Value::createInteger(a.as_integer() + b.as_integer()); }; + BIN_OP(, Integer, Float) { return Value::createFloat((float) a.as_integer() + b.as_float()); }; + BIN_OP(, Float, Integer) { return Value::createFloat(a.as_float() + (float) b.as_integer()); }; + BIN_OP(, Float, Float) { return Value::createFloat(a.as_float() + b.as_float()); }; - BIN_OP(BitwiseOr, Integer, Integer) { return Value::createInteger(a.as_integer() | b.as_integer()); }; - - BIN_OP(BitwiseXor, Integer, Integer) { return Value::createInteger(a.as_integer() ^ b.as_integer()); }; - - BIN_OP(Power, Integer, Integer) { return Value::createInteger((int32_t) powl(a.as_integer(), b.as_integer())); }; + BIN_OP(Modulo, Integer, Integer) { return Value::createInteger(a.as_integer() + b.as_integer()); }; + BIN_OP(, Integer, Float) { return Value::createFloat((float) a.as_integer() + b.as_float()); }; + BIN_OP(, Float, Integer) { return Value::createFloat(a.as_float() + (float) b.as_integer()); }; + BIN_OP(, Float, Float) { return Value::createFloat(a.as_float() + b.as_float()); }; BIN_OP(ShiftLeft, Integer, Integer) { return Value::createInteger(a.as_integer() << b.as_integer()); }; - BIN_OP(ShiftRight, Integer, Integer) { return Value::createInteger(a.as_integer() >> b.as_integer()); }; - - BIN_OP(Modulo, Integer, Integer) { return Value::createInteger(a.as_integer() % b.as_integer()); }; + BIN_OP(BitwiseAnd, Integer, Integer) { return Value::createInteger(a.as_integer() & b.as_integer()); }; + BIN_OP(BitwiseOr, Integer, Integer) { return Value::createInteger(a.as_integer() | b.as_integer()); }; + BIN_OP(BitwiseXor, Integer, Integer) { return Value::createInteger(a.as_integer() ^ b.as_integer()); }; #undef BIN_OP diff --git a/src/vm/expr.hh b/src/vm/expr.hh index a0bc4dd..6250812 100644 --- a/src/vm/expr.hh +++ b/src/vm/expr.hh @@ -6,8 +6,10 @@ namespace tyche::vm { enum class BinaryOperationType { - Sum, Subtraction, Multiplication, Division, IntegerDivision, Equality, Inequality, LessThan, LessThanOrEquals, - GreaterThan, GreaterThanOrEquals, BitwiseAnd, BitwiseOr, BitwiseXor, Power, ShiftLeft, ShiftRight, Modulo, + Sum, Subtraction, Multiplication, Division, IntegerDivision, + Equality, Inequality, LessThan, LessThanOrEquals, + GreaterThan, GreaterThanOrEquals, Power, Modulo, + BitwiseAnd, BitwiseOr, BitwiseXor, ShiftLeft, ShiftRight, COUNT };