summaryrefslogtreecommitdiff
path: root/uscript/vm.c
diff options
context:
space:
mode:
Diffstat (limited to 'uscript/vm.c')
-rw-r--r--uscript/vm.c32
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];