[glib/wip/gproperty-2: 21/23] property: Use the field offset everywhere



commit 100521f5a0acf0f30c15c7470f8847d0ddec2120
Author: Emmanuele Bassi <ebassi gnome org>
Date:   Tue Jun 18 16:54:31 2013 +0100

    property: Use the field offset everywhere
    
    Do not implicitly grab the private data offset inside GProperty: we
    allow passing any offset when creating a new GProperty, and let the
    user decide where the property is stored, by giving us the correct
    offset — either from the instance structure, or from the private
    structure.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=648526

 gobject/gproperty.c      |  151 ++++++++++++++++------------------------------
 gobject/gproperty.h      |    6 +-
 gobject/tests/property.c |    2 +-
 3 files changed, 55 insertions(+), 104 deletions(-)
---
diff --git a/gobject/gproperty.c b/gobject/gproperty.c
index 324fa10..5f88ca6 100644
--- a/gobject/gproperty.c
+++ b/gobject/gproperty.c
@@ -337,8 +337,7 @@ struct _GProperty
   guint is_installed : 1;
 
   guint16 type_size;
-  guint16 field_offset;
-  gint priv_offset;
+  gint field_offset;
 
   GQuark prop_id;
 };
@@ -602,12 +601,11 @@ g_##g_t##_property_set_value (GProperty *property, \
       if (retval) \
         g_object_notify_by_pspec (gobject, (GParamSpec *) property); \
     } \
