From: Luca Bruno Date: Tue, 28 Jun 2011 10:09:04 +0000 (+0200) Subject: GAsync: Fix returning out parameters from async methods X-Git-Tag: 0.13.1~18 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9b22a27ed5ca78b74f56df7456ab321fd535d405;p=thirdparty%2Fvala.git GAsync: Fix returning out parameters from async methods Fixes bug 640721. --- diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index 84d7b3024..39adeb4cb 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -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) { diff --git a/codegen/valagasyncmodule.vala b/codegen/valagasyncmodule.vala index 68469d150..c6843ed16 100644 --- a/codegen/valagasyncmodule.vala +++ b/codegen/valagasyncmodule.vala @@ -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")); } diff --git a/tests/Makefile.am b/tests/Makefile.am index e3d6a5a55..309c72cff 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -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 index 000000000..d7ff61252 --- /dev/null +++ b/tests/asynchronous/bug640721.vala @@ -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 (); +}