]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Move get_array_length_cname and get_array_length_cexpression to
authorJürg Billeter <j@bitron.ch>
Fri, 24 Oct 2008 19:54:05 +0000 (19:54 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Fri, 24 Oct 2008 19:54:05 +0000 (19:54 +0000)
2008-10-24  Jürg Billeter  <j@bitron.ch>

* gobject/valaccodearraymodule.vala:
* gobject/valaccodeassignmentmodule.vala:
* gobject/valaccodeelementaccessmodule.vala:
* gobject/valaccodegenerator.vala:
* gobject/valaccodeinvocationexpressionmodule.vala:
* gobject/valaccodememberaccessmodule.vala:
* gobject/valaccodemethodmodule.vala:
* gobject/valaccodemodule.vala:
* gobject/valadbusmodule.vala:

Move get_array_length_cname and get_array_length_cexpression to
CCodeArrayModule

svn path=/trunk/; revision=1908

ChangeLog
gobject/valaccodearraymodule.vala
gobject/valaccodeassignmentmodule.vala
gobject/valaccodeelementaccessmodule.vala
gobject/valaccodegenerator.vala
gobject/valaccodeinvocationexpressionmodule.vala
gobject/valaccodememberaccessmodule.vala
gobject/valaccodemethodmodule.vala
gobject/valaccodemodule.vala
gobject/valadbusmodule.vala

index 035ca61886c2a7449079f50012c6412214357d95..210e11cf083fb410b548e2da461513ef7a78bda9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2008-10-24  Jürg Billeter  <j@bitron.ch>
+
+       * gobject/valaccodearraymodule.vala:
+       * gobject/valaccodeassignmentmodule.vala:
+       * gobject/valaccodeelementaccessmodule.vala:
+       * gobject/valaccodegenerator.vala:
+       * gobject/valaccodeinvocationexpressionmodule.vala:
+       * gobject/valaccodememberaccessmodule.vala:
+       * gobject/valaccodemethodmodule.vala:
+       * gobject/valaccodemodule.vala:
+       * gobject/valadbusmodule.vala:
+
+       Move get_array_length_cname and get_array_length_cexpression to
+       CCodeArrayModule
+
 2008-10-24  Jürg Billeter  <j@bitron.ch>
 
        * vapigen/valagirparser.vala:
index 4a85a152f96d38ac57c1383fdbd2d6718d46e7a0..b91317e7d60605d97228b7ce8c6fc863b068aad9 100644 (file)
@@ -97,4 +97,130 @@ public class Vala.CCodeArrayModule : CCodeModule {
                        expr.ccodenode = gnew;
                }
        }