-  else if (property->field_offset >= 0) \
+  else if (property->field_offset != 0) \
     { \
-      gpointer priv_p, field_p; \
+      gpointer field_p; \
 \
-      priv_p = get_private_pointer (property, gobject); \
-      field_p = G_STRUCT_MEMBER_P (priv_p, property->field_offset); \
+      field_p = G_STRUCT_MEMBER_P (gobject, property->field_offset); \
 \
       if ((* (c_t *) field_p) != value) \
         { \
@@ -644,13 +642,9 @@ g_##g_t##_property_get_value (GProperty *property, \
     { \
       return ((G##G_t##Property *) property)->getter (gobject); \
     } \
-  else if (property->field_offset >= 0) \
+  else if (property->field_offset != 0) \
     { \
-      gpointer priv_p; \
-\
-      priv_p = get_private_pointer (property, gobject); \
-\
-      return G_STRUCT_MEMBER (c_t, priv_p, property->field_offset); \
+      return G_STRUCT_MEMBER (c_t, gobject, property->field_offset); \
     } \
   else \
     { \
@@ -661,13 +655,6 @@ g_##g_t##_property_get_value (GProperty *property, \
     } \
 }
 
-static inline gpointer
-get_private_pointer (GProperty *property,
-                     gpointer   instance)
-{
-  return G_STRUCT_MEMBER_P (instance, property->priv_offset);
-}
-
 /**
  * g_boolean_property_new:
  * @name: canonical name of the property
@@ -1097,12 +1084,11 @@ g_enum_property_set_value (GProperty *property,
       if (retval)
         g_object_notify_by_pspec (gobject, (GParamSpec *) property);
     }
-  else if (property->field_offset >= 0)
+  else if (property->field_offset != 0)
     {
-      gpointer priv_p, field_p;
+      gpointer field_p;
 
-      priv_p = get_private_pointer (property, gobject);
-      field_p = G_STRUCT_MEMBER_P (priv_p, property->field_offset);
+      field_p = G_STRUCT_MEMBER_P (gobject, property->field_offset);
 
       if ((* (gint *) field_p) != value)
         {
@@ -1137,13 +1123,9 @@ g_enum_property_get_value (GProperty *property,
     {
       return ((GEnumProperty *) property)->getter (gobject);
     }
-  else if (property->field_offset >= 0)
+  else if (property->field_offset != 0)
     {
-      gpointer priv_p;
-
-      priv_p = get_private_pointer (property, gobject);
-
-      return G_STRUCT_MEMBER (gint, priv_p, property->field_offset);
+      return G_STRUCT_MEMBER (gint, gobject, property->field_offset);
     }
   else
     {
@@ -1336,12 +1318,11 @@ g_flags_property_set_value (GProperty *property,
       if (retval)
         g_object_notify_by_pspec (gobject, (GParamSpec *) property);
     }
-  else if (property->field_offset >= 0)
+  else if (property->field_offset != 0)
     {
-      gpointer priv_p, field_p;
+      gpointer field_p;
 
-      priv_p = get_private_pointer (property, gobject);
-      field_p = G_STRUCT_MEMBER_P (priv_p, property->field_offset);
+      field_p = G_STRUCT_MEMBER_P (gobject, property->field_offset);
 
       if ((* (guint *) field_p) != value)
         {
@@ -1376,13 +1357,9 @@ g_flags_property_get_value (GProperty *property,
     {
       return ((GFlagsProperty *) property)->getter (gobject);
     }
-  else if (property->field_offset >= 0)
+  else if (property->field_offset != 0)
     {
-      gpointer priv_p;
-
-      priv_p = get_private_pointer (property, gobject);
-
-      return G_STRUCT_MEMBER (guint, priv_p, property->field_offset);
+      return G_STRUCT_MEMBER (guint, gobject, property->field_offset);
     }
   else
     {
@@ -1595,12 +1572,11 @@ g_float_property_set_value (GProperty *property,
       if (retval)
         g_object_notify_by_pspec (gobject, (GParamSpec *) property);
     }
-  else if (property->field_offset >= 0)
+  else if (property->field_offset != 0)
     {
-      gpointer priv_p, field_p;
+      gpointer field_p;
 
-      priv_p = get_private_pointer (property, gobject);
-      field_p = G_STRUCT_MEMBER_P (priv_p, property->field_offset);
+      field_p = G_STRUCT_MEMBER_P (gobject, property->field_offset);
 
       if ((* (gfloat *) field_p) != value)
         {
@@ -1635,13 +1611,9 @@ g_float_property_get_value (GProperty *property,
     {
       return ((GFloatProperty *) property)->getter (gobject);
     }
-  else if (property->field_offset >= 0)
+  else if (property->field_offset != 0)
     {
-      gpointer priv_p;
-
-      priv_p = get_private_pointer (property, gobject);
-
-      return G_STRUCT_MEMBER (gfloat, priv_p, property->field_offset);
+      return G_STRUCT_MEMBER (gfloat, gobject, property->field_offset);
     }
   else
     {
@@ -1854,12 +1826,11 @@ g_double_property_set_value (GProperty *property,
       if (retval)
         g_object_notify_by_pspec (gobject, (GParamSpec *) property);
     }
-  else if (property->field_offset >= 0)
+  else if (property->field_offset != 0)
     {
-      gpointer priv_p, field_p;
+      gpointer field_p;
 
-      priv_p = get_private_pointer (property, gobject);
-      field_p = G_STRUCT_MEMBER_P (priv_p, property->field_offset);
+      field_p = G_STRUCT_MEMBER_P (gobject, property->field_offset);
 
       if ((* (gdouble *) field_p) != value)
         {
@@ -1894,13 +1865,9 @@ g_double_property_get_value (GProperty *property,
     {
       return ((GDoubleProperty *) property)->getter (gobject);
     }
-  else if (property->field_offset >= 0)
+  else if (property->field_offset != 0)
     {
-      gpointer priv_p;
-
-      priv_p = get_private_pointer (property, gobject);
-
-      return G_STRUCT_MEMBER (gdouble, priv_p, property->field_offset);
+      return G_STRUCT_MEMBER (gdouble, gobject, property->field_offset);
     }
   else
     {
@@ -2040,13 +2007,12 @@ g_string_property_set_value (GProperty   *property,
       if (retval)
         g_object_notify_by_pspec (gobject, (GParamSpec *) property);
     }
-  else if (property->field_offset >= 0)
+  else if (property->field_offset != 0)
     {
-      gpointer priv_p, field_p;
+      gpointer field_p;
       gchar *str;
 
-      priv_p = get_private_pointer (property, gobject);
-      field_p = G_STRUCT_MEMBER_P (priv_p, property->field_offset);
+      field_p = G_STRUCT_MEMBER_P (gobject, property->field_offset);
 
       str = (* (gpointer *) field_p);
 
@@ -2089,13 +2055,12 @@ g_string_property_get_value (GProperty *property,
     {
       return ((GStringProperty *) property)->getter (gobject);
     }
-  else if (property->field_offset >= 0)
+  else if (property->field_offset != 0)
     {
-      gpointer priv_p, field_p;
+      gpointer field_p;
       gchar *retval;
 
-      priv_p = get_private_pointer (property, gobject);
-      field_p = G_STRUCT_MEMBER_P (priv_p, property->field_offset);
+      field_p = G_STRUCT_MEMBER_P (gobject, property->field_offset);
 
       if (property->flags & G_PROPERTY_COPY_GET)
         retval = g_strdup ((* (gpointer *) field_p));
@@ -2245,13 +2210,12 @@ g_boxed_property_set_value (GProperty *property,
       if (retval)
         g_object_notify_by_pspec (gobject, (GParamSpec *) property);
     }
-  else if (property->field_offset >= 0)
+  else if (property->field_offset != 0)
     {
-      gpointer priv_p, field_p;
+      gpointer field_p;
       gpointer old_value;
 
-      priv_p = get_private_pointer (property, gobject);
-      field_p = G_STRUCT_MEMBER_P (priv_p, property->field_offset);
+      field_p = G_STRUCT_MEMBER_P (gobject, property->field_offset);
 
       if (property->flags & G_PROPERTY_COPY_SET)
         {
@@ -2296,13 +2260,12 @@ g_boxed_property_get_value (GProperty *property,
     {
       return ((GBoxedProperty *) property)->getter (gobject);
     }
-  else if (property->field_offset >= 0)
+  else if (property->field_offset != 0)
     {
-      gpointer priv_p, field_p;
+      gpointer field_p;
       gpointer value;
 
-      priv_p = get_private_pointer (property, gobject);
-      field_p = G_STRUCT_MEMBER_P (priv_p, property->field_offset);
+      field_p = G_STRUCT_MEMBER_P (gobject, property->field_offset);
 
       if (property->flags & G_PROPERTY_COPY_GET)
         value = g_boxed_copy (((GParamSpec *) property)->value_type, (* (gpointer *) field_p));
@@ -2455,15 +2418,14 @@ g_object_property_set_value (GProperty *property,
       if (retval)
         g_object_notify_by_pspec (gobject, (GParamSpec *) property);
     }
-  else if (property->field_offset >= 0)
+  else if (property->field_offset != 0)
     {
-      gpointer priv_p, field_p;
+      gpointer field_p;
       gpointer obj;
 
       g_return_val_if_fail (value == NULL || G_IS_OBJECT (value), FALSE);
 
-      priv_p = get_private_pointer (property, gobject);
-      field_p = G_STRUCT_MEMBER_P (priv_p, property->field_offset);
+      field_p = G_STRUCT_MEMBER_P (gobject, property->field_offset);
 
       if ((* (gpointer *) field_p) == value)
         return FALSE;
@@ -2515,13 +2477,11 @@ g_object_property_get_value (GProperty *property,
     {
       return ((GObjectProperty *) property)->getter (gobject);
     }
-  else if (property->field_offset >= 0)
+  else if (property->field_offset != 0)
     {
-      gpointer priv_p;
       GObject *obj;
 
-      priv_p = g_type_instance_get_private (gobject, G_OBJECT_TYPE (gobject));
-      obj = &G_STRUCT_MEMBER (GObject, priv_p, property->field_offset);
+      obj = &G_STRUCT_MEMBER (GObject, gobject, property->field_offset);
 
       if (property->flags & G_PROPERTY_COPY_GET)
         {
@@ -2671,12 +2631,11 @@ g_pointer_property_set_value (GProperty *property,
       if (retval)
         g_object_notify_by_pspec (gobject, (GParamSpec *) property);
     }
-  else if (property->field_offset >= 0)
+  else if (property->field_offset != 0)
     {
-      gpointer priv_p, field_p;
+      gpointer field_p;
 
-      priv_p = get_private_pointer (property, gobject);
-      field_p = G_STRUCT_MEMBER_P (priv_p, property->field_offset);
+      field_p = G_STRUCT_MEMBER_P (gobject, property->field_offset);
 
       if ((* (gpointer *) field_p) != value)
         {
@@ -2711,13 +2670,9 @@ g_pointer_property_get_value (GProperty *property,
     {
       return ((GPointerProperty *) property)->getter (gobject);
     }
-  else if (property->field_offset >= 0)
+  else if (property->field_offset != 0)
     {
-      gpointer priv_p;
-
-      priv_p = get_private_pointer (property, gobject);
-
-      return G_STRUCT_MEMBER (gpointer, priv_p, property->field_offset);
+      return G_STRUCT_MEMBER (gpointer, gobject, property->field_offset);
     }
   else
     {
@@ -2745,7 +2700,7 @@ g_property_set_installed (GProperty *property,
                           gpointer   g_class,
                           GType      class_gtype)
 {
-  if (property->field_offset >= 0)
+  if (property->field_offset != 0)
     {
       gboolean is_interface = G_TYPE_IS_INTERFACE (class_gtype);
 
@@ -2758,11 +2713,8 @@ g_property_set_installed (GProperty *property,
                       G_PARAM_SPEC (property)->name,
                       g_type_name (class_gtype));
 
-          property->field_offset = -1;
-          property->priv_offset = 0;
+          property->field_offset = 0;
         }
-      else
-        property->priv_offset = g_type_class_get_instance_private_offset (g_class);
     }
 
   g_property_ensure_prop_id (property);
@@ -5052,8 +5004,7 @@ property_init (GParamSpec *pspec)
 
   pspec->value_type = G_TYPE_INVALID;
 
-  property->field_offset = -1;
-  property->priv_offset = 0;
+  property->field_offset = 0;
 }
 
 GType
diff --git a/gobject/gproperty.h b/gobject/gproperty.h
index 7a32ec9..80ffe9b 100644
--- a/gobject/gproperty.h
+++ b/gobject/gproperty.h
@@ -525,7 +525,7 @@ void            g_property_init_default        (GProperty *property,
 { \
   GProperty *g_property = (GProperty *) \
     g_##c_type##_property_new (#name, flags, \
-                               G_STRUCT_OFFSET (T_N##Private, name), \
+                               G_PRIVATE_OFFSET (T_N, name), \
                                NULL, \
                                NULL);
 #define _G_DEFINE_PROPERTY_EXTENDED_BEGIN(T_N, c_type, name, offset, setterFunc, getterFunc, flags) \
@@ -559,7 +559,7 @@ void            g_property_init_default        (GProperty *property,
  *   G_DEFINE_PROPERTY_EXTENDED (GtkGadget,
  *                               int,
  *                               width,
- *                               G_STRUCT_OFFSET (GtkGadgetPrivate, width),
+ *                               G_PRIVATE_OFFSET (GtkGadget, width),
  *                               NULL, NULL,
  *                               G_PROPERTY_READWRITE,
  *                               G_PROPERTY_RANGE (0, G_MAXINT))
@@ -569,7 +569,7 @@ void            g_property_init_default        (GProperty *property,
  *   {
  *     GProperty *g_property =
  *       g_int_property_new ("width", G_PROPERTY_READWRITE,
- *                           G_STRUCT_OFFSET (GtkGadgetPrivate, width),
+ *                           G_PRIVATE_OFFSET (GtkGadget, width),
  *                           NULL, NULL);
  *     g_property_set_range (g_property, 0, G_MAXINT);
  *     gtk_gadget_properties[PROP_GtkGadget_width] = g_property;
diff --git a/gobject/tests/property.c b/gobject/tests/property.c
index 550ad1e..168fea7 100644
--- a/gobject/tests/property.c
+++ b/gobject/tests/property.c
@@ -131,7 +131,7 @@ test_object_class_init (TestObjectClass *klass)
                        G_DEFINE_PROPERTY_EXTENDED (TestObject,
                                                    enum,
                                                    enum_val,
-                                                   G_STRUCT_OFFSET (TestObjectPrivate, enum_val),
+                                                   G_PRIVATE_OFFSET (TestObject, enum_val),
                                                    test_object_set_enum_val_internal,
                                                    NULL,
                                                    G_PROPERTY_READWRITE,


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