From ddb0ce14215cd62c7a2497d6cf9f2ea63c40ebb5 Mon Sep 17 00:00:00 2001 From: Ryan Lortie Date: Mon, 22 Apr 2013 17:37:18 -0400 Subject: [PATCH] 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; +} -- 2.7.4