[glib/gobject-speedups: 13/13] Avoid g_type_class_peek
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib/gobject-speedups: 13/13] Avoid g_type_class_peek
- Date: Sat, 21 May 2022 11:30:38 +0000 (UTC)
commit 752400d4d6719e27550149e1d9312c87b0c96ae9
Author: Matthias Clasen <mclasen redhat com>
Date: Thu May 19 21:53:31 2022 -0400
Avoid g_type_class_peek
Most of the time, properties belong to the class
we set them on. Check that first, before going
into GType, which takes locks and whatnot.
gobject/gobject.c | 30 ++++++++++++++++--------------
1 file changed, 16 insertions(+), 14 deletions(-)
---
diff --git a/gobject/gobject.c b/gobject/gobject.c
index a3c783b003..5c34deb9a4 100644
--- a/gobject/gobject.c
+++ b/gobject/gobject.c
@@ -1563,15 +1563,16 @@ object_get_property (GObject *object,
GParamSpec *pspec,
GValue *value)
{
- GObjectClass *class = g_type_class_peek (pspec->owner_type);
+ GTypeInstance *inst = (GTypeInstance *) object;
+ GObjectClass *class;
guint param_id = PARAM_SPEC_PARAM_ID (pspec);
- if (class == NULL)
- {
- g_warning ("'%s::%s' is not a valid property name; '%s' is not a GObject subtype",
- g_type_name (pspec->owner_type), pspec->name, g_type_name (pspec->owner_type));
- return;
- }
+ if (G_LIKELY (inst->g_class->g_type == pspec->owner_type))
+ class = (GObjectClass *) inst->g_class;
+ else
+ class = g_type_class_peek (pspec->owner_type);
+
+ g_assert (class != NULL);
if (((GTypeInstance *)pspec)->g_class->g_type == G_TYPE_PARAM_OVERRIDE)
pspec = ((GParamSpecOverride *)pspec)->overridden;
@@ -1587,16 +1588,17 @@ object_set_property (GObject *object,
const GValue *value,
GObjectNotifyQueue *nqueue)
{
- GObjectClass *class = g_type_class_peek (pspec->owner_type);
+ GTypeInstance *inst = (GTypeInstance *) object;
+ GObjectClass *class;
GParamSpecClass *pclass;
guint param_id = PARAM_SPEC_PARAM_ID (pspec);
- if (G_UNLIKELY (class == NULL))
- {
- g_warning ("'%s::%s' is not a valid property name; '%s' is not a GObject subtype",
- g_type_name (pspec->owner_type), pspec->name, g_type_name (pspec->owner_type));
- return;
- }
+ if (G_LIKELY (inst->g_class->g_type == pspec->owner_type))
+ class = (GObjectClass *) inst->g_class;
+ else
+ class = g_type_class_peek (pspec->owner_type);
+
+ g_assert (class != NULL);
if (((GTypeInstance *)pspec)->g_class->g_type == G_TYPE_PARAM_OVERRIDE)
pspec = ((GParamSpecOverride *)pspec)->overridden;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]