Bug 563998 – Cache the GIBaseInfo for GTypes

2008-12-10  Johan Bilien  <jobi@via.ecp.fr>

	Bug 563998 – Cache the GIBaseInfo for GTypes

	* girepository/girepository.c (g_irepository_find_by_gtype):
	add a cache of GType -> GIBaseInfo.


svn path=/trunk/; revision=991
This commit is contained in:
Johan Bilien 2008-12-10 17:53:09 +00:00 committed by Johan Bilien
parent 9c62e9fc6e
commit bb9820839a

View File

@ -42,6 +42,7 @@ struct _GIRepositoryPrivate
{ {
GHashTable *typelibs; /* (string) namespace -> GTypelib */ GHashTable *typelibs; /* (string) namespace -> GTypelib */
GHashTable *lazy_typelibs; /* (string) namespace-version -> GTypelib */ GHashTable *lazy_typelibs; /* (string) namespace-version -> GTypelib */
GHashTable *info_by_gtype; /* GType -> GIBaseInfo */
}; };
G_DEFINE_TYPE (GIRepository, g_irepository, G_TYPE_OBJECT); G_DEFINE_TYPE (GIRepository, g_irepository, G_TYPE_OBJECT);
@ -57,6 +58,10 @@ g_irepository_init (GIRepository *repository)
(GDestroyNotify) g_typelib_free); (GDestroyNotify) g_typelib_free);
repository->priv->lazy_typelibs repository->priv->lazy_typelibs
= g_hash_table_new (g_str_hash, g_str_equal); = g_hash_table_new (g_str_hash, g_str_equal);
repository->priv->info_by_gtype
= g_hash_table_new_full (g_direct_hash, g_direct_equal,
(GDestroyNotify) NULL,
(GDestroyNotify) g_base_info_unref);
} }
static void static void
@ -66,6 +71,7 @@ g_irepository_finalize (GObject *object)
g_hash_table_destroy (repository->priv->typelibs); g_hash_table_destroy (repository->priv->typelibs);
g_hash_table_destroy (repository->priv->lazy_typelibs); g_hash_table_destroy (repository->priv->lazy_typelibs);
g_hash_table_destroy (repository->priv->info_by_gtype);
(* G_OBJECT_CLASS (g_irepository_parent_class)->finalize) (G_OBJECT (repository)); (* G_OBJECT_CLASS (g_irepository_parent_class)->finalize) (G_OBJECT (repository));
} }
@ -625,6 +631,12 @@ g_irepository_find_by_gtype (GIRepository *repository,
repository = get_repository (repository); repository = get_repository (repository);
data.iface = g_hash_table_lookup (repository->priv->info_by_gtype,
(gpointer)type);
if (data.iface)
return g_base_info_ref (data.iface);
data.repo = repository; data.repo = repository;
data.name = NULL; data.name = NULL;
data.type = g_type_name (type); data.type = g_type_name (type);
@ -634,6 +646,12 @@ g_irepository_find_by_gtype (GIRepository *repository,
g_hash_table_foreach (repository->priv->typelibs, find_interface, &data); g_hash_table_foreach (repository->priv->typelibs, find_interface, &data);
g_hash_table_foreach (repository->priv->lazy_typelibs, find_interface, &data); g_hash_table_foreach (repository->priv->lazy_typelibs, find_interface, &data);
if (data.iface)
g_hash_table_insert (repository->priv->info_by_gtype,
(gpointer) type,
g_base_info_ref (data.iface));
return data.iface; return data.iface;
} }