On Fri, Oct 23, 2009 at 09:59:06 -0600, Shawn Ferris wrote:
> Hi All --
> 
> I've been trying to troubleshoot a problem with the libgda vapi and I just
> can't figure out where it's coming from.. decided it was time to ask. I'm
> sure this is something stupid, but I can't find it.
> 
> The vapi has this:
> 
>     public GLib.Value get_value_at (int col, int row) throws GLib.Error;
> 
> Which looks good according to the header from libgda. But the generated c
> is:
> 
>     GValue _tmp10_;
>     GValue _tmp9_ = {0};
>     _tmp10_ = (gda_data_model_get_value_at (self->res, 1, 1, &_tmp9_,
> &_inner_error_), _tmp9_);
> 
> The problem is that &_tmp9_ is being injected into the arguments and I can't
> figure out how to prevent it.  gda_data_model_get_value_at should return the
> value rather then set it through a pointer.

Hm, gda_data_model_get_value_at's signature is evil.

GValue is normally passed by reference and for that reason it is not
a [SimpleType]. That however means Vala assumes it's returned by reference
too. All GValue-returning functions in glib, gdk and gtk do it that way.
I don't know whether there is any [CCode(...)] attribute to force pass or
return by value.

In fact I think returning it by value is not legal. The type-dependent setter
is free to store it in any way it wants, which could teoretically include
doing it in a location-dependent fashion, which would make copying the memory
in other way than via g_value_copy incorrect.

The code generated by vala is not valid either, since the assignment from
_tmp9_ to _tmp10_ is not valid for precisely the same reason.

-- 
                                                 Jan 'Bulb' Hudec <b...@ucw.cz>
_______________________________________________
Vala-list mailing list
Vala-list@gnome.org
http://mail.gnome.org/mailman/listinfo/vala-list

Reply via email to