diff options
Diffstat (limited to 'uscript/vm.c')
| -rw-r--r-- | uscript/vm.c | 32 |
1 files changed, 17 insertions, 15 deletions
diff --git a/uscript/vm.c b/uscript/vm.c index e01d17d..d68e850 100644 --- a/uscript/vm.c +++ b/uscript/vm.c @@ -59,12 +59,6 @@ struct us_str *concat(struct us_val a, struct us_val b) } static -u16 read_short(struct us_proto *proto, int *i) -{ - return (u16)(proto->bytecode[++*i] << 8) | proto->bytecode[++*i]; -} - -static void close_upvals(struct us_val *to) { struct us_upval *upval = vm.open_upvals; @@ -170,14 +164,18 @@ void call_val(struct us_val callee, int argc) void us_exec(struct us_func *func) { -#define read_byte() (func->proto->bytecode[++i]) -#define read_const() (func->proto->constants[read_byte()]) vm.cf++; vm.cf->func = wrap_func(func); vm.cf->stackbot = vm.stacktop - func->proto->argc; for (int i = 0; i < da_len(func->proto->bytecode); i++) { +#define read_byte() (func->proto->bytecode[++i]) +#define read_short() \ + (i += 2, \ + (u16)((func->proto->bytecode[i - 1] << 8) | func->proto->bytecode[i])) +#define read_const() (func->proto->constants[read_byte()]) enum bytecode instruction = func->proto->bytecode[i]; + // putc('>', stderr); // for (struct us_val *val = vm.stack; val < vm.stacktop; val++) { // char *val_str = val_to_str(*val, NULL); @@ -250,10 +248,10 @@ void us_exec(struct us_func *func) vm.cf->stackbot[read_byte()] = vm_peek(); break; case BC_GET_GLOBAL: - vm_push(vm.gstack[read_short(func->proto, &i)].val); + vm_push(get_global(read_short())); break; case BC_SET_GLOBAL: - vm.gstack[read_short(func->proto, &i)].val = vm_peek(); + set_global(read_short(), vm_peek()); break; case BC_GET_UPVAL: vm_push(*func->upvals[read_byte()]->loc); @@ -398,19 +396,23 @@ void us_exec(struct us_func *func) vm_push(wrap_str(concat(a, b))); break; } - case BC_JMP: - i += read_short(func->proto, &i); + case BC_JMP: { + u16 jmp = read_short(); + i += jmp; break; + } case BC_FALSEY_JMP: { - u16 jmp = read_short(func->proto, &i); + u16 jmp = read_short(); if (as_bool(vm_pop())) break; i += jmp; break; } - case BC_LOOP: - i -= read_short(func->proto, &i); + case BC_LOOP: { + u16 jmp = read_short(); + i -= jmp; break; + } case BC_CALL: { int argc = read_byte(); struct us_val callee = vm.stacktop[-argc - 1]; |
