summaryrefslogtreecommitdiff
path: root/docs/reference/gobject/tut_howto.xml
diff options
context:
space:
mode:
authorPhilip Withnall <philip.withnall@collabora.co.uk>2015-02-20 13:14:08 +0000
committerPhilip Withnall <philip.withnall@collabora.co.uk>2015-08-21 15:15:52 +0100
commita76242b35ab6809f7582fd06b8b30c05f82b3934 (patch)
tree4130bc0a884c67031ffe41956cc2678929c3f34e /docs/reference/gobject/tut_howto.xml
parent82abb80553e0da9dac512822e72f55281a68d38c (diff)
downloadglib-a76242b35ab6809f7582fd06b8b30c05f82b3934.tar.gz
docs: Add vfunc NULL checks to GObject how-to examples
Not setting a pure vfunc is a programmer error, so can be handled with a g_return_if_fail() rather than needing a g_warning(). https://bugzilla.gnome.org/show_bug.cgi?id=744060
Diffstat (limited to 'docs/reference/gobject/tut_howto.xml')
-rw-r--r--docs/reference/gobject/tut_howto.xml42
1 files changed, 28 insertions, 14 deletions
diff --git a/docs/reference/gobject/tut_howto.xml b/docs/reference/gobject/tut_howto.xml
index 19c6fdaa8..15cdba26c 100644
--- a/docs/reference/gobject/tut_howto.xml
+++ b/docs/reference/gobject/tut_howto.xml
@@ -571,9 +571,14 @@ void maman_bar_do_action (MamanBar *self, /* parameters */);
void
maman_bar_do_action (MamanBar *self, /* parameters */)
{
+ MamanBarClass *klass;
+
g_return_if_fail (MAMAN_IS_BAR (self));
- MAMAN_BAR_GET_CLASS (self)->do_action (self, /* parameters */);
+ klass = MAMAN_BAR_GET_CLASS (self);
+ g_return_if_fail (klass->do_action != NULL);
+
+ klass->do_action (self, /* parameters */);
}
</programlisting></informalexample>
The code above simply redirects the <function>do_action</function> call
@@ -596,7 +601,7 @@ maman_bar_real_do_action_two (MamanBar *self, /* parameters */)
}
static void
-maman_bar_class_init (BarClass *klass)
+maman_bar_class_init (MamanBarClass *klass)
{
/* this is not necessary, except for demonstration purposes.
*
@@ -611,27 +616,31 @@ maman_bar_class_init (BarClass *klass)
void
maman_bar_do_action_one (MamanBar *self, /* parameters */)
{
+ MamanBarClass *klass;
+
g_return_if_fail (MAMAN_IS_BAR (self));
+ klass = MAMAN_BAR_GET_CLASS (self);
+
/* if the method is purely virtual, then it is a good idea to
* check that it has been overridden before calling it, and,
* depending on the intent of the class, either ignore it silently
* or warn the user.
- /
- if (MAMAN_BAR_GET_CLASS (self)->do_action_one != NULL)
- MAMAN_BAR_GET_CLASS (self)->do_action_one (self, /* parameters */);
- else
- g_warning ("Class '%s' does not override the mandatory "
- "MamanBarClass.do_action_one() virtual function.",
- G_OBJECT_TYPE_NAME (self));
+ */
+ g_return_if_fail (klass->do_action != NULL);
+ klass->do_action_one (self, /* parameters */);
}
void
maman_bar_do_action_two (MamanBar *self, /* parameters */)
{
+ MamanBarClass *klass;
+
g_return_if_fail (MAMAN_IS_BAR (self));
- MAMAN_BAR_GET_CLASS (self)->do_action_two (self, /* parameters */);
+ klass = MAMAN_BAR_GET_CLASS (self);
+ if (klass->do_action_two != NULL)
+ klass->do_action_two (self, /* parameters */);
}
</programlisting></informalexample>
</para>
@@ -653,6 +662,10 @@ struct _MamanBarClass
/* stuff */
void (* helper_do_specific_action) (MamanBar *self, /* parameters */);
+
+ /* Padding to allow adding up to 12 new virtual functions without
+ * breaking ABI. */
+ gpointer padding[12];
};
void maman_bar_do_any_action (MamanBar *self, /* parameters */);
@@ -670,6 +683,8 @@ maman_bar_do_specific_action (MamanBar *self, /* parameters */)
void
maman_bar_do_any_action (MamanBar *self, /* parameters */)
{
+ g_return_if_fail (MAMAN_IS_BAR (self));
+
/* random code here */
/*
@@ -965,8 +980,7 @@ maman_ibaz_interface_init (MamanIbazInterface *iface)
static void
maman_baz_init (MamanBaz *self)
{
- MamanBaz *self = MAMAN_BAZ (instance);
- self->instance_member = 0xdeadbeaf;
+ self->instance_member = 0xdeadbeef;
}
</programlisting></informalexample>
</para>
@@ -1043,7 +1057,7 @@ maman_ibaz_interface_init (MamanIbazInterface *iface)
static void
maman_bar_class_init (MamanBarClass *klass)
{
-
+ /* Nothing here. */
}
static void
@@ -1118,7 +1132,6 @@ maman_ibaz_default_init (MamanIbazInterface *iface)
The following code snippet shows the modifications needed in the
<type>MamanBaz</type> declaration and implementation above:
<informalexample><programlisting>
-
struct _MamanBaz
{
GObject parent_instance;
@@ -1210,6 +1223,7 @@ static void
maman_derived_ibaz_do_action (MamanIbaz *ibaz)
{
MamanDerivedBaz *self = MAMAN_DERIVED_BAZ (ibaz);
+
g_print ("DerivedBaz implementation of Ibaz interface Action\n");
}