aboutsummaryrefslogtreecommitdiffstats
path: root/src/bytecode/vm.h
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-28 12:26:14 +0200
committerBad Diode <bd@badd10de.dev>2021-10-28 12:26:14 +0200
commit7264715260fe0235413b6bd0cf6ee339e3328dc2 (patch)
tree776e8b8ba93bd1a95f277d5577647972c6af93c1 /src/bytecode/vm.h
parent8c8353dab0b4a7f6ed9332f968a5b5da67375f62 (diff)
downloadbdl-7264715260fe0235413b6bd0cf6ee339e3328dc2.tar.gz
bdl-7264715260fe0235413b6bd0cf6ee339e3328dc2.zip
Add OP_SET_CAPTURED operation
Diffstat (limited to 'src/bytecode/vm.h')
-rwxr-xr-xsrc/bytecode/vm.h7
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));