Web lists-archives.org

gpointer vs gpointer* in GtkBuilderIface




While working up bindings for GtkBuildable, i noticed something  
interesting:

   gboolean      (* custom_tag_start)       (...,
					    gpointer      *data);
   void          (* custom_tag_end)         (...,
					    gpointer      *data);
   void          (* custom_finished)        (...,
					    gpointer       data);

Since gpointer is typedef'd to void*, this means gpointer* is a void**.

custom_tag_start() is, indeed, supposed to take the data pointer by  
reference and write through it like a return parameter.   
custom_tag_finished() gets the pointer so it can destroy it if  
necessary, as that's the last chance.  When i saw the gpointer* on  
custom_tag_end(), i assumed this meant that the caller gets a chance  
to write through to change it.  This is *not* the case.

The code i found implementing custom_tag_end() functions in gtk+ casts  
the double-pointer to a single pointer, and the code in  
subparser_end() passes subparser->data, not &subparser->data.  More  
confusingly, parse_custom() puts a gpointer* on the stack, but then  
does this:

   if (!gtk_buildable_custom_tag_start (...,
                      (gpointer*)&subparser_data))
     return FALSE;

I started to create a patch to fix this, but it looks like it will  
reach rather far, as GtkBuildableIface is public, so i figured it  
would be good to ask, first ...  what's this supposed to be?

--
One, two, free, four, five, six, sebben, eight, nine, ten, elebben,  
twull, fourteen, sickteen, sebbenteen, eightteen, elebbenteen,  
fiffeen, elebbenteen!
   -- Zella, aged three, counting to twenty.


_______________________________________________
gtk-devel-list mailing list
gtk-devel-list@xxxxxxxxx
http://mail.gnome.org/mailman/listinfo/gtk-devel-list