]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Support [CCode (array_null_terminated = true)] attribute to fix length
authorJürg Billeter <j@bitron.ch>
Sun, 4 Jan 2009 16:15:41 +0000 (16:15 +0000)
committerJürg Billeter <juergbi@src.gnome.org>
Sun, 4 Jan 2009 16:15:41 +0000 (16:15 +0000)
2009-01-04  Jürg Billeter  <j@bitron.ch>

* vala/valadelegate.vala:
* vala/valafield.vala:
* vala/valaformalparameter.vala:
* vala/valamethod.vala:
* gobject/valaccodearraymodule.vala:
* gobject/valaccodemethodcallmodule.vala:

Support [CCode (array_null_terminated = true)] attribute to fix
length handling of null terminated arrays, fixes bug 514186

* vapi/glib-2.0.vapi:

Fix g_strsplit binding

svn path=/trunk/; revision=2267

ChangeLog
gobject/valaccodearraymodule.vala
gobject/valaccodemethodcallmodule.vala
vala/valadelegate.vala
vala/valafield.vala
vala/valaformalparameter.vala
vala/valamethod.vala
vapi/glib-2.0.vapi

index 98afee72579033a64e04967896c54ddb9f6dbbca..a95e933319b3fc4ebafbea86e837ba85b147e897 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+2009-01-04  Jürg Billeter  <j@bitron.ch>
+
+       * vala/valadelegate.vala:
+       * vala/valafield.vala:
+       * vala/valaformalparameter.vala:
+       * vala/valamethod.vala:
+       * gobject/valaccodearraymodule.vala:
+       * gobject/valaccodemethodcallmodule.vala:
+
+       Support [CCode (array_null_terminated = true)] attribute to fix
+       length handling of null terminated arrays, fixes bug 514186
+
+       * vapi/glib-2.0.vapi:
+
+       Fix g_strsplit binding
+
 2009-01-04  Jürg Billeter  <j@bitron.ch>
 
        * vapi/cairo.vapi:
