diff options
author | Bad Diode <bd@badd10de.dev> | 2021-10-28 12:26:14 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-10-28 12:26:14 +0200 |
commit | 7264715260fe0235413b6bd0cf6ee339e3328dc2 (patch) | |
tree | 776e8b8ba93bd1a95f277d5577647972c6af93c1 /src/bytecode/vm.h | |
parent | 8c8353dab0b4a7f6ed9332f968a5b5da67375f62 (diff) | |
download | bdl-7264715260fe0235413b6bd0cf6ee339e3328dc2.tar.gz bdl-7264715260fe0235413b6bd0cf6ee339e3328dc2.zip |
Add OP_SET_CAPTURED operation
Diffstat (limited to 'src/bytecode/vm.h')
-rwxr-xr-x | src/bytecode/vm.h | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/src/bytecode/vm.h b/src/bytecode/vm.h index f1c525d..4ff9743 100755 --- a/src/bytecode/vm.h +++ b/src/bytecode/vm.h | |||
@@ -191,12 +191,17 @@ vm_interpret(VM *vm) { | |||
191 | case OP_CAPTURE_LOCAL: { | 191 | case OP_CAPTURE_LOCAL: { |
192 | Object proc = array_pop(vm->stack); | 192 | Object proc = array_pop(vm->stack); |
193 | ssize_t n_captured = AS_FIXNUM(array_pop(vm->stack)); | 193 | ssize_t n_captured = AS_FIXNUM(array_pop(vm->stack)); |
194 | for (size_t i = 0; i < n_captured; i++) { | 194 | for (ssize_t i = 0; i < n_captured; i++) { |
195 | Object value = array_pop(vm->stack); | 195 | Object value = array_pop(vm->stack); |
196 | array_push(proc.closure->values, value); | 196 | array_push(proc.closure->values, value); |
197 | } | 197 | } |
198 | array_push(vm->stack, proc); | 198 | array_push(vm->stack, proc); |
199 | } break; | 199 | } break; |
200 | case OP_SET_CAPTURED: { | ||
201 | Object value = array_pop(vm->stack); | ||
202 | ssize_t idx = AS_FIXNUM(array_pop(vm->stack)); | ||
203 | frame->closure->values[idx] = value; | ||
204 | } break; | ||
200 | case OP_DEF_LOCAL: { | 205 | case OP_DEF_LOCAL: { |
201 | Object value = array_pop(vm->stack); | 206 | Object value = array_pop(vm->stack); |
202 | ssize_t idx = AS_FIXNUM(array_pop(vm->stack)); | 207 | ssize_t idx = AS_FIXNUM(array_pop(vm->stack)); |