]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Fix passing captured variables as out arguments
authorJürg Billeter <j@bitron.ch>
Thu, 17 Sep 2009 18:35:42 +0000 (20:35 +0200)
committerJürg Billeter <j@bitron.ch>
Thu, 17 Sep 2009 18:35:42 +0000 (20:35 +0200)
codegen/valaccodearraymodule.vala

index d21c42838c1fdb375250f1d11bf2e86b91048019..6ab425667dbbab950fe972eff3f65e0b2afbd765 100644 (file)
@@ -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) {