index 87bb549595142d6801422d8f47bb52d4e73ed8cf..3ed9879028a57174fbfadba5385bb213749be938 100644 (file)
@@ -141,7 +141,12 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                } 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) {
+                               if (param.array_null_terminated) {
+                                       var carray_expr = get_variable_cexpression (param.name);
+                                       var len_call = new CCodeFunctionCall (new CCodeIdentifier ("g_strv_length"));
+                                       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 (param.name, dim));
                                        if (param.direction != ParameterDirection.IN) {
                                                // accessing argument of out/ref param
@@ -164,7 +169,12 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule {
                                }
                        } else if (array_expr.symbol_reference is Field) {
                                var field = (Field) array_expr.symbol_reference;
-                               if (!field.no_array_length) {
+                               if (field.array_null_terminated) {
+                                       var carray_expr = (CCodeExpression) array_expr.ccodenode;
+                                       var len_call = new CCodeFunctionCall (new CCodeIdentifier ("g_strv_length"));
+                                       len_call.add_argument (carray_expr);
+                                       return len_call;
+                               } else if (!field.no_array_length) {
                                        var ma = (MemberAccess) array_expr;
 
                                        CCodeExpression length_expr = null;
index 4bb7a989205462b8b81a252af782f4bf2426d49b..10173f2e84346d2941b48b5f23bff8e6d19efe86 100644 (file)
@@ -1,6 +1,7 @@
 /* valaccodemethodcallmodule.vala
  *
- * Copyright (C) 2006-2008  Jürg Billeter, Raffaele Sandrini
+ * Copyright (C) 2006-2009  Jürg Billeter
+ * Copyright (C) 2006-2008  Raffaele Sandrini
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -361,7 +362,20 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
                if (m != null && m.return_type is ArrayType) {
                        var array_type = (ArrayType) m.return_type;
                        for (int dim = 1; dim <= array_type.rank; dim++) {
-                               if (!m.no_array_length) {
+                               if (m.array_null_terminated) {
+                                       // handle calls to methods returning null-terminated arrays
+                                       var temp_var = get_temp_variable (itype.get_return_type ());
+                                       var temp_ref = get_variable_cexpression (temp_var.name);
+
+                                       temp_vars.insert (0, temp_var);
+
+                                       ccall_expr = new CCodeAssignment (temp_ref, ccall_expr);
+
+                                       var len_call = new CCodeFunctionCall (new CCodeIdentifier ("g_strv_length"));
+                                       len_call.add_argument (temp_ref);
+
+                                       expr.append_array_size (len_call);
+                               } else if (!m.no_array_length) {
                                        var temp_var = get_temp_variable (int_type);
                                        var temp_ref = get_variable_cexpression (temp_var.name);
 
index 1cde204e52f6ea3d721649070ed3ecdbd0b752a5..467911c5e6eb67cb13d2c10a73878ed28c060ca3 100644 (file)
@@ -68,6 +68,11 @@ public class Vala.Delegate : TypeSymbol {
         */
        public bool no_array_length { get; set; }
 
+       /**
+        * Specifies whether the array is null terminated.
+        */
+       public bool array_null_terminated { get; set; }
+
        private Gee.List<TypeParameter> type_parameters = new ArrayList<TypeParameter> ();
 
        private Gee.List<FormalParameter> parameters = new ArrayList<FormalParameter> ();
@@ -216,6 +221,9 @@ public class Vala.Delegate : TypeSymbol {
                if (a.has_argument ("array_length")) {
                        no_array_length = !a.get_bool ("array_length");
                }
+               if (a.has_argument ("array_null_terminated")) {
+                       array_null_terminated = a.get_bool ("array_null_terminated");
+               }
                if (a.has_argument ("array_length_pos")) {
                        carray_length_parameter_position = a.get_double ("array_length_pos");
                }
index 5ff232de0c901ffb4b8c013da1969d633aa48db3..d678e6b2a2bded536d8705cdd86304238d18297b 100644 (file)
@@ -69,6 +69,11 @@ public class Vala.Field : Member, Lockable {
         */
        public bool no_array_length { get; set; }
 
+       /**
+        * Specifies whether the array is null terminated.
+        */
+       public bool array_null_terminated { get; set; }
+
        /**
         * Specifies whether the array length field uses a custom name in C.
         */
@@ -181,6 +186,9 @@ public class Vala.Field : Member, Lockable {
                if (a.has_argument ("array_length")) {
                        no_array_length = !a.get_bool ("array_length");
                }
+               if (a.has_argument ("array_null_terminated")) {
+                       array_null_terminated = a.get_bool ("array_null_terminated");
+               }
                if (a.has_argument ("array_length_cname")) {
                        set_array_length_cname (a.get_string ("array_length_cname"));
                }
index bb5f5053dc744541317e12811c2226289e8204b8..b22e5d21942fa555136d6495b143d4cef7780470 100644 (file)
@@ -66,6 +66,11 @@ public class Vala.FormalParameter : Symbol {
         */
        public bool no_array_length { get; set; }
 
+       /**
+        * Specifies whether the array is null terminated.
+        */
+       public bool array_null_terminated { get; set; }
+
        /**
         * Specifies the position of the parameter in the C function.
         */
@@ -143,6 +148,9 @@ public class Vala.FormalParameter : Symbol {
                if (a.has_argument ("array_length")) {
                        no_array_length = !a.get_bool ("array_length");
                }
+               if (a.has_argument ("array_null_terminated")) {
+                       array_null_terminated = a.get_bool ("array_null_terminated");
+               }
                if (a.has_argument ("array_length_pos")) {
                        carray_length_parameter_position = a.get_double ("array_length_pos");
                }
index cd37a4c5c81c181d3b5952f58aabf8e9583bb29d..c2037703acc02265528f65fe69c046b823acb150 100644 (file)
@@ -182,6 +182,11 @@ public class Vala.Method : Member {
         */
        public bool no_array_length { get; set; }
 
+       /**
+        * Specifies whether the array is null terminated.
+        */
+       public bool array_null_terminated { get; set; }
+
        /**
         * Specifies whether this method expects printf-style format arguments.
         */
@@ -365,6 +370,9 @@ public class Vala.Method : Member {
                if (a.has_argument ("array_length")) {
                        no_array_length = !a.get_bool ("array_length");
                }
+               if (a.has_argument ("array_null_terminated")) {
+                       array_null_terminated = a.get_bool ("array_null_terminated");
+               }
                if (a.has_argument ("array_length_pos")) {
                        carray_length_parameter_position = a.get_double ("array_length_pos");
                }
index 67e76c7241e60b381549c0341fd075dff77ed655..5221023dae4fb014253557084880495c87c42e5b 100644 (file)
@@ -717,7 +717,7 @@ public class string {
        public string escape (string exceptions);
        [CCode (cname = "g_strcompress")]
        public string compress ();
-       [CCode (cname = "g_strsplit", array_length = false)]
+       [CCode (cname = "g_strsplit", array_length = false, array_null_terminated = true)]
        [NoArrayLength]
        public string[] split (string delimiter, int max_tokens = 0);
        [CCode (cname = "g_strsplit_set", array_length = false)]