diff options
author | Bad Diode <bd@badd10de.dev> | 2021-10-28 12:00:24 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-10-28 12:00:24 +0200 |
commit | 8c8353dab0b4a7f6ed9332f968a5b5da67375f62 (patch) | |
tree | 9434e0197b32dbb6c65361bef920fb3190dcfc71 /src/bytecode/vm.h | |
parent | d04aea3c5875cd2859d6ab961256b11189c49839 (diff) | |
download | bdl-8c8353dab0b4a7f6ed9332f968a5b5da67375f62.tar.gz bdl-8c8353dab0b4a7f6ed9332f968a5b5da67375f62.zip |
Add tentative implementation of captured variables
Diffstat (limited to 'src/bytecode/vm.h')
-rwxr-xr-x | src/bytecode/vm.h | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/src/bytecode/vm.h b/src/bytecode/vm.h index a32d0a1..f1c525d 100755 --- a/src/bytecode/vm.h +++ b/src/bytecode/vm.h | |||
@@ -177,8 +177,7 @@ vm_interpret(VM *vm) { | |||
177 | switch (instruction) { | 177 | switch (instruction) { |
178 | case OP_LOCAL: { | 178 | case OP_LOCAL: { |
179 | ssize_t idx = AS_FIXNUM(array_pop(vm->stack)); | 179 | ssize_t idx = AS_FIXNUM(array_pop(vm->stack)); |
180 | CallFrame frame = vm->frames[array_size(vm->frames) - 1]; | 180 | array_push(vm->stack, vm->stack[frame->stack_offset + idx]); |
181 | array_push(vm->stack, vm->stack[frame.stack_offset + idx]); | ||
182 | } break; | 181 | } break; |
183 | case OP_CONSTANT: { | 182 | case OP_CONSTANT: { |
184 | u8 constant = *vm->pc++; | 183 | u8 constant = *vm->pc++; |
@@ -186,15 +185,17 @@ vm_interpret(VM *vm) { | |||
186 | array_push(vm->stack, obj); | 185 | array_push(vm->stack, obj); |
187 | } break; | 186 | } break; |
188 | case OP_CAPTURED: { | 187 | case OP_CAPTURED: { |
189 | assert(false && "not implemented"); | 188 | ssize_t idx = AS_FIXNUM(array_pop(vm->stack)); |
189 | array_push(vm->stack, frame->closure->values[idx]); | ||
190 | } break; | 190 | } break; |
191 | case OP_CAPTURE_LOCAL: { | 191 | case OP_CAPTURE_LOCAL: { |
192 | assert(false && "not implemented"); | 192 | Object proc = array_pop(vm->stack); |
193 | // Object value = array_pop(vm->stack); | 193 | ssize_t n_captured = AS_FIXNUM(array_pop(vm->stack)); |
194 | // ssize_t idx = AS_FIXNUM(array_pop(vm->stack)); | 194 | for (size_t i = 0; i < n_captured; i++) { |
195 | // ssize_t depth = AS_FIXNUM(array_pop(vm->stack)); | 195 | Object value = array_pop(vm->stack); |
196 | // CallFrame frame = vm->frames[depth]; | 196 | array_push(proc.closure->values, value); |
197 | // vm->stack[frame.stack_offset + idx] = value; | 197 | } |
198 | array_push(vm->stack, proc); | ||
198 | } break; | 199 | } break; |
199 | case OP_DEF_LOCAL: { | 200 | case OP_DEF_LOCAL: { |
200 | Object value = array_pop(vm->stack); | 201 | Object value = array_pop(vm->stack); |