mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-11-05 10:38:54 +01:00
Merge branch 'wip/chergert/fix-3664' into 'main'
girepository: add singleton GIRepository back Closes #3664 See merge request GNOME/glib!4630
This commit is contained in:
@@ -2271,3 +2271,33 @@ gi_typelib_blob_type_to_info_type (GITypelibBlobType blob_type)
|
|||||||
return (GIInfoType) blob_type;
|
return (GIInfoType) blob_type;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gi_repository_dup_default:
|
||||||
|
*
|
||||||
|
* Gets the singleton process-global default `GIRepository`.
|
||||||
|
*
|
||||||
|
* The singleton is needed for situations where you must coordinate between
|
||||||
|
* bindings and libraries which also need to interact with introspection which
|
||||||
|
* could affect the bindings. For example, a Python application using a
|
||||||
|
* GObject-based library through `GIRepository` to load plugins also written in
|
||||||
|
* Python.
|
||||||
|
*
|
||||||
|
* Returns: (transfer full): the global singleton repository
|
||||||
|
*
|
||||||
|
* Since: 2.86
|
||||||
|
*/
|
||||||
|
GIRepository *
|
||||||
|
gi_repository_dup_default (void)
|
||||||
|
{
|
||||||
|
static GIRepository *instance;
|
||||||
|
|
||||||
|
if (g_once_init_enter (&instance))
|
||||||
|
{
|
||||||
|
GIRepository *repository = gi_repository_new ();
|
||||||
|
g_object_add_weak_pointer (G_OBJECT (repository), (gpointer *)&instance);
|
||||||
|
g_once_init_leave (&instance, repository);
|
||||||
|
}
|
||||||
|
|
||||||
|
return g_object_ref (instance);
|
||||||
|
}
|
||||||
|
|||||||
@@ -242,6 +242,9 @@ void gi_cclosure_marshal_generic (GClosure *closure,
|
|||||||
void *invocation_hint,
|
void *invocation_hint,
|
||||||
void *marshal_data);
|
void *marshal_data);
|
||||||
|
|
||||||
|
GI_AVAILABLE_IN_2_86
|
||||||
|
GIRepository *gi_repository_dup_default (void);
|
||||||
|
|
||||||
#include <girepository/girepository-autocleanups.h>
|
#include <girepository/girepository-autocleanups.h>
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|||||||
@@ -895,6 +895,20 @@ test_repository_loaded_namespaces (RepositoryFixture *fx,
|
|||||||
g_strfreev (namespaces);
|
g_strfreev (namespaces);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_repository_dup_default (void)
|
||||||
|
{
|
||||||
|
GIRepository *repository1 = gi_repository_dup_default ();
|
||||||
|
GIRepository *repository2 = gi_repository_dup_default ();
|
||||||
|
|
||||||
|
g_assert_nonnull (repository1);
|
||||||
|
g_assert_nonnull (repository2);
|
||||||
|
g_assert_true (repository1 == repository2);
|
||||||
|
|
||||||
|
g_clear_object (&repository1);
|
||||||
|
g_clear_object (&repository2);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main (int argc,
|
main (int argc,
|
||||||
char *argv[])
|
char *argv[])
|
||||||
@@ -924,6 +938,7 @@ main (int argc,
|
|||||||
ADD_REPOSITORY_TEST ("/repository/vfunc-info-with-invoker-on-object", test_repository_vfunc_info_with_invoker_on_object, &typelib_load_spec_gio);
|
ADD_REPOSITORY_TEST ("/repository/vfunc-info-with-invoker-on-object", test_repository_vfunc_info_with_invoker_on_object, &typelib_load_spec_gio);
|
||||||
ADD_REPOSITORY_TEST ("/repository/find-by-gtype", test_repository_find_by_gtype, &typelib_load_spec_gio_platform);
|
ADD_REPOSITORY_TEST ("/repository/find-by-gtype", test_repository_find_by_gtype, &typelib_load_spec_gio_platform);
|
||||||
ADD_REPOSITORY_TEST ("/repository/loaded-namespaces", test_repository_loaded_namespaces, &typelib_load_spec_gio_platform);
|
ADD_REPOSITORY_TEST ("/repository/loaded-namespaces", test_repository_loaded_namespaces, &typelib_load_spec_gio_platform);
|
||||||
|
g_test_add_func ("/repository/dup_default", test_repository_dup_default);
|
||||||
|
|
||||||
return g_test_run ();
|
return g_test_run ();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user