aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-28 13:54:56 +0200
committerBad Diode <bd@badd10de.dev>2021-10-28 13:54:56 +0200
commitc934ceda5e5a8f9d706b1f4e31f343e293e24f6d (patch)
tree99db3ea6d37bbb80ad70e900a15354af134cb549 /src
parent0ff1716f45c9494b1aa02b8ddb2541821480c5ad (diff)
downloadbdl-c934ceda5e5a8f9d706b1f4e31f343e293e24f6d.tar.gz
bdl-c934ceda5e5a8f9d706b1f4e31f343e293e24f6d.zip
Fix bug with logic operations
Diffstat (limited to 'src')
-rwxr-xr-xsrc/bytecode/vm.h18
1 files changed, 12 insertions, 6 deletions
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) {
138 138
139#define LOGIC_OP(OP) \ 139#define LOGIC_OP(OP) \
140 do { \ 140 do { \
141 Object a = array_pop(vm->stack); \ 141 ssize_t n = AS_FIXNUM(array_pop(vm->stack)); \
142 Object b = array_pop(vm->stack); \ 142 size_t stack_size = array_size(vm->stack) - n; \
143 bool x = IS_TRUE(a); \ 143 Object obj = array_peek(vm->stack, n - 1); \
144 bool y = IS_TRUE(b); \ 144 bool ret = IS_TRUE(obj); \
145 Object result = y OP x ? TRUE_VAL : FALSE_VAL; \ 145 while (n > 1) { \
146 array_push(vm->stack, result); \ 146 obj = array_peek(vm->stack, n - 2); \
147 bool current = IS_TRUE(obj); \
148 ret = ret OP current; \
149 n--; \
150 } \
151 array_head(vm->stack)->size = stack_size; \
152 array_push(vm->stack, BOOL_VAL(ret)); \
147 } while (false) 153 } while (false)
148 154
149void 155void