From b07ece568d8d62ca80a8ba3b43fb46a98e117d5a Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Sat, 23 Oct 2021 18:19:14 +0200 Subject: Add logic operations --- src/bytecode/vm.h | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) (limited to 'src/bytecode/vm.h') diff --git a/src/bytecode/vm.h b/src/bytecode/vm.h index 9b68fc1..c94e22b 100755 --- a/src/bytecode/vm.h +++ b/src/bytecode/vm.h @@ -59,6 +59,35 @@ vm_reset(VM *vm) { array_push(vm->stack, FIXNUM_VAL(y OP x)); \ } while (false) +#define FIXNUM_CMP_OP(OP) \ + do { \ + Object a = array_pop(vm->stack); \ + Object b = array_pop(vm->stack); \ + if (!IS_FIXNUM(a) || !IS_FIXNUM(b)) { \ + error_push((Error){ \ + .type = ERR_TYPE_RUNTIME, \ + .value = ERR_WRONG_ARG_TYPE, \ + .line = vm->chunk->lines[vm->pc - vm->chunk->code - 1].line, \ + .col = vm->chunk->lines[vm->pc - vm->chunk->code - 1].col, \ + }); \ + return; \ + } \ + ssize_t x = AS_FIXNUM(a); \ + ssize_t y = AS_FIXNUM(b); \ + Object result = y OP x ? TRUE_VAL : FALSE_VAL; \ + array_push(vm->stack, result); \ + } while (false) + +#define LOGIC_OP(OP) \ + do { \ + Object a = array_pop(vm->stack); \ + Object b = array_pop(vm->stack); \ + bool x = IS_TRUE(a); \ + bool y = IS_TRUE(b); \ + Object result = y OP x ? TRUE_VAL : FALSE_VAL; \ + array_push(vm->stack, result); \ + } while (false) + void vm_interpret(VM *vm, Chunk *chunk) { vm->chunk = chunk; @@ -97,6 +126,18 @@ vm_interpret(VM *vm, Chunk *chunk) { case OP_MUL: { FIXNUM_BINARY_OP(*); } break; case OP_DIV: { FIXNUM_BINARY_OP(/); } break; case OP_MOD: { FIXNUM_BINARY_OP(%); } break; + case OP_NOT: { + Object prev = array_pop(vm->stack); + Object new = IS_TRUE(prev) ? FALSE_VAL : TRUE_VAL; + array_push(vm->stack, new); + } break; + case OP_AND: { LOGIC_OP(&&); } break; + case OP_OR: { LOGIC_OP(||); } break; + case OP_EQUAL: { FIXNUM_CMP_OP(==); } break; + case OP_LESS: { FIXNUM_CMP_OP(<); } break; + case OP_GREATER: { FIXNUM_CMP_OP(>); } break; + case OP_LESS_EQUAL: { FIXNUM_CMP_OP(<=); } break; + case OP_GREATER_EQUAL: { FIXNUM_CMP_OP(>=); } break; case OP_RETURN: { display(array_pop(vm->stack)); printf("\n"); @@ -123,5 +164,7 @@ vm_interpret(VM *vm, Chunk *chunk) { } #undef FIXNUM_BINARY_OP +#undef FIXNUM_CMP_OP +#undef LOGIC_OP #endif // BDL_VM_H -- cgit v1.2.1