[vala] GAsync: Hold refcount on 'self' while waiting



commit 3e49663e9721d3a1ffc434d15321218fee3b0934
Author: Ryan Lortie <desrt desrt ca>
Date:   Wed Feb 24 02:06:08 2010 -0500

    GAsync: Hold refcount on 'self' while waiting
    
    Fixes bug 610912.

 codegen/valagasyncmodule.vala |   22 +++++++++++++++++++++-
 1 files changed, 21 insertions(+), 1 deletions(-)
---
diff --git a/codegen/valagasyncmodule.vala b/codegen/valagasyncmodule.vala
index 5222048..c1212de 100644
--- a/codegen/valagasyncmodule.vala
+++ b/codegen/valagasyncmodule.vala
@@ -112,6 +112,17 @@ internal class Vala.GAsyncModule : GSignalModule {
 			freeblock.add_statement (new CCodeExpressionStatement (unref_expr));
 		}
 
+		var cl = m.parent_symbol as Class;
+		if (m.binding == MemberBinding.INSTANCE && cl != null) {
+			var unref_func = cl.get_unref_function ();
+
+			if (unref_func != null) {
+				var unref_call = new CCodeFunctionCall (new CCodeIdentifier (unref_func));
+				unref_call.add_argument (new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), "self"));
+				freeblock.add_statement (new CCodeExpressionStatement (unref_call));
+			}
+		}
+
 		current_symbol = old_symbol;
 
 		var freecall = new CCodeFunctionCall (new CCodeIdentifier ("g_slice_free"));
@@ -185,7 +196,16 @@ internal class Vala.GAsyncModule : GSignalModule {
 		asyncblock.add_statement (new CCodeExpressionStatement (set_op_res_call));
 
 		if (m.binding == MemberBinding.INSTANCE) {
-			asyncblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (data_var, "self"), new CCodeIdentifier ("self"))));
+			CCodeExpression self_expr = new CCodeIdentifier ("self");
+			string? ref_function = null;
+
+			if (cl != null && (ref_function = cl.get_ref_function ()) != null) {
+				var refcall = new CCodeFunctionCall (new CCodeIdentifier (ref_function));
+				refcall.add_argument (self_expr);
+				self_expr = refcall;
+			}
+
+			asyncblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (data_var, "self"), self_expr)));
 		}
 
 		foreach (FormalParameter param in m.get_parameters ()) {



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