This commit is contained in:
Andre Wagner
2026-05-16 15:00:00 -05:00
parent d4aa83869c
commit df8edb549d
7 changed files with 83 additions and 13 deletions

View File

@@ -1,6 +1,7 @@
#include "priv.h"
#include <stdbool.h>
#include <math.h>
static bool was_init = false;
@@ -10,8 +11,23 @@ static BIN_EXPR_FN bin_expr_fn[TX_COUNT__][TT_COUNT__][TT_COUNT__];
static TYC_RESULT default_bin_op(VALUE a, VALUE b, VALUE* r) { (void) a; (void) b, (void) r; return T_ERR_EXPR_INCORRECT_TYPES; }
#define BIN_OP(name) static TYC_RESULT name(VALUE a, VALUE b, VALUE* r)
BIN_OP(sum_int) { *r = create_value_integer(value_integer(a) + value_integer(b)); return T_OK; }
BIN_OP(sub_int) { *r = create_value_integer(value_integer(a) - value_integer(b)); return T_OK; }
BIN_OP(sum_int_int) { *r = create_value_integer(value_integer(a) + value_integer(b)); return T_OK; }
BIN_OP(sub_int_int) { *r = create_value_integer(value_integer(a) - value_integer(b)); return T_OK; }
BIN_OP(mul_int_int) { *r = create_value_integer(value_integer(a) * value_integer(b)); return T_OK; }
BIN_OP(idiv_int_int) { *r = create_value_integer(value_integer(a) / value_integer(b)); return T_OK; }
BIN_OP(eq_int_int) { *r = create_value_from_bool(value_integer(a) == value_integer(b)); return T_OK; }
BIN_OP(neq_int_int) { *r = create_value_from_bool(value_integer(a) != value_integer(b)); return T_OK; }
BIN_OP(lt_int_int) { *r = create_value_from_bool(value_integer(a) < value_integer(b)); return T_OK; }
BIN_OP(lte_int_int) { *r = create_value_from_bool(value_integer(a) <= value_integer(b)); return T_OK; }
BIN_OP(gt_int_int) { *r = create_value_from_bool(value_integer(a) > value_integer(b)); return T_OK; }
BIN_OP(gte_int_int) { *r = create_value_from_bool(value_integer(a) >= value_integer(b)); return T_OK; }
BIN_OP(and_int_int) { *r = create_value_integer(value_integer(a) & value_integer(b)); return T_OK; }
BIN_OP(or_int_int) { *r = create_value_integer(value_integer(a) | value_integer(b)); return T_OK; }
BIN_OP(xor_int_int) { *r = create_value_integer(value_integer(a) ^ value_integer(b)); return T_OK; }
BIN_OP(pow_int_int) { *r = create_value_integer(pow(value_integer(a), value_integer(b))); return T_OK; }
BIN_OP(shl_int_int) { *r = create_value_integer(value_integer(a) << value_integer(b)); return T_OK; }
BIN_OP(shr_int_int) { *r = create_value_integer(value_integer(a) >> value_integer(b)); return T_OK; }
BIN_OP(mod_int_int) { *r = create_value_integer(value_integer(a) % value_integer(b)); return T_OK; }
void expr_init(void)
{
@@ -23,8 +39,23 @@ void expr_init(void)
for (size_t k = 0; k < TT_COUNT__; ++k)
bin_expr_fn[i][j][k] = default_bin_op;
bin_expr_fn[TX_SUM][TT_INTEGER][TT_INTEGER] = sum_int;
bin_expr_fn[TX_SUBTRACT][TT_INTEGER][TT_INTEGER] = sub_int;
bin_expr_fn[TX_SUM][TT_INTEGER][TT_INTEGER] = sum_int_int;
bin_expr_fn[TX_SUB][TT_INTEGER][TT_INTEGER] = sub_int_int;
bin_expr_fn[TX_MUL][TT_INTEGER][TT_INTEGER] = mul_int_int;
bin_expr_fn[TX_IDIV][TT_INTEGER][TT_INTEGER] = idiv_int_int;
bin_expr_fn[TX_EQ][TT_INTEGER][TT_INTEGER] = eq_int_int;
bin_expr_fn[TX_NEQ][TT_INTEGER][TT_INTEGER] = neq_int_int;
bin_expr_fn[TX_LT][TT_INTEGER][TT_INTEGER] = lt_int_int;
bin_expr_fn[TX_LTE][TT_INTEGER][TT_INTEGER] = lte_int_int;
bin_expr_fn[TX_GT][TT_INTEGER][TT_INTEGER] = gt_int_int;
bin_expr_fn[TX_GTE][TT_INTEGER][TT_INTEGER] = gte_int_int;
bin_expr_fn[TX_AND][TT_INTEGER][TT_INTEGER] = and_int_int;
bin_expr_fn[TX_OR][TT_INTEGER][TT_INTEGER] = or_int_int;
bin_expr_fn[TX_XOR][TT_INTEGER][TT_INTEGER] = xor_int_int;
bin_expr_fn[TX_POW][TT_INTEGER][TT_INTEGER] = pow_int_int;
bin_expr_fn[TX_SHL][TT_INTEGER][TT_INTEGER] = shl_int_int;
bin_expr_fn[TX_SHR][TT_INTEGER][TT_INTEGER] = shr_int_int;
bin_expr_fn[TX_MOD][TT_INTEGER][TT_INTEGER] = mod_int_int;
was_init = true;
}

