diff --git a/lang/module.c b/lang/module.c index 94e8c89..54d7b98 100644 --- a/lang/module.c +++ b/lang/module.c @@ -3,6 +3,7 @@ #define MODULE_INTERNAL_API #include "module.h" +#include "bytecode.h" #include "error.h" #include "list.h" #include "object.h" @@ -97,11 +98,31 @@ object_drop(state, &data->module_runtime); } -static struct object_call module_class_calls[] = {{.name = NULL, /* end */}}; +void module_class_dispatcher(VmState state, Object obj, const char *name) { + struct module_class_data *data = + (struct module_class_data *)object_priv( + state, obj, &module_class_class); + struct module_runtime_data *runtime = + (struct module_runtime_data *)object_priv( + state, data->module_runtime, &module_runtime_class); + ModuleClassCall *call = data->class->calls; + Object args = runtime->uses; + while (call->name != NULL) { + if (strcmp(call->name, name) == 0) { + const unsigned char *bytecode = + data->class->bytecodes[call->bytecode_index]; + bytecode_run(state, obj, bytecode, args); + return; + } + ++call; + } + vm_abort_msg( + state, "module_class_dispatcher: no call found to dispatch"); +} static struct object_class module_class_class = { .cleanup = module_class_cleanup, - .calls = &module_class_calls[0], + .caller = module_class_dispatcher, }; // Section 1: Module dependency resolution @@ -231,18 +252,11 @@ // Assumes all dependencies already exist Object create_module( VmState state, struct module_mapping *mapping, const ModuleInfo *info) { - Object use_modules = create_module_use_list(state, mapping, info); - // Create a reference for module_runtime_create - object_hold(state, use_modules); - Object runtime = module_runtime_create(state, info, use_modules); const ModuleClass *class = info->classes[0]; - // Create a reference for module_class - object_hold(state, runtime); + Object use_modules = create_module_use_list(state, mapping, info); + Object runtime = module_runtime_create(state, info, use_modules); Object module_class = module_class_create(state, class, runtime); - object_drop(state, &runtime); - object_drop(state, &module_class); - Object module = info->create(state, use_modules); - return module; + return module_class; } // Creates objects for newly added modules in mapping