diff --git a/lang/bytecode.c b/lang/bytecode.c index 3b20310..6185849 100644 --- a/lang/bytecode.c +++ b/lang/bytecode.c @@ -46,7 +46,7 @@ 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; } diff --git a/lang/func.c b/lang/func.c index a090849..eddaa4d 100644 --- a/lang/func.c +++ b/lang/func.c @@ -27,7 +27,7 @@ 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"); diff --git a/lang/main.c b/lang/main.c index fba92d4..0e7540f 100644 --- a/lang/main.c +++ b/lang/main.c @@ -13,7 +13,7 @@ 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_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); diff --git a/lang/number.c b/lang/number.c index dceda30..702cee9 100644 --- a/lang/number.c +++ b/lang/number.c @@ -35,7 +35,7 @@ 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 @@ 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); diff --git a/lang/object.c b/lang/object.c index 94cb521..76ec3b9 100644 --- a/lang/object.c +++ b/lang/object.c @@ -23,11 +23,11 @@ *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; diff --git a/lang/object.h b/lang/object.h index 08fe61c..6be4d63 100644 --- a/lang/object.h +++ b/lang/object.h @@ -21,7 +21,7 @@ // 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_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 diff --git a/lang/vm.c b/lang/vm.c index 022debf..abb4152 100644 --- a/lang/vm.c +++ b/lang/vm.c @@ -73,10 +73,10 @@ 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; } diff --git a/lang/vm.h b/lang/vm.h index 25f9f5a..76c8914 100644 --- a/lang/vm.h +++ b/lang/vm.h @@ -16,6 +16,6 @@ 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