+
+       public override string get_array_length_cname (string array_cname, int dim) {
+               return "%s_length%d".printf (array_cname, dim);
+       }
+
+       public override CCodeExpression get_array_length_cexpression (Expression array_expr, int dim = -1) {
+               // dim == -1 => total size over all dimensions
+               if (dim == -1) {
+                       var array_type = array_expr.value_type as ArrayType;
+                       if (array_type != null && array_type.rank > 1) {
+                               CCodeExpression cexpr = get_array_length_cexpression (array_expr, 1);
+                               for (dim = 2; dim <= array_type.rank; dim++) {
+                                       cexpr = new CCodeBinaryExpression (CCodeBinaryOperator.MUL, cexpr, get_array_length_cexpression (array_expr, dim));
+                               }
+                               return cexpr;
+                       } else {
+                               dim = 1;
+                       }
+               }
+
+               bool is_out = false;
+
+               if (array_expr is UnaryExpression) {
+                       var unary_expr = (UnaryExpression) array_expr;
+                       if (unary_expr.operator == UnaryOperator.OUT || unary_expr.operator == UnaryOperator.REF) {
+                               array_expr = unary_expr.inner;
+                               is_out = true;
+                       }
+               } else if (array_expr is ReferenceTransferExpression) {
+                       var reftransfer_expr = (ReferenceTransferExpression) array_expr;
+                       array_expr = reftransfer_expr.inner;
+               }
+               
+               if (array_expr is ArrayCreationExpression) {
+                       Gee.List<Expression> size = ((ArrayCreationExpression) array_expr).get_sizes ();
+                       var length_expr = size[dim - 1];
+                       return (CCodeExpression) codegen.get_ccodenode (length_expr);
+               } else if (array_expr is InvocationExpression) {
+                       var invocation_expr = (InvocationExpression) array_expr;
+                       Gee.List<CCodeExpression> size = invocation_expr.get_array_sizes ();
+                       return size[dim - 1];
+               } else if (array_expr.symbol_reference != null) {
+                       if (array_expr.symbol_reference is FormalParameter) {
+                               var param = (FormalParameter) array_expr.symbol_reference;
+                               if (!param.no_array_length) {
+                                       CCodeExpression length_expr = new CCodeIdentifier (get_array_length_cname (param.name, dim));
+                                       if (param.direction != ParameterDirection.IN) {
+                                               // accessing argument of out/ref param
+                                               length_expr = new CCodeParenthesizedExpression (new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, length_expr));
+                                       }
+                                       if (is_out) {
+                                               // passing array as out/ref
+                                               return new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, length_expr);
+                                       } else {
+                                               return length_expr;
+                                       }
+                               }
+                       } else if (array_expr.symbol_reference is LocalVariable) {
+                               var local = (LocalVariable) array_expr.symbol_reference;
+                               var length_expr = new CCodeIdentifier (get_array_length_cname (local.name, dim));
+                               if (is_out) {
+                                       return new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, length_expr);
+                               } else {
+                                       return length_expr;
+                               }
+                       } else if (array_expr.symbol_reference is Field) {
+                               var field = (Field) array_expr.symbol_reference;
+                               if (!field.no_array_length) {
+                                       var ma = (MemberAccess) array_expr;
+
+                                       CCodeExpression length_expr = null;
+
+                                       if (field.binding == MemberBinding.INSTANCE) {
+                                               TypeSymbol base_type = null;
+                                               if (ma.inner.value_type != null) {
+                                                       base_type = ma.inner.value_type.data_type;
+                                               }
+
+                                               var length_cname = get_array_length_cname (field.name, dim);
+                                               var instance_expression_type = codegen.get_data_type_for_symbol (base_type);
+                                               var instance_target_type = codegen.get_data_type_for_symbol ((TypeSymbol) field.parent_symbol);
+                                               CCodeExpression typed_inst = (CCodeExpression) codegen.get_ccodenode (ma.inner);
+
+                                               CCodeExpression inst;
+                                               if (field.access == SymbolAccessibility.PRIVATE) {
+                                                       inst = new CCodeMemberAccess.pointer (typed_inst, "priv");
+                                               } else {
+                                                       inst = typed_inst;
+                                               }
+                                               if (((TypeSymbol) field.parent_symbol).is_reference_type ()) {
+                                                       length_expr = new CCodeMemberAccess.pointer (inst, length_cname);
+                                               } else {
+                                                       length_expr = new CCodeMemberAccess (inst, length_cname);
+                                               }
+                                       } else {
+                                               length_expr = new CCodeIdentifier (get_array_length_cname (field.get_cname (), dim));
+                                       }
+
+                                       if (is_out) {
+                                               return new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, length_expr);
+                                       } else {
+                                               return length_expr;
+                                       }
+                               }
+                       } else if (array_expr.symbol_reference is Constant) {
+                               var constant = (Constant) array_expr.symbol_reference;
+                               var ccall = new CCodeFunctionCall (new CCodeIdentifier ("G_N_ELEMENTS"));
+                               ccall.add_argument (new CCodeIdentifier (constant.get_cname ()));
+                               return ccall;
+                       }
+               } else if (array_expr is NullLiteral) {
+                       return new CCodeConstant ("0");
+               }
+
+               if (!is_out) {
+                       /* allow arrays with unknown length even for value types
+                        * as else it may be impossible to bind some libraries
+                        * users of affected libraries should explicitly set
+                        * the array length as early as possible
+                        * by setting the virtual length field of the array
+                        */
+                       return new CCodeConstant ("-1");
+               } else {
+                       return new CCodeConstant ("NULL");
+               }
+       }
 }
