]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Store the Data structure as the op_res gpointer of the GSimpleAsyncResult.
authorRyan Lortie <desrt@desrt.ca>
Thu, 12 Feb 2009 12:48:35 +0000 (12:48 +0000)
committerRyan Lortie <ryanl@src.gnome.org>
Thu, 12 Feb 2009 12:48:35 +0000 (12:48 +0000)
2009-02-12  Ryan Lortie  <desrt@desrt.ca>

        * gobject/valagasyncmodule.vala:

        Store the Data structure as the op_res gpointer of the
        GSimpleAsyncResult.  Emit a function to free it and hook it in.

svn path=/trunk/; revision=2432

ChangeLog
gobject/valagasyncmodule.vala

index 196a87dcb497c77d04376c6bb6846f2aac2044e3..3c33cfa6334296dffe396f92eb5a48c042084c5b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2009-02-12  Ryan Lortie  <desrt@desrt.ca>
+
+       * gobject/valagasyncmodule.vala:
+
+       Store the Data structure as the op_res gpointer of the
+       GSimpleAsyncResult.  Emit a function to free it and hook it in.
+
 2009-02-12  Jürg Billeter  <j@bitron.ch>
 
        * gobject/valaccodearraymodule.vala:
index 01177e50193fceedd0d3b3838e473b01db494ae3..cdf4b9b5f7e6ec763aa5d1e40b2a59ed2f4f3e39 100644 (file)
@@ -28,6 +28,29 @@ internal class Vala.GAsyncModule : GSignalModule {
                base (codegen, next);
        }
 
+       CCodeFunction generate_free_function (Method m) {
+               var dataname = Symbol.lower_case_to_camel_case (m.get_cname ()) + "Data";
+
+               var freefunc = new CCodeFunction (m.get_real_cname () + "_data_free", "void");
+               freefunc.line = function.line;
+               freefunc.modifiers = CCodeModifiers.STATIC;
+               freefunc.add_parameter (new CCodeFormalParameter ("_data", "gpointer"));
+
+               var freeblock = new CCodeBlock ();
+               freefunc.block = freeblock;
+
+               var datadecl = new CCodeDeclaration (dataname + "*");
+               datadecl.add_declarator (new CCodeVariableDeclarator ("data", new CCodeIdentifier ("_data")));
+               freeblock.add_statement (datadecl);
+
+               var freecall = new CCodeFunctionCall (new CCodeIdentifier ("g_slice_free"));
+               freecall.add_argument (new CCodeIdentifier (dataname));
+               freecall.add_argument (new CCodeIdentifier ("data"));
+               freeblock.add_statement (new CCodeExpressionStatement (freecall));
+
+               return freefunc;
+       }
+
        public override void visit_method (Method m) {
                if (!m.coroutine) {
                        base.visit_method (m);
@@ -65,6 +88,8 @@ internal class Vala.GAsyncModule : GSignalModule {
                source_type_definition.append (closure_struct);
                source_type_declaration.append (new CCodeTypeDefinition ("struct _" + dataname, new CCodeVariableDeclarator (dataname)));
 
+               source_type_member_definition.append (generate_free_function (m));
+
                // generate async function
                var asyncfunc = new CCodeFunction (m.get_real_cname () + "_async", "void");
                asyncfunc.line = function.line;
@@ -101,6 +126,12 @@ internal class Vala.GAsyncModule : GSignalModule {
 
                asyncblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), "_async_result"), create_result)));
 
+               var set_op_res_call = new CCodeFunctionCall (new CCodeIdentifier ("g_simple_async_result_set_op_res_gpointer"));
+               set_op_res_call.add_argument (new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), "_async_result"));
+               set_op_res_call.add_argument (new CCodeIdentifier ("data"));
+               set_op_res_call.add_argument (new CCodeIdentifier (m.get_real_cname () + "_data_free"));
+               asyncblock.add_statement (new CCodeExpressionStatement (set_op_res_call));
+
                if (m.binding == MemberBinding.INSTANCE) {
                        asyncblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), "self"), new CCodeIdentifier ("self"))));
                }