diff --git a/lang/module.c b/lang/module.c index c9a7f1b..94e8c89 100644 --- a/lang/module.c +++ b/lang/module.c @@ -71,6 +71,39 @@ .calls = &module_runtime_calls[0], }; +static struct object_class module_class_class; + +struct module_class_data { + const ModuleClass *class; + Object module_runtime; +}; + +Object module_class_create( + VmState state, const ModuleClass *class, Object module_runtime) { + size_t size = sizeof(struct module_class_data); + Object obj = object_create(state, &module_class_class, size); + struct module_class_data *data = + (struct module_class_data *)object_priv( + state, obj, &module_class_class); + data->class = class; + data->module_runtime = module_runtime; + return obj; +} + +static void module_class_cleanup(VmState state, Object obj) { + struct module_class_data *data = + (struct module_class_data *)object_priv( + state, obj, &module_class_class); + object_drop(state, &data->module_runtime); +} + +static struct object_call module_class_calls[] = {{.name = NULL, /* end */}}; + +static struct object_class module_class_class = { + .cleanup = module_class_cleanup, + .calls = &module_class_calls[0], +}; + // Section 1: Module dependency resolution // A stack of ModuleInfo pointers @@ -202,7 +235,12 @@ // 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 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; }