[glib/another-victim-of-gobject] gobject: Fix a recent regression




commit 95329d812918835bf15e60a0db9620007aa81b45
Author: Matthias Clasen <mclasen redhat com>
Date:   Sat Jul 2 15:24:29 2022 -0400

    gobject: Fix a recent regression
    
    When I optimized GObject to skip property notification
    in some cases, I looked for whether the class has a
    custom notify vfunc. I overlooked that that
    dispatch_properties_changed can also be customized,
    and if it is, we better not skip change notification.
    
    This showed up as breakage in the adjustment tests
    in the GTK testsuite.

 gobject/gobject.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)
---
diff --git a/gobject/gobject.c b/gobject/gobject.c
index 1c6bfedfae..a61ec90a63 100644
--- a/gobject/gobject.c
+++ b/gobject/gobject.c
@@ -152,6 +152,9 @@
 #define CLASS_HAS_CUSTOM_CONSTRUCTED(class) \
     ((class)->constructed != g_object_constructed)
 #define CLASS_HAS_NOTIFY(class) ((class)->notify != NULL)
+#define CLASS_HAS_CUSTOM_DISPATCH(class) \
+    ((class)->dispatch_properties_changed != g_object_dispatch_properties_changed)
+#define CLASS_NEEDS_NOTIFY(class) (CLASS_HAS_NOTIFY(class) || CLASS_HAS_CUSTOM_DISPATCH(class))
 
 #define CLASS_HAS_DERIVED_CLASS_FLAG 0x2
 #define CLASS_HAS_DERIVED_CLASS(class) \
@@ -1237,7 +1240,7 @@ static inline gboolean
 _g_object_has_notify_handler (GObject *object)
 {
 #ifdef HAVE_OPTIONAL_FLAGS
-  return CLASS_HAS_NOTIFY (G_OBJECT_GET_CLASS (object)) ||
+  return CLASS_NEEDS_NOTIFY (G_OBJECT_GET_CLASS (object)) ||
          (object_get_optional_flags (object) & OPTIONAL_FLAG_HAS_NOTIFY_HANDLER) != 0;
 #else
   return TRUE;
@@ -1248,7 +1251,7 @@ static inline gboolean
 _g_object_has_notify_handler_X (GObject *object)
 {
 #ifdef HAVE_OPTIONAL_FLAGS
-  return CLASS_HAS_NOTIFY (G_OBJECT_GET_CLASS (object)) ||
+  return CLASS_NEEDS_NOTIFY (G_OBJECT_GET_CLASS (object)) ||
          (object_get_optional_flags_X (object) & OPTIONAL_FLAG_HAS_NOTIFY_HANDLER) != 0;
 #else
   return TRUE;
@@ -1304,7 +1307,7 @@ g_object_init (GObject            *object,
   object->ref_count = 1;
   object->qdata = NULL;
 
-  if (CLASS_HAS_PROPS (class) && CLASS_HAS_NOTIFY (class))
+  if (CLASS_HAS_PROPS (class) && CLASS_NEEDS_NOTIFY (class))
     {
       /* freeze object's notification queue, g_object_new_internal() preserves pairedness */
       g_object_notify_queue_freeze (object, FALSE);
@@ -1490,7 +1493,7 @@ g_object_notify_by_spec_internal (GObject    *object,
   /* get all flags we need with a single atomic read */
   object_flags = object_get_optional_flags (object);
   has_notify = ((object_flags & OPTIONAL_FLAG_HAS_NOTIFY_HANDLER) != 0) ||
-               CLASS_HAS_NOTIFY (G_OBJECT_GET_CLASS (object));
+               CLASS_NEEDS_NOTIFY (G_OBJECT_GET_CLASS (object));
   in_init = (object_flags & OPTIONAL_FLAG_IN_CONSTRUCTION) != 0;
 #else
   has_notify = TRUE;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]