[vala] codegen: handle out param of null-terminated array



commit e7be2626460c5de651df8f3bde7ead718d7b31aa
Author: Luca Bruno <lucabru src gnome org>
Date:   Wed Mar 4 14:57:01 2015 +0100

    codegen: handle out param of null-terminated array
    
    Fixes bug 743877

 codegen/valaccodemethodcallmodule.vala |   13 ++++++++++++-
 tests/Makefile.am                      |    1 +
 tests/methods/bug743877.vala           |   11 +++++++++++
 3 files changed, 24 insertions(+), 1 deletions(-)
---
diff --git a/codegen/valaccodemethodcallmodule.vala b/codegen/valaccodemethodcallmodule.vala
index 728dccd..8e923ea 100644
--- a/codegen/valaccodemethodcallmodule.vala
+++ b/codegen/valaccodemethodcallmodule.vala
@@ -800,8 +800,10 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
 
                params_it = params.iterator ();
                foreach (Expression arg in expr.get_argument_list ()) {
+                       Parameter param = null;
+                       
                        if (params_it.next ()) {
-                               var param = params_it.get ();
+                               param = params_it.get ();
                                if (param.params_array || param.ellipsis) {
                                        // ignore ellipsis arguments as we currently don't use temporary 
variables for them
                                        break;
@@ -820,6 +822,15 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
 
                        // assign new value
                        store_value (unary.inner.target_value, transform_value (unary.target_value, 
unary.inner.value_type, arg));
+
+                       // handle out null terminated arrays
+                       if (param != null && get_ccode_array_null_terminated (param)) {
+                               requires_array_length = true;
+                               var len_call = new CCodeFunctionCall (new CCodeIdentifier 
("_vala_array_length"));
+                               len_call.add_argument (get_cvalue_ (unary.inner.target_value));
+                               
+                               ccode.add_assignment (get_array_length_cvalue (unary.inner.target_value, 1), 
len_call);
+                       }
                }
 
                if (m is CreationMethod && m.parent_symbol is Class && current_class.base_class == 
gsource_type) {
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 73fe7e3..32026c8 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -68,6 +68,7 @@ TESTS = \
        methods/bug726347.vala \
        methods/bug736235.vala \
        methods/bug737222.vala \
+       methods/bug743877.vala \
        methods/generics.vala \
        control-flow/break.vala \
        control-flow/expressions-conditional.vala \
diff --git a/tests/methods/bug743877.vala b/tests/methods/bug743877.vala
new file mode 100644
index 0000000..9049724
--- /dev/null
+++ b/tests/methods/bug743877.vala
@@ -0,0 +1,11 @@
+void main () {
+       Intl.setlocale ();
+
+       string input_str = "Álvaro";
+       string[] alternates;
+       var tokens = input_str.tokenize_and_fold (null, out alternates);
+
+       assert ("álvaro" in tokens);
+       assert ("alvaro" in alternates);
+}
+


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]