[vala] GAsync: Hold refcount on 'self' while waiting
- From: Jürg Billeter <juergbi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala] GAsync: Hold refcount on 'self' while waiting
- Date: Wed, 24 Feb 2010 15:29:16 +0000 (UTC)
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]