View File

@@ -140,6 +140,7 @@ uint32_t value_idx(VALUE v);
bool value_is_zero(VALUE v);
VALUE create_value_nil(void);
VALUE create_value_from_bool(bool b);
VALUE create_value_integer(int32_t v);
VALUE create_value_real(float f);
VALUE create_value_idx(TYC_TYPE type, uint32_t idx);

View File

@@ -20,7 +20,8 @@ typedef enum {
} TYC_RESULT;
typedef enum {
TX_SUM, TX_SUBTRACT,
TX_SUM, TX_SUB, TX_MUL, TX_IDIV, TX_EQ, TX_NEQ, TX_LT, TX_LTE, TX_GT, TX_GTE, TX_AND, TX_OR, TX_XOR, TX_POW,
TX_SHL, TX_SHR, TX_MOD,
TX_COUNT__
} TYC_EXPR;

View File

@@ -46,6 +46,11 @@ VALUE create_value_nil(void)
return (VALUE) { .type = TT_NIL };
}
VALUE create_value_from_bool(bool b)
{
return b ? create_value_integer(1) : create_value_integer(0);
}
VALUE create_value_integer(int32_t v)
{
return (VALUE) { .type = TT_INTEGER, .v = { .i = v } };

View File

@@ -221,8 +221,23 @@ static TYC_RESULT step(TycheVM* T)
// expressions
//
case TO_SUM: TRY(tyc_expr(T, TX_SUM)); break;
case TO_SUB: TRY(tyc_expr(T, TX_SUBTRACT)); break;
case TO_SUM: TRY(tyc_expr(T, TX_SUM)); break;
case TO_SUB: TRY(tyc_expr(T, TX_SUB)); break;
case TO_MUL: TRY(tyc_expr(T, TX_MUL)); break;
case TO_IDIV: TRY(tyc_expr(T, TX_IDIV)); break;
case TO_EQ: TRY(tyc_expr(T, TX_EQ)); break;
case TO_NEQ: TRY(tyc_expr(T, TX_NEQ)); break;
case TO_LT: TRY(tyc_expr(T, TX_LT)); break;
case TO_LTE: TRY(tyc_expr(T, TX_LTE)); break;
case TO_GT: TRY(tyc_expr(T, TX_GT)); break;
case TO_GTE: TRY(tyc_expr(T, TX_GTE)); break;
case TO_AND: TRY(tyc_expr(T, TX_AND)); break;
case TO_OR: TRY(tyc_expr(T, TX_OR)); break;
case TO_XOR: TRY(tyc_expr(T, TX_XOR)); break;
case TO_POW: TRY(tyc_expr(T, TX_POW)); break;
case TO_SHL: TRY(tyc_expr(T, TX_SHL)); break;
case TO_SHR: TRY(tyc_expr(T, TX_SHR)); break;
case TO_MOD: TRY(tyc_expr(T, TX_MOD)); break;
//
// function calls