[vala] GAsync: Support GSourceFunc callbacks in async methods
- From: Jürg Billeter <juergbi src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [vala] GAsync: Support GSourceFunc callbacks in async methods
- Date: Sun, 13 Sep 2009 15:29:25 +0000 (UTC)
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]