Expressions #7

Merged
andre merged 21 commits from vm2 into master 2026-05-02 15:07:12 -05:00
3 changed files with 59 additions and 22 deletions
Showing only changes of commit 344e3d3eb0 - Show all commits

2
.idea/tyche.iml generated
View File

@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<module classpath="CMake" type="CPP_MODULE" version="4" /> <module classpath="CIDR" type="CPP_MODULE" version="4" />

View File

@@ -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) #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, 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(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(BitwiseXor, Integer, Integer) { return Value::createInteger(a.as_integer() ^ b.as_integer()); }; 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(Power, Integer, Integer) { return Value::createInteger((int32_t) powl(a.as_integer(), b.as_integer())); };
BIN_OP(ShiftLeft, 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(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()); };
BIN_OP(Modulo, 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 #undef BIN_OP

View File

@@ -6,8 +6,10 @@ namespace tyche::vm {
enum class BinaryOperationType enum class BinaryOperationType
{ {
Sum, Subtraction, Multiplication, Division, IntegerDivision, Equality, Inequality, LessThan, LessThanOrEquals, Sum, Subtraction, Multiplication, Division, IntegerDivision,
GreaterThan, GreaterThanOrEquals, BitwiseAnd, BitwiseOr, BitwiseXor, Power, ShiftLeft, ShiftRight, Modulo, Equality, Inequality, LessThan, LessThanOrEquals,
GreaterThan, GreaterThanOrEquals, Power, Modulo,
BitwiseAnd, BitwiseOr, BitwiseXor, ShiftLeft, ShiftRight,
COUNT COUNT
}; };