From b03c7b41788a7700bce4ec6032f6a26a4dbc2feb Mon Sep 17 00:00:00 2001 From: Andre Wagner Date: Sat, 2 May 2026 09:32:19 -0500 Subject: [PATCH] . --- src/vm/expr.cc | 62 +++++++++++++++++++++++-------------------------- src/vm/expr.hh | 2 ++ src/vm/value.hh | 2 +- 3 files changed, 32 insertions(+), 34 deletions(-) diff --git a/src/vm/expr.cc b/src/vm/expr.cc index 56b04cc..a1c2fe8 100644 --- a/src/vm/expr.cc +++ b/src/vm/expr.cc @@ -44,46 +44,42 @@ static int init_ = []() { BIN_OP(IntegerDivision, Float, Integer) { return Value::createInteger((int32_t) a.as_float() / b.as_integer()); }; BIN_OP(IntegerDivision, Float, Float) { return Value::createInteger((int32_t) a.as_float() / (int32_t) b.as_float()); }; - BIN_OP(Equality, Integer, Integer) { return Value::createInteger(a.as_integer() + b.as_integer()); }; - BIN_OP(Equality, Integer, Float) { return Value::createFloat((float) a.as_integer() + b.as_float()); }; - BIN_OP(Equality, Float, Integer) { return Value::createFloat(a.as_float() + (float) b.as_integer()); }; - BIN_OP(Equality, 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, Float) { return Value::createIntegerFromBool(std::abs((float) a.as_integer() - b.as_float()) < FLOAT_EPSILON); }; + BIN_OP(Equality, Float, Integer) { return Value::createIntegerFromBool(std::abs(a.as_float() - (float) b.as_integer()) < FLOAT_EPSILON); }; + BIN_OP(Equality, Float, Float) { return Value::createIntegerFromBool(std::abs(a.as_float() - b.as_float()) < FLOAT_EPSILON); }; - BIN_OP(Inequality, Integer, Integer) { return Value::createInteger(a.as_integer() + b.as_integer()); }; - BIN_OP(Inequality, Integer, Float) { return Value::createFloat((float) a.as_integer() + b.as_float()); }; - BIN_OP(Inequality, Float, Integer) { return Value::createFloat(a.as_float() + (float) b.as_integer()); }; - BIN_OP(Inequality, 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, Float) { return Value::createIntegerFromBool(std::abs((float) a.as_integer() - b.as_float()) >= FLOAT_EPSILON); }; + BIN_OP(Inequality, Float, Integer) { return Value::createIntegerFromBool(std::abs(a.as_float() - (float) b.as_integer()) >= FLOAT_EPSILON); }; + BIN_OP(Inequality, Float, Float) { return Value::createIntegerFromBool(std::abs(a.as_float() - b.as_float()) >= FLOAT_EPSILON); }; - BIN_OP(LessThan, Integer, Integer) { return Value::createInteger(a.as_integer() + b.as_integer()); }; - BIN_OP(LessThan, Integer, Float) { return Value::createFloat((float) a.as_integer() + b.as_float()); }; - BIN_OP(LessThan, Float, Integer) { return Value::createFloat(a.as_float() + (float) b.as_integer()); }; - BIN_OP(LessThan, 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, Float) { return Value::createIntegerFromBool((float) a.as_integer() < b.as_float()); }; + BIN_OP(LessThan, Float, Integer) { return Value::createIntegerFromBool(a.as_float() < (float) b.as_integer()); }; + BIN_OP(LessThan, Float, Float) { return Value::createIntegerFromBool(a.as_float() < b.as_float()); }; - BIN_OP(LessThanOrEquals, Integer, Integer) { return Value::createInteger(a.as_integer() + b.as_integer()); }; - BIN_OP(LessThanOrEquals, Integer, Float) { return Value::createFloat((float) a.as_integer() + b.as_float()); }; - BIN_OP(LessThanOrEquals, Float, Integer) { return Value::createFloat(a.as_float() + (float) b.as_integer()); }; - BIN_OP(LessThanOrEquals, 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, Float) { return Value::createIntegerFromBool((float) a.as_integer() <= b.as_float()); }; + BIN_OP(LessThanOrEquals, Float, Integer) { return Value::createIntegerFromBool(a.as_float() <= (float) b.as_integer()); }; + BIN_OP(LessThanOrEquals, Float, Float) { return Value::createIntegerFromBool(a.as_float() <= b.as_float()); }; - BIN_OP(GreaterThan, Integer, Integer) { return Value::createInteger(a.as_integer() + b.as_integer()); }; - BIN_OP(GreaterThan, Integer, Float) { return Value::createFloat((float) a.as_integer() + b.as_float()); }; - BIN_OP(GreaterThan, Float, Integer) { return Value::createFloat(a.as_float() + (float) b.as_integer()); }; - BIN_OP(GreaterThan, 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, Float) { return Value::createIntegerFromBool((float) a.as_integer() > b.as_float()); }; + BIN_OP(GreaterThan, Float, Integer) { return Value::createIntegerFromBool(a.as_float() > (float) b.as_integer()); }; + BIN_OP(GreaterThan, Float, Float) { return Value::createIntegerFromBool(a.as_float() > b.as_float()); }; - BIN_OP(GreaterThanOrEquals, Integer, Integer) { return Value::createInteger(a.as_integer() + b.as_integer()); }; - BIN_OP(GreaterThanOrEquals, Integer, Float) { return Value::createFloat((float) a.as_integer() + b.as_float()); }; - BIN_OP(GreaterThanOrEquals, Float, Integer) { return Value::createFloat(a.as_float() + (float) b.as_integer()); }; - BIN_OP(GreaterThanOrEquals, 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, Float) { return Value::createIntegerFromBool((float) a.as_integer() >= b.as_float()); }; + BIN_OP(GreaterThanOrEquals, Float, Integer) { return Value::createIntegerFromBool(a.as_float() >= (float) b.as_integer()); }; + BIN_OP(GreaterThanOrEquals, Float, Float) { return Value::createIntegerFromBool(a.as_float() >= b.as_float()); }; - BIN_OP(Power, Integer, Integer) { return Value::createInteger(a.as_integer() + b.as_integer()); }; - BIN_OP(Power, Integer, Float) { return Value::createFloat((float) a.as_integer() + b.as_float()); }; - BIN_OP(Power, Float, Integer) { return Value::createFloat(a.as_float() + (float) b.as_integer()); }; - BIN_OP(Power, Float, Float) { return Value::createFloat(a.as_float() + b.as_float()); }; - - BIN_OP(Modulo, Integer, Integer) { return Value::createInteger(a.as_integer() + b.as_integer()); }; - BIN_OP(Modulo, Integer, Float) { return Value::createFloat((float) a.as_integer() + b.as_float()); }; - BIN_OP(Modulo, Float, Integer) { return Value::createFloat(a.as_float() + (float) b.as_integer()); }; - BIN_OP(Modulo, Float, Float) { return Value::createFloat(a.as_float() + b.as_float()); }; + BIN_OP(Power, Integer, Integer) { return Value::createInteger((int32_t) powl(a.as_integer(), b.as_integer())); }; + BIN_OP(Power, Integer, Float) { return Value::createFloat(powf((float) a.as_integer(), b.as_float())); }; + BIN_OP(Power, Float, Integer) { return Value::createFloat(powf(a.as_float(), (float) b.as_integer())); }; + BIN_OP(Power, Float, Float) { return Value::createFloat(powf(a.as_float(), b.as_float())); }; + BIN_OP(Modulo, Integer, Integer) { return Value::createInteger(a.as_integer() % b.as_integer()); }; 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(BitwiseAnd, Integer, Integer) { return Value::createInteger(a.as_integer() & b.as_integer()); }; diff --git a/src/vm/expr.hh b/src/vm/expr.hh index 6250812..c1fb67f 100644 --- a/src/vm/expr.hh +++ b/src/vm/expr.hh @@ -13,6 +13,8 @@ enum class BinaryOperationType COUNT }; +constexpr float FLOAT_EPSILON = 0.000001f; + Value binary_operation(Value const& a, Value const& b, BinaryOperationType op); } diff --git a/src/vm/value.hh b/src/vm/value.hh index 5699cdb..0318ecd 100644 --- a/src/vm/value.hh +++ b/src/vm/value.hh @@ -28,7 +28,7 @@ public: static Value createString(std::string const& str) { return Value(str); } static Value createFunctionId(FunctionId f_id) { return Value(Function { f_id }); } - static Value CreateIntegerFromBool(bool b) { return createInteger(b ? 1 : 0); } + static Value createIntegerFromBool(bool b) { return createInteger(b ? 1 : 0); } [[nodiscard]] Type type() const;