]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Reset outdated array _size_ variable after use as ref parameter
authorRico Tzschichholz <ricotz@ubuntu.com>
Thu, 12 Mar 2020 18:19:19 +0000 (19:19 +0100)
committerRico Tzschichholz <ricotz@ubuntu.com>
Tue, 24 Mar 2020 08:50:25 +0000 (09:50 +0100)
Fixes https://gitlab.gnome.org/GNOME/vala/issues/929

codegen/valaccodemethodcallmodule.vala
tests/Makefile.am
tests/methods/parameter-ref-array-resize.vala [new file with mode: 0644]

index 36b8ec63b32eb1e048d050e5d859ee2cd4baa80b..2160125942a8ff270d162f35224e508bbf2666e4 100644 (file)
@@ -866,6 +866,20 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
                        }
 
                        var unary = arg as UnaryExpression;
+
+                       // update possible stale _*_size_ variable
+                       if (unary != null && unary.operator == UnaryOperator.REF) {
+                               if (get_ccode_array_length (param) && param.variable_type is ArrayType
+                                   && !((ArrayType) param.variable_type).fixed_length && ((ArrayType) param.variable_type).rank == 1) {
+                                       unowned Symbol? array_var = unary.inner.symbol_reference;
+                                       unowned LocalVariable? array_local = array_var as LocalVariable;
+                                       if (array_var != null && array_var.is_internal_symbol ()
+                                           && ((array_local != null && !array_local.captured) || array_var is Field)) {
+                                               ccode.add_assignment (get_array_size_cvalue (unary.inner.target_value), get_array_length_cvalue (unary.inner.target_value, 1));
+                                       }
+                               }
+                       }
+
                        if (unary == null || unary.operator != UnaryOperator.OUT) {
                                continue;
                        }
index 1b988cad17c25ac019f81e048b90e1b89362a1ae..41228de6b7db41996ea9150faf10f1fb3811e815 100644 (file)
@@ -118,6 +118,7 @@ TESTS = \
        methods/contains.vala \
        methods/extern.vala \
        methods/iterator.vala \
+       methods/parameter-ref-array-resize.vala \
        methods/prepostconditions.vala \
        methods/same-name.vala \
        methods/symbolresolution.vala \
diff --git a/tests/methods/parameter-ref-array-resize.vala b/tests/methods/parameter-ref-array-resize.vala
new file mode 100644 (file)
index 0000000..ffe27d3
--- /dev/null
@@ -0,0 +1,11 @@
+void foo (ref int[] a) {
+       a = new int[1];
+}
+
+void main() {
+       int[] a = new int[10 * 1024 * 1024];
+       foo (ref a);
+       for (int i = 1; i < 10 * 1024 * 1024; i++) {
+               a += 4711;
+       }
+}