From: Jürg Billeter Date: Sun, 4 Jan 2009 16:15:41 +0000 (+0000) Subject: Support [CCode (array_null_terminated = true)] attribute to fix length X-Git-Tag: VALA_0_5_4~24 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=747374e590c40cd787ea7aabd30d7f6a17b46e66;p=thirdparty%2Fvala.git Support [CCode (array_null_terminated = true)] attribute to fix length 2009-01-04 Jürg Billeter * 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 --- diff --git a/ChangeLog b/ChangeLog index 98afee725..a95e93331 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2009-01-04 Jürg Billeter + + * 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 * vapi/cairo.vapi: diff --git a/gobject/valaccodearraymodule.vala b/gobject/valaccodearraymodule.vala index 87bb54959..3ed987902 100644 --- a/gobject/valaccodearraymodule.vala +++ b/gobject/valaccodearraymodule.vala @@ -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; diff --git a/gobject/valaccodemethodcallmodule.vala b/gobject/valaccodemethodcallmodule.vala index 4bb7a9892..10173f2e8 100644 --- a/gobject/valaccodemethodcallmodule.vala +++ b/gobject/valaccodemethodcallmodule.vala @@ -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); diff --git a/vala/valadelegate.vala b/vala/valadelegate.vala index 1cde204e5..467911c5e 100644 --- a/vala/valadelegate.vala +++ b/vala/valadelegate.vala @@ -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 type_parameters = new ArrayList (); private Gee.List parameters = new ArrayList (); @@ -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"); } diff --git a/vala/valafield.vala b/vala/valafield.vala index 5ff232de0..d678e6b2a 100644 --- a/vala/valafield.vala +++ b/vala/valafield.vala @@ -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")); } diff --git a/vala/valaformalparameter.vala b/vala/valaformalparameter.vala index bb5f5053d..b22e5d219 100644 --- a/vala/valaformalparameter.vala +++ b/vala/valaformalparameter.vala @@ -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"); } diff --git a/vala/valamethod.vala b/vala/valamethod.vala index cd37a4c5c..c2037703a 100644 --- a/vala/valamethod.vala +++ b/vala/valamethod.vala @@ -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"); } diff --git a/vapi/glib-2.0.vapi b/vapi/glib-2.0.vapi index 67e76c724..5221023da 100644 --- a/vapi/glib-2.0.vapi +++ b/vapi/glib-2.0.vapi @@ -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)]