[vala] GAsync: Support GSourceFunc callbacks in async methods



commit e6ab13145dc2309b21b761d9412ce71f74c7c972
Author: Jürg Billeter <j bitron ch>
Date:   Sun Sep 13 11:51:27 2009 +0200

    GAsync: Support GSourceFunc callbacks in async methods

 codegen/valaccodedelegatemodule.vala |    6 ++++--
 codegen/valaccodemethodmodule.vala   |    3 +++
 vala/valamethod.vala                 |   21 +++++++++++++++++++++
 vala/valamethodtype.vala             |    2 ++
 4 files changed, 30 insertions(+), 2 deletions(-)
---
diff --git a/codegen/valaccodedelegatemodule.vala b/codegen/valaccodedelegatemodule.vala
index 678ffe7..7fb93a4 100644
--- a/codegen/valaccodedelegatemodule.vala
+++ b/codegen/valaccodedelegatemodule.vala
@@ -203,6 +203,8 @@ internal class Vala.CCodeDelegateModule : CCodeArrayModule {
 				var ma = (MemberAccess) delegate_expr;
 				if (m.binding == MemberBinding.STATIC) {
 					return new CCodeConstant ("NULL");
+				} else if (m.is_async_callback) {
+					return new CCodeIdentifier ("data");
 				} else {
 					return (CCodeExpression) get_ccodenode (ma.inner);
 				}
@@ -231,9 +233,9 @@ internal class Vala.CCodeDelegateModule : CCodeArrayModule {
 			}
 
 			return new CCodeIdentifier (generate_delegate_wrapper (method, dt.delegate_symbol));
-		} else {
-			return base.get_implicit_cast_expression (source_cexpr, expression_type, target_type, expr);
 		}
+
+		return base.get_implicit_cast_expression (source_cexpr, expression_type, target_type, expr);
 	}
 
 	private string generate_delegate_wrapper (Method m, Delegate d) {
diff --git a/codegen/valaccodemethodmodule.vala b/codegen/valaccodemethodmodule.vala
index 72412c8..9b7d319 100644
--- a/codegen/valaccodemethodmodule.vala
+++ b/codegen/valaccodemethodmodule.vala
@@ -147,6 +147,9 @@ internal class Vala.CCodeMethodModule : CCodeStructModule {
 	}
 
 	public override void generate_method_declaration (Method m, CCodeDeclarationSpace decl_space) {
+		if (m.is_async_callback) {
+			return;
+		}
 		if (decl_space.add_symbol_declaration (m, m.get_cname ())) {
 			return;
 		}
diff --git a/vala/valamethod.vala b/vala/valamethod.vala
index 5c8119b..1e69545 100644
--- a/vala/valamethod.vala
+++ b/vala/valamethod.vala
@@ -220,6 +220,8 @@ public class Vala.Method : Member {
 
 	public bool coroutine { get; set; }
 
+	public bool is_async_callback { get; set; }
+
 	private Gee.List<FormalParameter> parameters = new ArrayList<FormalParameter> ();
 	private string cname;
 	private string _vfunc_name;
@@ -233,6 +235,8 @@ public class Vala.Method : Member {
 	private Method _base_interface_method;
 	private bool base_methods_valid;
 
+	Method? callback_method;
+
 	/**
 	 * Creates a new method.
 	 *
@@ -920,6 +924,23 @@ public class Vala.Method : Member {
 		}
 		return n;
 	}
+
+	public Method get_callback_method () {
+		assert (this.coroutine);
+
+		if (callback_method == null) {
+			var bool_type = new BooleanType ((Struct) CodeContext.get ().root.scope.lookup ("bool"));
+			bool_type.value_owned = true;
+			callback_method = new Method ("callback", bool_type, source_reference);
+			callback_method.access = SymbolAccessibility.PUBLIC;
+			callback_method.external = true;
+			callback_method.binding = MemberBinding.INSTANCE;
+			callback_method.owner = scope;
+			callback_method.is_async_callback = true;
+			callback_method.set_cname (get_real_cname () + "_co");
+		}
+		return callback_method;
+	}
 }
 
 // vim:sw=8 noet
diff --git a/vala/valamethodtype.vala b/vala/valamethodtype.vala
index aa27212..6167a25 100644
--- a/vala/valamethodtype.vala
+++ b/vala/valamethodtype.vala
@@ -70,6 +70,8 @@ public class Vala.MethodType : DataType {
 	public override Symbol? get_member (string member_name) {
 		if (method_symbol.coroutine && member_name == "begin") {
 			return method_symbol;
+		} else if (method_symbol.coroutine && member_name == "callback") {
+			return method_symbol.get_callback_method ();
 		}
 		return null;
 	}



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