[glib/gobject-speedups: 13/13] Avoid g_type_class_peek




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]