From c934ceda5e5a8f9d706b1f4e31f343e293e24f6d Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Thu, 28 Oct 2021 13:54:56 +0200 Subject: Fix bug with logic operations --- src/bytecode/vm.h | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/bytecode/vm.h b/src/bytecode/vm.h index 0d1595d..2e1c85b 100755 --- a/src/bytecode/vm.h +++ b/src/bytecode/vm.h @@ -138,12 +138,18 @@ vm_reset(VM *vm) { #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); \ + ssize_t n = AS_FIXNUM(array_pop(vm->stack)); \ + size_t stack_size = array_size(vm->stack) - n; \ + Object obj = array_peek(vm->stack, n - 1); \ + bool ret = IS_TRUE(obj); \ + while (n > 1) { \ + obj = array_peek(vm->stack, n - 2); \ + bool current = IS_TRUE(obj); \ + ret = ret OP current; \ + n--; \ + } \ + array_head(vm->stack)->size = stack_size; \ + array_push(vm->stack, BOOL_VAL(ret)); \ } while (false) void -- cgit v1.2.1