diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/bytecode/vm.h | 18 |
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 | ||
149 | void | 155 | void |