lang: Always place VmState first in function calls

This commit is contained in:
Jookia 2023-07-31 17:59:41 +10:00
parent a293d5414a
commit 65eb0a213e
8 changed files with 13 additions and 13 deletions

View file

@ -46,7 +46,7 @@ void bytecode_run(VmState state) {
int arg_count = *pos_code++;
const char *dispatch = (const char *)pos_code;
Object obj = vm_stack_pop(state);
vm_call(obj, dispatch, arg_count, state);
vm_call(state, obj, dispatch, arg_count);
object_drop(&obj);
break;
}

View file

@ -27,7 +27,7 @@ static void func_cleanup(Object obj) {
free(func);
}
static void func_call(Object obj, VmState state) {
static void func_call(VmState state, Object obj) {
(void)obj;
int arg_count = vm_stack_depth(state);
abort_if(arg_count != 1, "func_add called with more than 1 argument");

View file

@ -13,7 +13,7 @@ static void test_number(VmState state) {
vm_stack_push(state, NULL);
vm_stack_push(state, numB);
numB = NULL;
vm_call(numA, "Add", 2, state);
vm_call(state, numA, "Add", 2);
Object numC = vm_stack_pop(state);
printf("numC value is %i\n", number_value(numC));
object_drop(&numA);
@ -23,7 +23,7 @@ static void test_number(VmState state) {
static void test_func(VmState state) {
Object funcA = func_create();
vm_stack_push(state, NULL);
vm_call(funcA, "Call", 1, state);
vm_call(state, funcA, "Call", 1);
Object numA = vm_stack_pop(state);
printf("code return value is %i\n", number_value(numA));
object_drop(&numA);

View file

@ -35,7 +35,7 @@ int number_value(Object obj) {
return num->value;
}
static void number_add(Object obj, VmState state) {
static void number_add(VmState state, Object obj) {
int arg_count = vm_stack_depth(state);
abort_if(arg_count != 2, "number_add called without 2 arguments");
Object arg1 = vm_stack_get(state, 1);
@ -50,7 +50,7 @@ static void number_add(Object obj, VmState state) {
object_drop(&arg1);
}
static void number_minus(Object obj, VmState state) {
static void number_minus(VmState state, Object obj) {
int arg_count = vm_stack_depth(state);
abort_if(arg_count != 2, "number_minus called without 2 arguments");
Object arg1 = vm_stack_get(state, 1);

View file

@ -23,11 +23,11 @@ void object_drop(Object *objptr) {
*objptr = NULL;
}
void dispatch_call(Object obj, const char *name, VmState state) {
void dispatch_call(VmState state, Object obj, const char *name) {
struct object_call *call = obj->class_data->calls;
while (call->name != NULL) {
if (strcmp(call->name, name) == 0) {
call->handler(obj, state);
call->handler(state, obj);
return;
}
++call;

View file

@ -21,7 +21,7 @@ struct object {
// Dispatchable object call
struct object_call {
const char *name;
void (*handler)(Object obj, VmState state);
void (*handler)(VmState state, Object obj);
};
// Object class shared between objects
@ -39,6 +39,6 @@ void object_hold(Object obj);
void object_drop(Object *objptr);
// Calls a method on an object
void dispatch_call(Object obj, const char *name, VmState state);
void dispatch_call(VmState state, Object obj, const char *name);
#endif

View file

@ -73,10 +73,10 @@ int vm_stack_depth(VmState state) {
return priv->stack_next - priv->stack_base;
}
void vm_call(Object obj, const char *name, int arg_count, VmState state) {
void vm_call(VmState state, Object obj, const char *name, int arg_count) {
struct vm_state *priv = (struct vm_state *)state;
int old_base = priv->stack_base;
priv->stack_base = priv->stack_next - arg_count;
dispatch_call(obj, name, priv);
dispatch_call(priv, obj, name);
priv->stack_base = old_base;
}

View file

@ -16,6 +16,6 @@ Object vm_stack_pop(VmState state);
void vm_stack_drop(VmState state, int count);
int vm_stack_depth(VmState state);
void vm_call(Object obj, const char *name, int arg_count, VmState state);
void vm_call(VmState state, Object obj, const char *name, int arg_count);
#endif