From: Jürg Billeter Date: Thu, 17 Sep 2009 18:35:42 +0000 (+0200) Subject: Fix passing captured variables as out arguments X-Git-Tag: 0.7.6~6 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=afc56ff8b1874bd1eee653ec894c7336a2b762a6;p=thirdparty%2Fvala.git Fix passing captured variables as out arguments --- diff --git a/codegen/valaccodearraymodule.vala b/codegen/valaccodearraymodule.vala index d21c42838..6ab425667 100644 --- a/codegen/valaccodearraymodule.vala +++ b/codegen/valaccodearraymodule.vala @@ -172,9 +172,21 @@ internal class Vala.CCodeArrayModule : CCodeMethodCallModule { if (param.captured) { // captured variables are stored on the heap var block = ((Method) param.parent_symbol).body; - return new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_array_length_cname (get_variable_cname (param.name), dim)); + var length_expr = new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_array_length_cname (get_variable_cname (param.name), dim)); + if (is_out) { + // passing array as out/ref + return new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, length_expr); + } else { + return length_expr; + } } else if (current_method != null && current_method.coroutine) { - return new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_array_length_cname (get_variable_cname (param.name), dim)); + var length_expr = new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_array_length_cname (get_variable_cname (param.name), dim)); + if (is_out) { + // passing array as out/ref + return new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, length_expr); + } else { + return length_expr; + } } else { if (param.array_null_terminated) { var carray_expr = get_variable_cexpression (param.name); @@ -201,9 +213,21 @@ internal class Vala.CCodeArrayModule : CCodeMethodCallModule { if (local.captured) { // captured variables are stored on the heap var block = (Block) local.parent_symbol; - return new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_array_length_cname (get_variable_cname (local.name), dim)); + var length_expr = new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_array_length_cname (get_variable_cname (local.name), dim)); + if (is_out) { + // passing array as out/ref + return new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, length_expr); + } else { + return length_expr; + } } else if (current_method != null && current_method.coroutine) { - return new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_array_length_cname (get_variable_cname (local.name), dim)); + var length_expr = new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_array_length_cname (get_variable_cname (local.name), dim)); + if (is_out) { + // passing array as out/ref + return new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, length_expr); + } else { + return length_expr; + } } else { var length_expr = get_variable_cexpression (get_array_length_cname (get_variable_cname (local.name), dim)); if (is_out) {