diff options
Diffstat (limited to 'uscript/vm.c')
| -rw-r--r-- | uscript/vm.c | 46 |
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; |
