]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
GAsync: Fix returning out parameters from async methods
authorLuca Bruno <lucabru@src.gnome.org>
Tue, 28 Jun 2011 10:09:04 +0000 (12:09 +0200)
committerLuca Bruno <lucabru@src.gnome.org>
Tue, 28 Jun 2011 10:41:07 +0000 (12:41 +0200)
Fixes bug 640721.

codegen/valaccodebasemodule.vala
codegen/valagasyncmodule.vala
tests/Makefile.am
tests/asynchronous/bug640721.vala [new file with mode: 0644]

index 84d7b3024edc5bc1d462dd6bf5bdad6b706710f6..39adeb4cb95a7dff5833de45a3310bcd6ff10b3b 100644 (file)
@@ -3162,11 +3162,14 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                return false;
        }
 
-       void return_out_parameter (Parameter param) {
+       public void return_out_parameter (Parameter param) {
                var delegate_type = param.variable_type as DelegateType;
 
                var value = load_parameter (param);
 
+               var old_coroutine = is_in_coroutine ();
+               current_method.coroutine = false;
+
                ccode.open_if (get_variable_cexpression (param.name));
                ccode.add_assignment (new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, get_variable_cexpression (param.name)), get_cvalue_ (value));
 
@@ -3179,7 +3182,9 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 
                if (param.variable_type.is_disposable ()){
                        ccode.add_else ();
+                       current_method.coroutine = old_coroutine;
                        ccode.add_expression (destroy_parameter (param));
+                       current_method.coroutine = false;
                }
                ccode.close ();
 
@@ -3191,6 +3196,8 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
                                ccode.close ();
                        }
                }
+
+               current_method.coroutine = old_coroutine;
        }
 
        public override void visit_return_statement (ReturnStatement stmt) {
index 68469d15083ebc92fb735d15f31a568077761700..c6843ed161204e811d8e402fdd0c80ef70d8fe09 100644 (file)
@@ -371,7 +371,7 @@ public class Vala.GAsyncModule : GSignalModule {
 
 
        void generate_finish_function (Method m) {
-               push_context (new EmitContext ());
+               push_context (new EmitContext (m));
 
                string dataname = Symbol.lower_case_to_camel_case (m.get_cname ()) + "Data";
 
@@ -418,7 +418,7 @@ public class Vala.GAsyncModule : GSignalModule {
 
                foreach (Parameter param in m.get_parameters ()) {
                        if (param.direction != ParameterDirection.IN) {
-                               ccode.add_assignment (new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeIdentifier (param.name)), new CCodeMemberAccess.pointer (data_var, get_variable_cname (param.name)));
+                               return_out_parameter (param);
                                if (!(param.variable_type is ValueType) || param.variable_type.nullable) {
                                        ccode.add_assignment (new CCodeMemberAccess.pointer (data_var, get_variable_cname (param.name)), new CCodeConstant ("NULL"));
                                }
index e3d6a5a55eef8ac178d51fdcc83ff67a24fca7a5..309c72cffc7a2d3e5bc1895fe2b07ef7a088cc17 100644 (file)
@@ -114,6 +114,7 @@ TESTS = \
        asynchronous/bug613484.vala \
        asynchronous/bug620740.vala \
        asynchronous/bug639591.vala \
+       asynchronous/bug640721.vala \
        asynchronous/bug641182.vala \
        asynchronous/bug646945.vala \
        asynchronous/bug652252.vala \
diff --git a/tests/asynchronous/bug640721.vala b/tests/asynchronous/bug640721.vala
new file mode 100644 (file)
index 0000000..d7ff612
--- /dev/null
@@ -0,0 +1,8 @@
+async void foo (out int i) {
+}
+
+void main () {
+       var loop = new MainLoop ();
+       foo ((s,r) => { foo.end (r, null); loop.quit (); });
+       loop.run ();
+}