summaryrefslogtreecommitdiff
path: root/uscript/vm.c
diff options
context:
space:
mode:
Diffstat (limited to 'uscript/vm.c')
-rw-r--r--uscript/vm.c46
1 files changed, 23 insertions, 23 deletions
diff --git a/uscript/vm.c b/uscript/vm.c
index 7a617dd..7c2d85e 100644
--- a/uscript/vm.c
+++ b/uscript/vm.c
@@ -148,20 +148,19 @@ void us_exec(struct us_func *func)
vm_push(wrap_arr(arr));
break;
}
- case BC_SET_LOCAL:
- vm.cf->stackbot[read_byte()] = vm_peek();
- break;
case BC_GET_LOCAL:
vm_push(vm.cf->stackbot[read_byte()]);
break;
+ case BC_SET_LOCAL:
+ vm.cf->stackbot[read_byte()] = vm_peek();
+ break;
case BC_GET_UPVAL:
vm_push(*func->upvals[read_byte()]->loc);
break;
case BC_SET_UPVAL:
*func->upvals[read_byte()]->loc = vm_peek();
break;
- case BC_SET_INDEX: {
- struct us_val set_val = vm_pop();
+ case BC_GET_INDEX: {
struct us_val idx_val = vm_pop();
struct us_val arr_val = vm_pop();
if (idx_val.type != VAL_NUM)
@@ -180,11 +179,11 @@ void us_exec(struct us_func *func)
da_len(arr->e) - 1
);
}
- arr->e[idx] = set_val;
- vm_push(set_val);
+ vm_push(arr->e[idx]);
break;
}
- case BC_GET_INDEX: {
+ case BC_SET_INDEX: {
+ struct us_val set_val = vm_pop();
struct us_val idx_val = vm_pop();
struct us_val arr_val = vm_pop();
if (idx_val.type != VAL_NUM)
@@ -203,14 +202,15 @@ void us_exec(struct us_func *func)
da_len(arr->e) - 1
);
}
- vm_push(arr->e[idx]);
+ arr->e[idx] = set_val;
+ vm_push(set_val);
break;
}
+ case BC_POP: vm_pop(); break;
case BC_POP_UPVAL:
close_upvals(vm.stacktop - 1);
vm_pop();
break;
- case BC_POP: vm_pop(); break;
case BC_ADD: {
struct us_val b = vm_pop();
struct us_val a = vm_pop();
@@ -259,20 +259,20 @@ void us_exec(struct us_func *func)
vm_push(create_bool(get_num(a) > get_num(b)));
break;
}
- case BC_LT: {
+ case BC_GTE: {
struct us_val b = vm_pop();
struct us_val a = vm_pop();
if (b.type != VAL_NUM || a.type != VAL_NUM)
log_fatal(1, "Invalid operands");
- vm_push(create_bool(get_num(a) < get_num(b)));
+ vm_push(create_bool(get_num(a) >= get_num(b)));
break;
}
- case BC_GTE: {
+ case BC_LT: {
struct us_val b = vm_pop();
struct us_val a = vm_pop();
if (b.type != VAL_NUM || a.type != VAL_NUM)
log_fatal(1, "Invalid operands");
- vm_push(create_bool(get_num(a) >= get_num(b)));
+ vm_push(create_bool(get_num(a) < get_num(b)));
break;
}
case BC_LTE: {
@@ -295,12 +295,6 @@ void us_exec(struct us_func *func)
vm_push(create_bool(negated));
break;
}
- case BC_CONCAT: {
- struct us_val b = vm_pop();
- struct us_val a = vm_pop();
- vm_push(wrap_str(concat(a, b)));
- break;
- }
case BC_EQL: {
struct us_val b = vm_pop();
struct us_val a = vm_pop();
@@ -313,6 +307,15 @@ void us_exec(struct us_func *func)
vm_push(create_bool(!vals_eql(a, b)));
break;
}
+ case BC_CONCAT: {
+ struct us_val b = vm_pop();
+ struct us_val a = vm_pop();
+ vm_push(wrap_str(concat(a, b)));
+ break;
+ }
+ case BC_JMP:
+ i += read_short(func->proto, &i);
+ break;
case BC_FALSEY_JMP: {
u16 jmp = read_short(func->proto, &i);
if (as_bool(vm_pop()))
@@ -320,9 +323,6 @@ void us_exec(struct us_func *func)
i += jmp;
break;
}
- case BC_JMP:
- i += read_short(func->proto, &i);
- break;
case BC_LOOP:
i -= read_short(func->proto, &i);
break;