mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-09-28 10:07:13 +02:00
GTypeModule: Allow registering static types
This makes easier to write a module that can be both dynamic and static. It will allow to statically build modules from glib-networking, for example. A module can rename its g_io_module_load() function to g_io_<modulename>_load(), and then an application which links statically against that module can call g_io_<modulename>_load(NULL) to register types and extension points from the module. If a module is loaded dynamically, its load() function will continue to be called with a non-NULL GIOModule instance. https://bugzilla.gnome.org/show_bug.cgi?id=684282
This commit is contained in:
@@ -344,7 +344,7 @@ g_type_module_complete_interface_info (GTypePlugin *plugin,
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* g_type_module_register_type:
|
* g_type_module_register_type:
|
||||||
* @module: a #GTypeModule
|
* @module: (nullable): a #GTypeModule
|
||||||
* @parent_type: the type for the parent class
|
* @parent_type: the type for the parent class
|
||||||
* @type_name: name for the type
|
* @type_name: name for the type
|
||||||
* @type_info: type information structure
|
* @type_info: type information structure
|
||||||
@@ -362,6 +362,9 @@ g_type_module_complete_interface_info (GTypePlugin *plugin,
|
|||||||
* As long as any instances of the type exist, the type plugin will
|
* As long as any instances of the type exist, the type plugin will
|
||||||
* not be unloaded.
|
* not be unloaded.
|
||||||
*
|
*
|
||||||
|
* Since 2.56 if @module is %NULL this will call g_type_register_static()
|
||||||
|
* instead. This can be used when making a static build of the module.
|
||||||
|
*
|
||||||
* Returns: the new or existing type ID
|
* Returns: the new or existing type ID
|
||||||
*/
|
*/
|
||||||
GType
|
GType
|
||||||
@@ -374,10 +377,22 @@ g_type_module_register_type (GTypeModule *module,
|
|||||||
ModuleTypeInfo *module_type_info = NULL;
|
ModuleTypeInfo *module_type_info = NULL;
|
||||||
GType type;
|
GType type;
|
||||||
|
|
||||||
g_return_val_if_fail (module != NULL, 0);
|
|
||||||
g_return_val_if_fail (type_name != NULL, 0);
|
g_return_val_if_fail (type_name != NULL, 0);
|
||||||
g_return_val_if_fail (type_info != NULL, 0);
|
g_return_val_if_fail (type_info != NULL, 0);
|
||||||
|
|
||||||
|
if (module == NULL)
|
||||||
|
{
|
||||||
|
/* Cannot pass type_info directly to g_type_register_static() here because
|
||||||
|
* it has class_finalize != NULL and that's forbidden for static types */
|
||||||
|
return g_type_register_static_simple (parent_type,
|
||||||
|
type_name,
|
||||||
|
type_info->class_size,
|
||||||
|
type_info->class_init,
|
||||||
|
type_info->instance_size,
|
||||||
|
type_info->instance_init,
|
||||||
|
flags);
|
||||||
|
}
|
||||||
|
|
||||||
type = g_type_from_name (type_name);
|
type = g_type_from_name (type_name);
|
||||||
if (type)
|
if (type)
|
||||||
{
|
{
|
||||||
@@ -429,7 +444,7 @@ g_type_module_register_type (GTypeModule *module,
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* g_type_module_add_interface:
|
* g_type_module_add_interface:
|
||||||
* @module: a #GTypeModule
|
* @module: (nullable): a #GTypeModule
|
||||||
* @instance_type: type to which to add the interface.
|
* @instance_type: type to which to add the interface.
|
||||||
* @interface_type: interface type to add
|
* @interface_type: interface type to add
|
||||||
* @interface_info: type information structure
|
* @interface_info: type information structure
|
||||||
@@ -440,6 +455,9 @@ g_type_module_register_type (GTypeModule *module,
|
|||||||
*
|
*
|
||||||
* As long as any instances of the type exist, the type plugin will
|
* As long as any instances of the type exist, the type plugin will
|
||||||
* not be unloaded.
|
* not be unloaded.
|
||||||
|
*
|
||||||
|
* Since 2.56 if @module is %NULL this will call g_type_add_interface_static()
|
||||||
|
* instead. This can be used when making a static build of the module.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
g_type_module_add_interface (GTypeModule *module,
|
g_type_module_add_interface (GTypeModule *module,
|
||||||
@@ -449,9 +467,14 @@ g_type_module_add_interface (GTypeModule *module,
|
|||||||
{
|
{
|
||||||
ModuleInterfaceInfo *module_interface_info = NULL;
|
ModuleInterfaceInfo *module_interface_info = NULL;
|
||||||
|
|
||||||
g_return_if_fail (module != NULL);
|
|
||||||
g_return_if_fail (interface_info != NULL);
|
g_return_if_fail (interface_info != NULL);
|
||||||
|
|
||||||
|
if (module == NULL)
|
||||||
|
{
|
||||||
|
g_type_add_interface_static (instance_type, interface_type, interface_info);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (g_type_is_a (instance_type, interface_type))
|
if (g_type_is_a (instance_type, interface_type))
|
||||||
{
|
{
|
||||||
GTypePlugin *old_plugin = g_type_interface_get_plugin (instance_type,
|
GTypePlugin *old_plugin = g_type_interface_get_plugin (instance_type,
|
||||||
@@ -492,7 +515,7 @@ g_type_module_add_interface (GTypeModule *module,
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* g_type_module_register_enum:
|
* g_type_module_register_enum:
|
||||||
* @module: a #GTypeModule
|
* @module: (nullable): a #GTypeModule
|
||||||
* @name: name for the type
|
* @name: name for the type
|
||||||
* @const_static_values: an array of #GEnumValue structs for the
|
* @const_static_values: an array of #GEnumValue structs for the
|
||||||
* possible enumeration values. The array is
|
* possible enumeration values. The array is
|
||||||
@@ -507,6 +530,9 @@ g_type_module_add_interface (GTypeModule *module,
|
|||||||
* As long as any instances of the type exist, the type plugin will
|
* As long as any instances of the type exist, the type plugin will
|
||||||
* not be unloaded.
|
* not be unloaded.
|
||||||
*
|
*
|
||||||
|
* Since 2.56 if @module is %NULL this will call g_type_register_static()
|
||||||
|
* instead. This can be used when making a static build of the module.
|
||||||
|
*
|
||||||
* Since: 2.6
|
* Since: 2.6
|
||||||
*
|
*
|
||||||
* Returns: the new or existing type ID
|
* Returns: the new or existing type ID
|
||||||
@@ -518,7 +544,7 @@ g_type_module_register_enum (GTypeModule *module,
|
|||||||
{
|
{
|
||||||
GTypeInfo enum_type_info = { 0, };
|
GTypeInfo enum_type_info = { 0, };
|
||||||
|
|
||||||
g_return_val_if_fail (G_IS_TYPE_MODULE (module), 0);
|
g_return_val_if_fail (module == NULL || G_IS_TYPE_MODULE (module), 0);
|
||||||
g_return_val_if_fail (name != NULL, 0);
|
g_return_val_if_fail (name != NULL, 0);
|
||||||
g_return_val_if_fail (const_static_values != NULL, 0);
|
g_return_val_if_fail (const_static_values != NULL, 0);
|
||||||
|
|
||||||
@@ -531,7 +557,7 @@ g_type_module_register_enum (GTypeModule *module,
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* g_type_module_register_flags:
|
* g_type_module_register_flags:
|
||||||
* @module: a #GTypeModule
|
* @module: (nullable): a #GTypeModule
|
||||||
* @name: name for the type
|
* @name: name for the type
|
||||||
* @const_static_values: an array of #GFlagsValue structs for the
|
* @const_static_values: an array of #GFlagsValue structs for the
|
||||||
* possible flags values. The array is
|
* possible flags values. The array is
|
||||||
@@ -546,6 +572,9 @@ g_type_module_register_enum (GTypeModule *module,
|
|||||||
* As long as any instances of the type exist, the type plugin will
|
* As long as any instances of the type exist, the type plugin will
|
||||||
* not be unloaded.
|
* not be unloaded.
|
||||||
*
|
*
|
||||||
|
* Since 2.56 if @module is %NULL this will call g_type_register_static()
|
||||||
|
* instead. This can be used when making a static build of the module.
|
||||||
|
*
|
||||||
* Since: 2.6
|
* Since: 2.6
|
||||||
*
|
*
|
||||||
* Returns: the new or existing type ID
|
* Returns: the new or existing type ID
|
||||||
@@ -557,7 +586,7 @@ g_type_module_register_flags (GTypeModule *module,
|
|||||||
{
|
{
|
||||||
GTypeInfo flags_type_info = { 0, };
|
GTypeInfo flags_type_info = { 0, };
|
||||||
|
|
||||||
g_return_val_if_fail (G_IS_TYPE_MODULE (module), 0);
|
g_return_val_if_fail (module == NULL || G_IS_TYPE_MODULE (module), 0);
|
||||||
g_return_val_if_fail (name != NULL, 0);
|
g_return_val_if_fail (name != NULL, 0);
|
||||||
g_return_val_if_fail (const_static_values != NULL, 0);
|
g_return_val_if_fail (const_static_values != NULL, 0);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user