Re: [Vala] Fail to generate C code for following vala code, is this a bug?



Thanks for the fast reply.

On Fri, Mar 26, 2010 at 6:45 PM, Julian Andres Klode <jak jak-linux org> wrote:
On Fri, Mar 26, 2010 at 11:07:20AM +0800, PCMan wrote:
Hi list,
I tried to use Vala for the first time and the following code failed
to generate correct C code.
Is this a bug of vala or what's wrong with my code? (code is attached
to the end of this mail)
You define *_finish which is already defined by making the standard
functions async. Read
       http://live.gnome.org/Vala/Tutorial#Asynchronous_Functions

But Vala should probably report an error if one creates an async
function "f" and a function "f_finish"; instead of creating invalid
code.
The problem is, if I only override f, vala complains about abstract
method f_finish is not implemented. If I override f_finish, too, then
this results in duplicated method definition since another one is
automatically generated by vala async mechanism. So, it's not possible
to implement a interface like GVolume in vala. If this is not the
desired behavior, then it should be a bug. If this can be done in
vala, that can be quite useful. I'm trying to imiplement a new
GVolumeMonitor for gio based on some dbus services. Since vala has
amazing dbus support, it's the best tool I can think of for this job.
It's a pity that I encountered this error.

For the second question, if I want to return a unowned GList, it has
to be owned by the class and cannot be a local variable, right? Would
you please add this to vala tutorial? I found it not documented and
this behavior is not easy to figure out. In addition, this is not
consistent with GObject with C. In C we can create a new GList and
return it without the need to make it owned by anyone. The callee of
the function is responsible to free the list. So I expect the same
behavior in vala. IMHO if thing like this is possible, it will be
useful and be more consistent with C, hence making transition from C
easier.

For example, IMO this should be supported.
public unowned GLib.List<GLib.Object> get_list() {
    var list = new GLib.List<GLib.Object>();
   // Do something to append items to the list
    return list; // transfer the ownership to callee
}

public void yet_another_function() {
    // retrive the list and get ownership
    var GLib.List<GLib.Object> returned_list = owned get_list();
}  // returned_list is freed here.

BTW, congratulations for vala. It's really amazing and greatly
decrease development time!


In addition, if I want to override a virtual function in a parent
class with the prototype like this:
public virtual unowned GLib.List get_volumes ();

How can I return an unowned GLib.List in my override function? I tried
and tried but nothing works.

Something like this should work:
       public override unowned GLib.List get_volumes() {
               return list;
       }
You of course need a reference to the list somewhere in your
class.

--
Julian Andres Klode  - Debian Developer, Ubuntu Member

See http://wiki.debian.org/JulianAndresKlode and http://jak-linux.org/.




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