From 1600560c3e191f5d549dd9cbb7cc4f923a699aa3 Mon Sep 17 00:00:00 2001 From: Leo Tenenbaum Date: Fri, 8 Nov 2019 13:37:22 -0500 Subject: got +=, -= to work with pointer arithmetic --- eval.c | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) (limited to 'eval.c') diff --git a/eval.c b/eval.c index 1d893f4..a3c2c83 100644 --- a/eval.c +++ b/eval.c @@ -965,13 +965,24 @@ static void eval_numerical_bin_op(Value lhs, Type *lhs_type, BinaryOp op, Value out->boolv = lhs.ptr op rhs.ptr; \ else { eval_binary_bool_op_nums_only(op); } - assert(out_type->kind == TYPE_BUILTIN); BuiltinType builtin = out_type->builtin; switch (op) { case BINARY_ADD: - eval_binary_op_nums_only(+); break; + if (lhs_type->kind == TYPE_PTR) { + out->ptr = (char *)lhs.ptr + val_to_i64(&rhs, rhs_type->builtin) + * (I64)compiler_sizeof(lhs_type->ptr); + } else { + eval_binary_op_nums_only(+); + } + break; case BINARY_SUB: - eval_binary_op_nums_only(-); break; + if (lhs_type->kind == TYPE_PTR) { + out->ptr = (char *)lhs.ptr - val_to_i64(&rhs, rhs_type->builtin) + * (I64)compiler_sizeof(lhs_type->ptr); + } else { + eval_binary_op_nums_only(-); + } + break; case BINARY_MUL: eval_binary_op_nums_only(*); break; case BINARY_DIV: @@ -1097,21 +1108,7 @@ static bool eval_expr(Evaluator *ev, Expression *e, Value *v) { eval_deref(v, ptr, &e->type); } break; case BINARY_ADD: - if (e->binary.lhs->type.kind == TYPE_PTR) { - v->ptr = (char *)lhs.ptr + val_to_i64(&rhs, e->binary.rhs->type.builtin) - * (I64)compiler_sizeof(e->binary.lhs->type.ptr); - } else { - eval_numerical_bin_op(lhs, &e->binary.lhs->type, BINARY_ADD, rhs, &e->binary.rhs->type, v, &e->type); - } - break; case BINARY_SUB: - if (e->binary.lhs->type.kind == TYPE_PTR) { - v->ptr = (char *)lhs.ptr - val_to_i64(&rhs, e->binary.rhs->type.builtin) - * (I64)compiler_sizeof(e->binary.lhs->type.ptr); - } else { - eval_numerical_bin_op(lhs, &e->binary.lhs->type, BINARY_SUB, rhs, &e->binary.rhs->type, v, &e->type); - } - break; case BINARY_MUL: case BINARY_DIV: case BINARY_LT: -- cgit v1.2.3