diff --git a/lang/module.c b/lang/module.c index 681e737..c9a7f1b 100644 --- a/lang/module.c +++ b/lang/module.c @@ -28,6 +28,49 @@ // Size of a stack in elemenets #define STACK_SIZE 64 +// Section 0: Helper classes + +static struct object_class module_runtime_class; + +struct module_runtime_data { + const ModuleInfo *info; + Object uses; +}; + +Object module_runtime_create( + VmState state, const ModuleInfo *info, Object uses) { + size_t size = sizeof(struct module_runtime_data); + Object obj = object_create(state, &module_runtime_class, size); + struct module_runtime_data *data = + (struct module_runtime_data *)object_priv( + state, obj, &module_runtime_class); + data->info = info; + data->uses = uses; + return obj; +} + +static void module_runtime_cleanup(VmState state, Object obj) { + struct module_runtime_data *data = + (struct module_runtime_data *)object_priv( + state, obj, &module_runtime_class); + object_drop(state, &data->uses); +} + +Object module_runtime_uses(VmState state, Object obj) { + struct module_runtime_data *data = + (struct module_runtime_data *)object_priv( + state, obj, &module_runtime_class); + object_hold(state, data->uses); + return data->uses; +} + +static struct object_call module_runtime_calls[] = {{.name = NULL, /* end */}}; + +static struct object_class module_runtime_class = { + .cleanup = module_runtime_cleanup, + .calls = &module_runtime_calls[0], +}; + // Section 1: Module dependency resolution // A stack of ModuleInfo pointers @@ -156,6 +199,10 @@ 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); + object_drop(state, &runtime); Object module = info->create(state, use_modules); return module; }