[glib] GObject: prevent installing properties after init



commit ddb0ce14215cd62c7a2497d6cf9f2ea63c40ebb5
Author: Ryan Lortie <desrt desrt ca>
Date:   Mon Apr 22 17:37:18 2013 -0400

    GObject: prevent installing properties after init
    
    GObject has previously allowed installing properties after class_init
    has finished running.  This means that you could install some of your
    own properties on G_TYPE_OBJECT, for example, although they wouldn't
    have worked properly.
    
    Prevent this from happening.  Require that all properties are installed by
    the time class_init has finished.
    
    Complaints go to this bug:
    
    https://bugzilla.gnome.org/show_bug.cgi?id=698614

 gobject/gobject.c       |  9 +++++++--
 gobject/gtype-private.h |  1 +
 gobject/gtype.c         | 10 ++++++++++
 3 files changed, 18 insertions(+), 2 deletions(-)
---
diff --git a/gobject/gobject.c b/gobject/gobject.c
index 4472254..dab782b 100644
--- a/gobject/gobject.c
+++ b/gobject/gobject.c
@@ -540,8 +540,10 @@ g_object_class_install_property (GObjectClass *class,
   g_return_if_fail (G_IS_PARAM_SPEC (pspec));
 
   if (CLASS_HAS_DERIVED_CLASS (class))
-    g_error ("Attempt to add property %s::%s to class after it was derived",
-            G_OBJECT_CLASS_NAME (class), pspec->name);
+    g_error ("Attempt to add property %s::%s to class after it was derived", G_OBJECT_CLASS_NAME (class), 
pspec->name);
+
+  if (!g_type_is_in_init (G_OBJECT_CLASS_TYPE (class)))
+    g_error ("Attempt to add property %s::%s after class was initialised", G_OBJECT_CLASS_NAME (class), 
pspec->name);
 
   class->flags |= CLASS_HAS_PROPS_FLAG;
 
@@ -653,6 +655,9 @@ g_object_class_install_properties (GObjectClass  *oclass,
     g_error ("Attempt to add properties to %s after it was derived",
              G_OBJECT_CLASS_NAME (oclass));
 
+  if (!g_type_is_in_init (G_OBJECT_CLASS_TYPE (oclass)))
+    g_error ("Attempt to add properties %s after it was initialised", G_OBJECT_CLASS_NAME (oclass));
+
   oclass_type = G_OBJECT_CLASS_TYPE (oclass);
   parent_type = g_type_parent (oclass_type);
 
diff --git a/gobject/gtype-private.h b/gobject/gtype-private.h
index 5c415e5..d9e31e4 100644
--- a/gobject/gtype-private.h
+++ b/gobject/gtype-private.h
@@ -72,6 +72,7 @@ void        _g_closure_invoke_va (GClosure       *closure,
                                  int             n_params,
                                  GType          *param_types);
 
+gboolean    g_type_is_in_init    (GType type);
 
 G_END_DECLS
 
diff --git a/gobject/gtype.c b/gobject/gtype.c
index 9cdb77f..3541d90 100644
--- a/gobject/gtype.c
+++ b/gobject/gtype.c
@@ -4646,3 +4646,13 @@ g_type_ensure (GType type)
   if (G_UNLIKELY (type == (GType)-1))
     g_error ("can't happen");
 }
+
+gboolean
+g_type_is_in_init (GType type)
+{
+  TypeNode *node;
+
+  node = lookup_type_node_I (type);
+
+  return node->data->class.init_state != INITIALIZED;
+}


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