index 56abf3e2b8a0e15c5a4440d884cd585b849cd79c..b9ebb25767905c73df30a6651b619a855df90a79 100644 (file)
@@ -281,7 +281,7 @@ public class Vala.CCodeAssignmentModule : CCodeModule {
                bool array = false;
                bool instance_delegate = false;
                if (assignment.left.value_type is ArrayType) {
-                       array = !(codegen.get_array_length_cexpression (assignment.left, 1) is CCodeConstant);
+                       array = !(head.get_array_length_cexpression (assignment.left, 1) is CCodeConstant);
                } else if (assignment.left.value_type is DelegateType) {
                        var delegate_type = (DelegateType) assignment.left.value_type;
                        instance_delegate = delegate_type.delegate_symbol.has_target;
@@ -301,8 +301,8 @@ public class Vala.CCodeAssignmentModule : CCodeModule {
                        if (array) {
                                var array_type = (ArrayType) assignment.left.value_type;
                                for (int dim = 1; dim <= array_type.rank; dim++) {
-                                       var lhs_array_len = codegen.get_array_length_cexpression (assignment.left, dim);
-                                       var rhs_array_len = codegen.get_array_length_cexpression (assignment.right, dim);
+                                       var lhs_array_len = head.get_array_length_cexpression (assignment.left, dim);
+                                       var rhs_array_len = head.get_array_length_cexpression (assignment.right, dim);
                                        ccomma.append_expression (new CCodeAssignment (lhs_array_len, rhs_array_len));
                                }
                        } else if (instance_delegate) {
index 7373eb68040237159b46419c3ddfb02aa8606109..31eb0dc535d6526df23c9e46761690344511b0fc 100644 (file)
@@ -48,7 +48,7 @@ public class Vala.CCodeElementAccessModule : CCodeModule {
                        var memberaccess = expr.container as MemberAccess;
                        if (lit != null && memberaccess != null) {
                                int dim = lit.value.to_int ();
-                               expr.ccodenode = codegen.get_array_length_cexpression (memberaccess.inner, dim + 1);
+                               expr.ccodenode = head.get_array_length_cexpression (memberaccess.inner, dim + 1);
                        }
                } else if (container_type == codegen.string_type.data_type) {
                        // access to unichar in a string
@@ -105,7 +105,7 @@ public class Vala.CCodeElementAccessModule : CCodeModule {
                } else {
                        // access to element in an array
                        for (int i = 1; i < rank; i++) {
-                               var cmul = new CCodeBinaryExpression (CCodeBinaryOperator.MUL, new CCodeParenthesizedExpression (cindex), codegen.get_array_length_cexpression (expr.container, i + 1));
+                               var cmul = new CCodeBinaryExpression (CCodeBinaryOperator.MUL, new CCodeParenthesizedExpression (cindex), head.get_array_length_cexpression (expr.container, i + 1));
                                cindex = new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, cmul, new CCodeParenthesizedExpression ((CCodeExpression) indices[i].ccodenode));
                        }
                        expr.ccodenode = new CCodeElementAccess (ccontainer, cindex);
index be6b3cdd067519cbeaff870443f090d9fca521e9..5c07d8037ba43547a336190ae01a4463cd79f48e 100644 (file)
@@ -484,7 +484,7 @@ public class Vala.CCodeGenerator : CodeGenerator {
                                }
                                
                                for (int dim = 1; dim <= array_type.rank; dim++) {
-                                       var cparam = new CCodeFormalParameter (get_array_length_cname (param.name, dim), length_ctype);
+                                       var cparam = new CCodeFormalParameter (head.get_array_length_cname (param.name, dim), length_ctype);
                                        cfundecl.add_parameter (cparam);
                                }
                        }
@@ -639,7 +639,7 @@ public class Vala.CCodeGenerator : CodeGenerator {
                                for (int dim = 1; dim <= array_type.rank; dim++) {
                                        var len_type = int_type.copy ();
 
-                                       st.add_field (len_type.get_cname (), get_array_length_cname (f.name, dim));
+                                       st.add_field (len_type.get_cname (), head.get_array_length_cname (f.name, dim));
                                }
                        } else if (f.field_type is DelegateType) {
                                var delegate_type = (DelegateType) f.field_type;
@@ -665,7 +665,7 @@ public class Vala.CCodeGenerator : CodeGenerator {
                                        
                                        Gee.List<Expression> sizes = ((ArrayCreationExpression) f.initializer).get_sizes ();
                                        for (int dim = 1; dim <= array_type.rank; dim++) {
-                                               var array_len_lhs = get_array_length_cexpression (ma, dim);
+                                               var array_len_lhs = head.get_array_length_cexpression (ma, dim);
                                                var size = sizes[dim - 1];
                                                instance_init_fragment.append (new CCodeExpressionStatement (new CCodeAssignment (array_len_lhs, (CCodeExpression) size.ccodenode)));
                                        }
@@ -691,7 +691,7 @@ public class Vala.CCodeGenerator : CodeGenerator {
                                        var len_type = int_type.copy ();
 
                                        var cdecl = new CCodeDeclaration (len_type.get_cname ());
-                                       cdecl.add_declarator (new CCodeVariableDeclarator (get_array_length_cname (f.get_cname (), dim)));
+                                       cdecl.add_declarator (new CCodeVariableDeclarator (head.get_array_length_cname (f.get_cname (), dim)));
                                        if (f.access != SymbolAccessibility.PRIVATE) {
                                                cdecl.modifiers = CCodeModifiers.EXTERN;
                                                header_type_member_declaration.append (cdecl);
@@ -1244,7 +1244,7 @@ public class Vala.CCodeGenerator : CodeGenerator {
                        var array_type = (ArrayType) local.variable_type;
                        
                        for (int dim = 1; dim <= array_type.rank; dim++) {
-                               var len_var = new LocalVariable (int_type.copy (), get_array_length_cname (local.name, dim));
+                               var len_var = new LocalVariable (int_type.copy (), head.get_array_length_cname (local.name, dim));
                                temp_vars.insert (0, len_var);
                        }
                } else if (local.variable_type is DelegateType) {
@@ -1271,8 +1271,8 @@ public class Vala.CCodeGenerator : CodeGenerator {
                                ccomma.append_expression (new CCodeAssignment (new CCodeIdentifier (temp_var.name), rhs));
 
                                for (int dim = 1; dim <= array_type.rank; dim++) {
-                                       var lhs_array_len = new CCodeIdentifier (get_array_length_cname (local.name, dim));
-                                       var rhs_array_len = get_array_length_cexpression (local.initializer, dim);
+                                       var lhs_array_len = new CCodeIdentifier (head.get_array_length_cname (local.name, dim));
+                                       var rhs_array_len = head.get_array_length_cexpression (local.initializer, dim);
                                        ccomma.append_expression (new CCodeAssignment (lhs_array_len, rhs_array_len));
                                }
                                
@@ -1308,7 +1308,7 @@ public class Vala.CCodeGenerator : CodeGenerator {
                                var ccomma = new CCodeCommaExpression ();
 
                                for (int dim = 1; dim <= array_type.rank; dim++) {
-                                       ccomma.append_expression (new CCodeAssignment (new CCodeIdentifier (get_array_length_cname (local.name, dim)), new CCodeConstant ("0")));
+                                       ccomma.append_expression (new CCodeAssignment (new CCodeIdentifier (head.get_array_length_cname (local.name, dim)), new CCodeConstant ("0")));
                                }
 
                                ccomma.append_expression (rhs);
@@ -1704,10 +1704,10 @@ public class Vala.CCodeGenerator : CodeGenerator {
                                CCodeExpression csizeexpr = null;
                                for (int dim = 1; dim <= array_type.rank; dim++) {
                                        if (first) {
-                                               csizeexpr = get_array_length_cexpression (expr, dim);
+                                               csizeexpr = head.get_array_length_cexpression (expr, dim);
                                                first = false;
                                        } else {
-                                               csizeexpr = new CCodeBinaryExpression (CCodeBinaryOperator.MUL, csizeexpr, get_array_length_cexpression (expr, dim));
+                                               csizeexpr = new CCodeBinaryExpression (CCodeBinaryOperator.MUL, csizeexpr, head.get_array_length_cexpression (expr, dim));
                                        }
                                }
 
@@ -2184,11 +2184,11 @@ public class Vala.CCodeGenerator : CodeGenerator {
                if (stmt.collection.value_type is ArrayType) {
                        var array_type = (ArrayType) stmt.collection.value_type;
                        
-                       var array_len = get_array_length_cexpression (stmt.collection);
+                       var array_len = head.get_array_length_cexpression (stmt.collection);
 
                        // store array length for use by _vala_array_free
                        var clendecl = new CCodeDeclaration ("int");
-                       clendecl.add_declarator (new CCodeVariableDeclarator.with_initializer (get_array_length_cname (collection_backup.name, 1), array_len));
+                       clendecl.add_declarator (new CCodeVariableDeclarator.with_initializer (head.get_array_length_cname (collection_backup.name, 1), array_len));
                        cblock.add_statement (clendecl);
 
                        if (array_len is CCodeConstant) {
@@ -2616,8 +2616,8 @@ public class Vala.CCodeGenerator : CodeGenerator {
                                var array_type = (ArrayType) current_return_type;
 
                                for (int dim = 1; dim <= array_type.rank; dim++) {
-                                       var len_l = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeIdentifier (get_array_length_cname ("result", dim)));
-                                       var len_r = get_array_length_cexpression (stmt.return_expression, dim);
+                                       var len_l = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeIdentifier (head.get_array_length_cname ("result", dim)));
+                                       var len_r = head.get_array_length_cexpression (stmt.return_expression, dim);
                                        ccomma.append_expression (new CCodeAssignment (len_l, len_r));
                                }
 
@@ -2847,132 +2847,6 @@ public class Vala.CCodeGenerator : CodeGenerator {
        public override void visit_invocation_expression (InvocationExpression expr) {
                head.visit_invocation_expression (expr);
        }
-
-       public string get_array_length_cname (string array_cname, int dim) {
-               return "%s_length%d".printf (array_cname, dim);
-       }
-
-       public CCodeExpression get_array_length_cexpression (Expression array_expr, int dim = -1) {
-               // dim == -1 => total size over all dimensions
-               if (dim == -1) {
-                       var array_type = array_expr.value_type as ArrayType;
-                       if (array_type != null && array_type.rank > 1) {
-                               CCodeExpression cexpr = get_array_length_cexpression (array_expr, 1);
-                               for (dim = 2; dim <= array_type.rank; dim++) {
-                                       cexpr = new CCodeBinaryExpression (CCodeBinaryOperator.MUL, cexpr, get_array_length_cexpression (array_expr, dim));
-                               }
-                               return cexpr;
-                       } else {
-                               dim = 1;
-                       }
-               }
-
-               bool is_out = false;
-
-               if (array_expr is UnaryExpression) {
-                       var unary_expr = (UnaryExpression) array_expr;
-                       if (unary_expr.operator == UnaryOperator.OUT || unary_expr.operator == UnaryOperator.REF) {
-                               array_expr = unary_expr.inner;
-                               is_out = true;
-                       }
-               } else if (array_expr is ReferenceTransferExpression) {
-                       var reftransfer_expr = (ReferenceTransferExpression) array_expr;
-                       array_expr = reftransfer_expr.inner;
-               }
-               
-               if (array_expr is ArrayCreationExpression) {
-                       Gee.List<Expression> size = ((ArrayCreationExpression) array_expr).get_sizes ();
-                       var length_expr = size[dim - 1];
-                       return (CCodeExpression) get_ccodenode (length_expr);
-               } else if (array_expr is InvocationExpression) {
-                       var invocation_expr = (InvocationExpression) array_expr;
-                       Gee.List<CCodeExpression> size = invocation_expr.get_array_sizes ();
-                       return size[dim - 1];
-               } else if (array_expr.symbol_reference != null) {
-                       if (array_expr.symbol_reference is FormalParameter) {
-                               var param = (FormalParameter) array_expr.symbol_reference;
-                               if (!param.no_array_length) {
-                                       CCodeExpression length_expr = new CCodeIdentifier (get_array_length_cname (param.name, dim));
-                                       if (param.direction != ParameterDirection.IN) {
-                                               // accessing argument of out/ref param
-                                               length_expr = new CCodeParenthesizedExpression (new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, length_expr));
-                                       }
-                                       if (is_out) {
-                                               // passing array as out/ref
-                                               return new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, length_expr);
-                                       } else {
-                                               return length_expr;
-                                       }
-                               }
-                       } else if (array_expr.symbol_reference is LocalVariable) {
-                               var local = (LocalVariable) array_expr.symbol_reference;
-                               var length_expr = new CCodeIdentifier (get_array_length_cname (local.name, dim));
-                               if (is_out) {
-                                       return new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, length_expr);
-                               } else {
-                                       return length_expr;
-                               }
-                       } else if (array_expr.symbol_reference is Field) {
-                               var field = (Field) array_expr.symbol_reference;
-                               if (!field.no_array_length) {
-                                       var ma = (MemberAccess) array_expr;
-
-                                       CCodeExpression length_expr = null;
-
-                                       if (field.binding == MemberBinding.INSTANCE) {
-                                               TypeSymbol base_type = null;
-                                               if (ma.inner.value_type != null) {
-                                                       base_type = ma.inner.value_type.data_type;
-                                               }
-
-                                               var length_cname = get_array_length_cname (field.name, dim);
-                                               var instance_expression_type = get_data_type_for_symbol (base_type);
-                                               var instance_target_type = get_data_type_for_symbol ((TypeSymbol) field.parent_symbol);
-                                               CCodeExpression typed_inst = (CCodeExpression) get_ccodenode (ma.inner);
-
-                                               CCodeExpression inst;
-                                               if (field.access == SymbolAccessibility.PRIVATE) {
-                                                       inst = new CCodeMemberAccess.pointer (typed_inst, "priv");
-                                               } else {
-                                                       inst = typed_inst;
-                                               }
-                                               if (((TypeSymbol) field.parent_symbol).is_reference_type ()) {
-                                                       length_expr = new CCodeMemberAccess.pointer (inst, length_cname);
-                                               } else {
-                                                       length_expr = new CCodeMemberAccess (inst, length_cname);
-                                               }
-                                       } else {
-                                               length_expr = new CCodeIdentifier (get_array_length_cname (field.get_cname (), dim));
-                                       }
-
-                                       if (is_out) {
-                                               return new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, length_expr);
-                                       } else {
-                                               return length_expr;
-                                       }
-                               }
-                       } else if (array_expr.symbol_reference is Constant) {
-                               var constant = (Constant) array_expr.symbol_reference;
-                               var ccall = new CCodeFunctionCall (new CCodeIdentifier ("G_N_ELEMENTS"));
-                               ccall.add_argument (new CCodeIdentifier (constant.get_cname ()));
-                               return ccall;
-                       }
-               } else if (array_expr is NullLiteral) {
-                       return new CCodeConstant ("0");
-               }
-
-               if (!is_out) {
-                       /* allow arrays with unknown length even for value types
-                        * as else it may be impossible to bind some libraries
-                        * users of affected libraries should explicitly set
-                        * the array length as early as possible
-                        * by setting the virtual length field of the array
-                        */
-                       return new CCodeConstant ("-1");
-               } else {
-                       return new CCodeConstant ("NULL");
-               }
-       }
        
        public string get_delegate_target_cname (string delegate_cname) {
                return "%s_target".printf (delegate_cname);
@@ -3237,10 +3111,10 @@ public class Vala.CCodeGenerator : CodeGenerator {
                                CCodeExpression csizeexpr = null;
                                for (int dim = 1; dim <= array_type.rank; dim++) {
                                        if (first) {
-                                               csizeexpr = get_array_length_cexpression (expr, dim);
+                                               csizeexpr = head.get_array_length_cexpression (expr, dim);
                                                first = false;
                                        } else {
-                                               csizeexpr = new CCodeBinaryExpression (CCodeBinaryOperator.MUL, csizeexpr, get_array_length_cexpression (expr, dim));
+                                               csizeexpr = new CCodeBinaryExpression (CCodeBinaryOperator.MUL, csizeexpr, head.get_array_length_cexpression (expr, dim));
                                        }
                                }
 
@@ -3357,7 +3231,7 @@ public class Vala.CCodeGenerator : CodeGenerator {
                                                if (!param.no_array_length && param.parameter_type is ArrayType) {
                                                        var array_type = (ArrayType) param.parameter_type;
                                                        for (int dim = 1; dim <= array_type.rank; dim++) {
-                                                               carg_map.set (get_param_pos (param.carray_length_parameter_position + 0.01 * dim), get_array_length_cexpression (arg, dim));
+                                                               carg_map.set (get_param_pos (param.carray_length_parameter_position + 0.01 * dim), head.get_array_length_cexpression (arg, dim));
                                                        }
                                                } else if (param.parameter_type is DelegateType) {
                                                        var deleg_type = (DelegateType) param.parameter_type;
@@ -3879,9 +3753,9 @@ public class Vala.CCodeGenerator : CodeGenerator {
                                        var ccomma = new CCodeCommaExpression ();
                                        ccomma.append_expression (cexpr);
                                        for (int dim = 1; dim <= array_type.rank; dim++) {
-                                               var len_decl = new LocalVariable (int_type.copy (), get_array_length_cname (decl.name, dim));
+                                               var len_decl = new LocalVariable (int_type.copy (), head.get_array_length_cname (decl.name, dim));
                                                temp_vars.insert (0, len_decl);
-                                               ccomma.append_expression (new CCodeAssignment (new CCodeIdentifier (get_variable_cname (len_decl.name)), get_array_length_cexpression (expr, dim)));
+                                               ccomma.append_expression (new CCodeAssignment (new CCodeIdentifier (get_variable_cname (len_decl.name)), head.get_array_length_cexpression (expr, dim)));
                                        }
                                        ccomma.append_expression (new CCodeIdentifier (get_variable_cname (decl.name)));
                                        cexpr = ccomma;
@@ -4032,7 +3906,7 @@ public class Vala.CCodeGenerator : CodeGenerator {
                                }
                                
                                for (int dim = 1; dim <= array_type.rank; dim++) {
-                                       var cparam = new CCodeFormalParameter (get_array_length_cname (param.name, dim), length_ctype);
+                                       var cparam = new CCodeFormalParameter (head.get_array_length_cname (param.name, dim), length_ctype);
                                        cparam_map.set (get_param_pos (param.carray_length_parameter_position + 0.01 * dim), cparam);
                                }
                        }
@@ -4092,7 +3966,7 @@ public class Vala.CCodeGenerator : CodeGenerator {
                                        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 (head.get_array_length_cname (d_params.get (i).name, dim));
                                        }
                                        carg_map.set (get_param_pos (param.carray_length_parameter_position + 0.01 * dim), clength);
                                }
index 10a3f0b2c2e32890f52d9d06409c92b18818f1b2..2b044cf510be9ee39e0b622b8f3bbaa7e05ba936 100644 (file)
@@ -179,7 +179,7 @@ public class Vala.CCodeInvocationExpressionModule : CCodeModule {
                                        if (!param.no_array_length && param.parameter_type is ArrayType) {
                                                var array_type = (ArrayType) param.parameter_type;
                                                for (int dim = 1; dim <= array_type.rank; dim++) {
-                                                       carg_map.set (codegen.get_param_pos (param.carray_length_parameter_position + 0.01 * dim), codegen.get_array_length_cexpression (arg, dim));
+                                                       carg_map.set (codegen.get_param_pos (param.carray_length_parameter_position + 0.01 * dim), head.get_array_length_cexpression (arg, dim));
                                                }
                                                multiple_cargs = true;
                                        } else if (param.parameter_type is DelegateType) {
@@ -322,7 +322,7 @@ public class Vala.CCodeInvocationExpressionModule : CCodeModule {
                            param.parameter_type is ArrayType) {
                                var array_type = (ArrayType) param.parameter_type;
                                for (int dim = 1; dim <= array_type.rank; dim++) {
-                                       carg_map.set (codegen.get_param_pos (param.carray_length_parameter_position + 0.01 * dim), codegen.get_array_length_cexpression (param.default_expression, dim));
+                                       carg_map.set (codegen.get_param_pos (param.carray_length_parameter_position + 0.01 * dim), head.get_array_length_cexpression (param.default_expression, dim));
                                }
                        }
 
@@ -445,7 +445,7 @@ public class Vala.CCodeInvocationExpressionModule : CCodeModule {
                        /* memset needs string.h */
                        codegen.string_h_needed = true;
 
-                       var clen = codegen.get_array_length_cexpression (ma.inner, 1);
+                       var clen = head.get_array_length_cexpression (ma.inner, 1);
                        var celems = (CCodeExpression) ma.inner.ccodenode;
                        var array_type = (ArrayType) ma.inner.value_type;
                        var csizeof = new CCodeIdentifier ("sizeof (%s)".printf (array_type.element_type.get_cname ()));
@@ -461,7 +461,7 @@ public class Vala.CCodeInvocationExpressionModule : CCodeModule {
                        ccomma.append_expression (new CCodeAssignment (temp_ref, new_size));
                        ccomma.append_expression ((CCodeExpression) expr.ccodenode);
                        ccomma.append_expression (new CCodeConditionalExpression (ccheck, czero, new CCodeConstant ("NULL")));
-                       ccomma.append_expression (new CCodeAssignment (codegen.get_array_length_cexpression (ma.inner, 1), temp_ref));
+                       ccomma.append_expression (new CCodeAssignment (head.get_array_length_cexpression (ma.inner, 1), temp_ref));
 
                        expr.ccodenode = ccomma;
                } else if (m == codegen.substring_method) {
index 91e8366df22a2a634cd59e0270c6c4142b502be8..dbc3f05aba7b055b1a34b24475341df6e5a2ca57 100644 (file)
@@ -74,7 +74,7 @@ public class Vala.CCodeMemberAccessModule : CCodeModule {
                                expr.ccodenode = new CCodeIdentifier (m.get_cname ());
                        }
                } else if (expr.symbol_reference is ArrayLengthField) {
-                       expr.ccodenode = codegen.get_array_length_cexpression (expr.inner, 1);
+                       expr.ccodenode = head.get_array_length_cexpression (expr.inner, 1);
                } else if (expr.symbol_reference is Field) {
                        var f = (Field) expr.symbol_reference;
                        if (f.binding == MemberBinding.INSTANCE) {
index 14cb9b16c70f6b961e262fb92a38c79df92b0278..ea23d76590d08703ed6d860249bfcc3417e8cc00 100644 (file)
@@ -645,7 +645,7 @@ public class Vala.CCodeMethodModule : CCodeModule {
                                }
                                
                                for (int dim = 1; dim <= array_type.rank; dim++) {
-                                       var cparam = new CCodeFormalParameter (codegen.get_array_length_cname (param.name, dim), length_ctype);
+                                       var cparam = new CCodeFormalParameter (head.get_array_length_cname (param.name, dim), length_ctype);
                                        cparam_map.set (codegen.get_param_pos (param.carray_length_parameter_position + 0.01 * dim), cparam);
                                        if (carg_map != null) {
                                                carg_map.set (codegen.get_param_pos (param.carray_length_parameter_position + 0.01 * dim), new CCodeIdentifier (cparam.name));
@@ -689,7 +689,7 @@ public class Vala.CCodeMethodModule : CCodeModule {
                        var array_type = (ArrayType) creturn_type;
 
                        for (int dim = 1; dim <= array_type.rank; dim++) {
-                               var cparam = new CCodeFormalParameter (codegen.get_array_length_cname ("result", dim), "int*");
+                               var cparam = new CCodeFormalParameter (head.get_array_length_cname ("result", dim), "int*");
                                cparam_map.set (codegen.get_param_pos (m.carray_length_parameter_position + 0.01 * dim), cparam);
                                if (carg_map != null) {
                                        carg_map.set (codegen.get_param_pos (m.carray_length_parameter_position + 0.01 * dim), new CCodeIdentifier (cparam.name));
index 8bd8c1bf68f4d21f7e85bcf5489277edbe527817..1029c299b99ccd45273be070b88cd70b1b544955 100644 (file)
@@ -163,4 +163,12 @@ public abstract class Vala.CCodeModule {
        public virtual string get_marshaller_function (Gee.List<FormalParameter> params, DataType return_type, string? prefix = null, bool dbus = false) {
                return next.get_marshaller_function (params, return_type, prefix, dbus);
        }
+
+       public virtual string get_array_length_cname (string array_cname, int dim) {
+               return next.get_array_length_cname (array_cname, dim);
+       }
+
+       public virtual CCodeExpression get_array_length_cexpression (Expression array_expr, int dim = -1) {
+               return next.get_array_length_cexpression (array_expr, dim);
+       }
 }
index 51e51927f9fb4804f91487258ea145b02566f800..bed92bdc154dd596cb0c6e47b90699a20cf6328d 100644 (file)
@@ -211,7 +211,7 @@ public class Vala.DBusModule : CCodeModule {
                                                cdecl = new CCodeDeclaration ("GPtrArray*");
 
                                                array_construct = new CCodeFunctionCall (new CCodeIdentifier ("g_ptr_array_sized_new"));
-                                               array_construct.add_argument (new CCodeIdentifier (codegen.get_array_length_cname (param.name, 1)));
+                                               array_construct.add_argument (new CCodeIdentifier (head.get_array_length_cname (param.name, 1)));
                                        } else {
                                                cdecl = new CCodeDeclaration ("GArray*");
 
@@ -228,16 +228,16 @@ public class Vala.DBusModule : CCodeModule {
                                                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 (codegen.get_array_length_cname (param.name, 1)), sizeof_call));
+                                               memcpy_call.add_argument (new CCodeBinaryExpression (CCodeBinaryOperator.MUL, new CCodeIdentifier (head.get_array_length_cname (param.name, 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 (codegen.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 (head.get_array_length_cname (param.name, 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 (codegen.get_array_length_cname (param.name, 1)));
+                                               cappend_call.add_argument (new CCodeIdentifier (head.get_array_length_cname (param.name, 1)));
                                                block.add_statement (new CCodeExpressionStatement (cappend_call));
                                        }