summaryrefslogtreecommitdiff
path: root/eval.c
diff options
context:
space:
mode:
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/eval.c b/eval.c
index 4d719a4..01a3fbe 100644
--- a/eval.c
+++ b/eval.c
@@ -70,8 +70,13 @@ static bool eval_expr(Expression *e, Value *v) {
/* NOTE: this will need to change for short-circuiting */
if (!eval_expr(e->binary.lhs, &lhs)) return false;
if (!eval_expr(e->binary.rhs, &rhs)) return false;
+ if (e->type.kind != TYPE_BUILTIN) {
+ err_print(e->where, "Operators can only be applied to builtin types.");
+ return false;
+ }
bool is_int = type_builtin_is_integer(e->type.builtin);
bool is_float = type_builtin_is_floating(e->type.builtin);
+ bool is_bool = e->type.builtin == BUILTIN_BOOL;
switch (e->binary.op) {
case BINARY_PLUS:
if (is_int) {
@@ -102,6 +107,52 @@ static bool eval_expr(Expression *e, Value *v) {
v->floatv = lhs.floatv / rhs.floatv;
} else assert(0);
return true;
+ case BINARY_EQ:
+ if (is_int) {
+ v->boolv = lhs.intv == rhs.intv;
+ } else if (is_float) {
+ v->boolv = lhs.floatv == rhs.floatv;
+ } else if (is_bool) {
+ v->boolv = lhs.boolv == rhs.boolv;
+ } else assert(0);
+ return true;
+ case BINARY_NE:
+ if (is_int) {
+ v->boolv = lhs.intv != rhs.intv;
+ } else if (is_float) {
+ v->boolv = lhs.floatv != rhs.floatv;
+ } else if (is_bool) {
+ v->boolv = lhs.boolv != rhs.boolv;
+ } else assert(0);
+ return true;
+ case BINARY_GT:
+ if (is_int) {
+ v->boolv = lhs.intv > rhs.intv;
+ } else if (is_float) {
+ v->boolv = lhs.floatv > rhs.floatv;
+ } else assert(0);
+ return true;
+ case BINARY_GE:
+ if (is_int) {
+ v->boolv = lhs.intv >= rhs.intv;
+ } else if (is_float) {
+ v->boolv = lhs.floatv >= rhs.floatv;
+ } else assert(0);
+ return true;
+ case BINARY_LT:
+ if (is_int) {
+ v->boolv = lhs.intv < rhs.intv;
+ } else if (is_float) {
+ v->boolv = lhs.floatv < rhs.floatv;
+ } else assert(0);
+ return true;
+ case BINARY_LE:
+ if (is_int) {
+ v->boolv = lhs.intv <= rhs.intv;
+ } else if (is_float) {
+ v->boolv = lhs.floatv <= rhs.floatv;
+ } else assert(0);
+ return true;
case BINARY_SET:
return true;
case BINARY_COMMA: