]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Add array_length_cname attribute for parameters
authorJürg Billeter <j@bitron.ch>
Wed, 15 Sep 2010 18:00:37 +0000 (20:00 +0200)
committerJürg Billeter <j@bitron.ch>
Wed, 15 Sep 2010 19:31:24 +0000 (21:31 +0200)
codegen/valaccodearraymodule.vala
codegen/valaccodebasemodule.vala
codegen/valaccodedelegatemodule.vala
codegen/valadbusclientmodule.vala
codegen/valadbusservermodule.vala
codegen/valagasyncmodule.vala
codegen/valagdbusclientmodule.vala
codegen/valagdbusservermodule.vala
vala/valacodewriter.vala
vala/valaformalparameter.vala

index 707dc834039bc2bd075cb2ee91e2a381a88a6c10..316c894ae9b6224b3cd5c86dce38fc983bb957ca 100644 (file)
@@ -130,6 +130,14 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                return "%s_length%d".printf (array_cname, dim);
        }
 
+       public override string get_parameter_array_length_cname (FormalParameter param, int dim) {
+               if (param.has_array_length_cname) {
+                       return param.get_array_length_cname ();
+               } else {
+                       return get_array_length_cname (get_variable_cname (param.name), dim);
+               }
+       }
+
        public override CCodeExpression get_array_length_cexpression (Expression array_expr, int dim = -1) {
                var array_type = array_expr.value_type as ArrayType;
 
@@ -178,7 +186,7 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                                if (param.captured) {
                                        // captured variables are stored on the heap
                                        var block = ((Method) param.parent_symbol).body;
-                                       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));
+                                       var length_expr = new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_parameter_array_length_cname (param, dim));
                                        if (is_out) {
                                                // passing array as out/ref
                                                return new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, length_expr);
@@ -193,7 +201,7 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                                                len_call.add_argument (carray_expr);
                                                return len_call;
                                        } else if (!param.no_array_length) {
-                                               CCodeExpression length_expr = get_variable_cexpression (get_array_length_cname (get_variable_cname (param.name), dim));
+                                               CCodeExpression length_expr = get_variable_cexpression (get_parameter_array_length_cname (param, dim));
                                                if (param.direction != ParameterDirection.IN) {
                                                        // accessing argument of out/ref param
                                                        length_expr = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, length_expr);
@@ -1041,7 +1049,7 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                        }
                        
                        for (int dim = 1; dim <= array_type.rank; dim++) {
-                               var cparam = new CCodeFormalParameter (get_array_length_cname (get_variable_cname (param.name), dim), length_ctype);
+                               var cparam = new CCodeFormalParameter (get_parameter_array_length_cname (param, dim), length_ctype);
                                cparam_map.set (get_param_pos (param.carray_length_parameter_position + 0.01 * dim), cparam);
                                if (carg_map != null) {
                                        carg_map.set (get_param_pos (param.carray_length_parameter_position + 0.01 * dim), get_variable_cexpression (cparam.name));
index ae19c4950738fc47fc39428edbe599233839bc20..91789d04cc1654ecb85a89511f28c628b3fcf1ee 100644 (file)
@@ -1731,8 +1731,8 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                if (param.variable_type is ArrayType) {
                        var array_type = (ArrayType) param.variable_type;
                        for (int dim = 1; dim <= array_type.rank; dim++) {
-                               data.add_field ("gint", get_array_length_cname (get_variable_cname (param.name), dim));
-                               cblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (block_id)), get_array_length_cname (get_variable_cname (param.name), dim)), new CCodeIdentifier (get_array_length_cname (get_variable_cname (param.name), dim)))));
+                               data.add_field ("gint", get_parameter_array_length_cname (param, dim));
+                               cblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (block_id)), get_parameter_array_length_cname (param, dim)), new CCodeIdentifier (get_parameter_array_length_cname (param, dim)))));
                        }
                } else if (param.variable_type is DelegateType) {
                        data.add_field ("gpointer", get_delegate_target_cname (get_variable_cname (param.name)));
@@ -5865,6 +5865,10 @@ public class Vala.CCodeBaseModule : CodeGenerator {
                return "";
        }
 
+       public virtual string get_parameter_array_length_cname (FormalParameter param, int dim) {
+               return "";
+       }
+
        public virtual CCodeExpression get_array_length_cexpression (Expression array_expr, int dim = -1) {
                return new CCodeConstant ("");
        }
index e18b1fb5ccbefa7615362a3713af5bfdaed3ce62..843e2ca3477d03f07604b879a58decb55653d8b6 100644 (file)
@@ -62,7 +62,7 @@ public class Vala.CCodeDelegateModule : CCodeArrayModule {
                                }
                                
                                for (int dim = 1; dim <= array_type.rank; dim++) {
-                                       var cparam = new CCodeFormalParameter (get_array_length_cname (get_variable_cname (param.name), dim), length_ctype);
+                                       var cparam = new CCodeFormalParameter (get_parameter_array_length_cname (param, dim), length_ctype);
                                        cfundecl.add_parameter (cparam);
                                }
                        }
@@ -497,7 +497,7 @@ public class Vala.CCodeDelegateModule : CCodeArrayModule {
                                        } else if (d_params.get (i).no_array_length) {
                                                clength = new CCodeConstant ("-1");
                                        } else {
-                                               clength = new CCodeIdentifier (get_array_length_cname (d_params.get (i).name, dim));
+                                               clength = new CCodeIdentifier (get_parameter_array_length_cname (d_params.get (i), dim));
                                        }
                                        carg_map.set (get_param_pos (param.carray_length_parameter_position + 0.01 * dim), clength);
                                }
index 3d8703ac6309639ee47924b4f7f0ea53c204f808..957e3ec75391f1b775af74dd6326443e0800bbdb 100644 (file)
@@ -266,7 +266,7 @@ public class Vala.DBusClientModule : DBusModule {
                                                cdecl = new CCodeDeclaration ("GPtrArray*");
 
                                                array_construct = new CCodeFunctionCall (new CCodeIdentifier ("g_ptr_array_sized_new"));
-                                               array_construct.add_argument (new CCodeIdentifier (get_array_length_cname (param.name, 1)));
+                                               array_construct.add_argument (new CCodeIdentifier (get_parameter_array_length_cname (param, 1)));
                                        } else {
                                                cdecl = new CCodeDeclaration ("GArray*");
 
@@ -285,16 +285,16 @@ public class Vala.DBusClientModule : DBusModule {
                                                var memcpy_call = new CCodeFunctionCall (new CCodeIdentifier ("memcpy"));
                                                memcpy_call.add_argument (new CCodeMemberAccess.pointer (new CCodeIdentifier ("dbus_%s".printf (param.name)), "pdata"));
                                                memcpy_call.add_argument (new CCodeIdentifier (param.name));
-                                               memcpy_call.add_argument (new CCodeBinaryExpression (CCodeBinaryOperator.MUL, new CCodeIdentifier (get_array_length_cname (param.name, 1)), sizeof_call));
+                                               memcpy_call.add_argument (new CCodeBinaryExpression (CCodeBinaryOperator.MUL, new CCodeIdentifier (get_parameter_array_length_cname (param, 1)), sizeof_call));
                                                block.add_statement (new CCodeExpressionStatement (memcpy_call));
 
-                                               var len_assignment = new CCodeAssignment (new CCodeMemberAccess.pointer (new CCodeIdentifier ("dbus_%s".printf (param.name)), "len"), new CCodeIdentifier (get_array_length_cname (param.name, 1)));
+                                               var len_assignment = new CCodeAssignment (new CCodeMemberAccess.pointer (new CCodeIdentifier ("dbus_%s".printf (param.name)), "len"), new CCodeIdentifier (get_parameter_array_length_cname (param, 1)));
                                                block.add_statement (new CCodeExpressionStatement (len_assignment));
                                        } else {
                                                var cappend_call = new CCodeFunctionCall (new CCodeIdentifier ("g_array_append_vals"));
                                                cappend_call.add_argument (new CCodeIdentifier ("dbus_%s".printf (param.name)));
                                                cappend_call.add_argument (new CCodeIdentifier (param.name));
-                                               cappend_call.add_argument (new CCodeIdentifier (get_array_length_cname (param.name, 1)));
+                                               cappend_call.add_argument (new CCodeIdentifier (get_parameter_array_length_cname (param, 1)));
                                                block.add_statement (new CCodeExpressionStatement (cappend_call));
                                        }
 
@@ -1559,7 +1559,7 @@ public class Vala.DBusClientModule : DBusModule {
                                var array_type = (ArrayType) param.variable_type;
 
                                for (int dim = 1; dim <= array_type.rank; dim++) {
-                                       string length_cname = get_array_length_cname (param.name, dim);
+                                       string length_cname = get_parameter_array_length_cname (param, dim);
 
                                        cdecl = new CCodeDeclaration ("int");
                                        cdecl.add_declarator (new CCodeVariableDeclarator (length_cname, new CCodeConstant ("0")));
index 3986d97c7d26ef04e69f792909e56df13911a12d..938d2923077e19f437a5919858528e8ffe916536 100644 (file)
@@ -220,7 +220,7 @@ public class Vala.DBusServerModule : DBusClientModule {
                                var array_type = (ArrayType) param.variable_type;
 
                                for (int dim = 1; dim <= array_type.rank; dim++) {
-                                       string length_cname = get_array_length_cname (param.name, dim);
+                                       string length_cname = get_parameter_array_length_cname (param, dim);
 
                                        cdecl = new CCodeDeclaration ("int");
                                        cdecl.add_declarator (new CCodeVariableDeclarator (length_cname, new CCodeConstant ("0")));
@@ -495,7 +495,7 @@ public class Vala.DBusServerModule : DBusClientModule {
                        if (param.variable_type is ArrayType) {
                                var array_type = (ArrayType) param.variable_type;
                                for (int dim = 1; dim <= array_type.rank; dim++) {
-                                       function.add_parameter (new CCodeFormalParameter (get_array_length_cname (param.name, dim), "int"));
+                                       function.add_parameter (new CCodeFormalParameter (get_parameter_array_length_cname (param, dim), "int"));
                                }
                        }
                }
index c8fb945b730c4855a55d53ba2563c4f9c3a56bf1..8e8cd3a3ab10fb9effea882d6040cc48cce6dbfa 100644 (file)
@@ -45,7 +45,7 @@ public class Vala.GAsyncModule : GSignalModule {
                                var array_type = (ArrayType) param.variable_type;
                                if (!param.no_array_length) {
                                        for (int dim = 1; dim <= array_type.rank; dim++) {
-                                               data.add_field ("gint", get_array_length_cname (get_variable_cname (param.name), dim));
+                                               data.add_field ("gint", get_parameter_array_length_cname (param, dim));
                                        }
                                }
                        } else if (param.variable_type is DelegateType) {
@@ -243,7 +243,7 @@ public class Vala.GAsyncModule : GSignalModule {
                                        var array_type = (ArrayType) param.variable_type;
                                        if (!param.no_array_length) {
                                                for (int dim = 1; dim <= array_type.rank; dim++) {
-                                                       asyncblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (data_var, get_array_length_cname (get_variable_cname (param.name), dim)), new CCodeIdentifier (get_array_length_cname (get_variable_cname (param.name), dim)))));
+                                                       asyncblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (data_var, get_parameter_array_length_cname (param, dim)), new CCodeIdentifier (get_parameter_array_length_cname (param, dim)))));
                                                }
                                        }
                                } else if (param.variable_type is DelegateType) {
index 45c18b6be3d55d6cb6dd92412b38032dd2e44621..06ddcc423f77ec1c7a22252c1c42754bf001a985 100644 (file)
@@ -331,7 +331,7 @@ public class Vala.GDBusClientModule : GDBusModule {
                                var array_type = (ArrayType) param.variable_type;
 
                                for (int dim = 1; dim <= array_type.rank; dim++) {
-                                       string length_cname = get_array_length_cname (param.name, dim);
+                                       string length_cname = get_parameter_array_length_cname (param, dim);
 
                                        cdecl = new CCodeDeclaration ("int");
                                        cdecl.add_declarator (new CCodeVariableDeclarator (length_cname, new CCodeConstant ("0")));
index 8d22467fb5c4067cf44bbaa2ccddc4e2cb4ade4d..f345993eaecadb59aefd67fa42620f626a33e174 100644 (file)
@@ -160,7 +160,7 @@ public class Vala.GDBusServerModule : GDBusClientModule {
                                var array_type = (ArrayType) param.variable_type;
 
                                for (int dim = 1; dim <= array_type.rank; dim++) {
-                                       string length_cname = get_array_length_cname (param.name, dim);
+                                       string length_cname = get_parameter_array_length_cname (param, dim);
 
                                        cdecl = new CCodeDeclaration ("int");
                                        cdecl.add_declarator (new CCodeVariableDeclarator (length_cname, new CCodeConstant ("0")));
@@ -369,7 +369,7 @@ public class Vala.GDBusServerModule : GDBusClientModule {
                        if (param.variable_type is ArrayType) {
                                var array_type = (ArrayType) param.variable_type;
                                for (int dim = 1; dim <= array_type.rank; dim++) {
-                                       function.add_parameter (new CCodeFormalParameter (get_array_length_cname (param.name, dim), "int"));
+                                       function.add_parameter (new CCodeFormalParameter (get_parameter_array_length_cname (param, dim), "int"));
                                }
                        }
                }
index f84409b577866bfcfc45100d456f840093b63276..f4030399605efd4a9a0019afeee4cdf3b1630449 100644 (file)
@@ -809,6 +809,10 @@ public class Vala.CodeWriter : CodeVisitor {
                                ccode_params.append_printf ("%sarray_length_type = \"%s\"", separator, param.array_length_type);
                                separator = ", ";
                        }
+                       if (param.get_array_length_cname () != null && param.variable_type is ArrayType) {
+                               ccode_params.append_printf ("%sarray_length_cname = \"%s\"", separator, param.get_array_length_cname ());
+                               separator = ", ";
+                       }
                        if (!float_equal (param.carray_length_parameter_position, i + 0.1)) {
                                ccode_params.append_printf ("%sarray_length_pos = %g", separator, param.carray_length_parameter_position);
                                separator = ", ";
index 605af0349dfc1729197de52498318abb8bb2cd28..4aefdf1b474992e2a6c3e8f5f5eadcc32b7ccb6e 100644 (file)
@@ -53,6 +53,13 @@ public class Vala.FormalParameter : Variable {
         */
        public bool array_null_terminated { get; set; }
 
+       /**
+        * Specifies whether the array length parameter uses a custom name in C.
+        */
+       public bool has_array_length_cname {
+               get { return (array_length_cname != null); }
+       }
+
        /**
         * Specifies a custom type for the array length.
         */
@@ -84,6 +91,8 @@ public class Vala.FormalParameter : Variable {
 
        public bool captured { get; set; }
 
+       private string? array_length_cname;
+
        /**
         * Creates a new formal parameter.
         *
@@ -135,6 +144,25 @@ public class Vala.FormalParameter : Variable {
                }
        }
 
+       /**
+        * Returns the name of the array length parameter as it is used in C code
+        *
+        * @return the name of the array length parameter to be used in C code
+        */
+       public string? get_array_length_cname () {
+               return this.array_length_cname;
+       }
+
+       /**
+        * Sets the name of the array length parameter as it is used in C code
+        *
+        * @param array_length_cname the name of the array length parameter to be
+        * used in C code
+        */
+       public void set_array_length_cname (string? array_length_cname) {
+               this.array_length_cname = array_length_cname;
+       }
+
        private void process_ccode_attribute (Attribute a) {
                if (a.has_argument ("type")) {
                        ctype = a.get_string ("type");
@@ -154,6 +182,9 @@ public class Vala.FormalParameter : Variable {
                if (a.has_argument ("array_length_pos")) {
                        carray_length_parameter_position = a.get_double ("array_length_pos");
                }
+               if (a.has_argument ("array_length_cname")) {
+                       set_array_length_cname (a.get_string ("array_length_cname"));
+               }
                if (a.has_argument ("delegate_target_pos")) {
                        cdelegate_target_parameter_position = a.get_double ("delegate_target_pos");
                }