]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
codegen: Update outdated array _size_ variable of captured local-variable
authorRico Tzschichholz <ricotz@ubuntu.com>
Thu, 22 Oct 2020 19:22:15 +0000 (21:22 +0200)
committerRico Tzschichholz <ricotz@ubuntu.com>
Sun, 3 Jan 2021 11:52:23 +0000 (12:52 +0100)
Fixes https://gitlab.gnome.org/GNOME/vala/issues/1090

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

index 40829730c451aa03cf2e4f7c4e4c294199d27afd..b3edf930821927334b6b8cfe4b3ebadcae72b3cb 100644 (file)
@@ -815,9 +815,8 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
                        ccode.add_assignment (get_array_length_cexpression (ma.inner, 1), temp_ref);
 
                        var array_var = ma.inner.symbol_reference;
-                       var array_local = array_var as LocalVariable;
                        if (array_var != null && array_var.is_internal_symbol ()
-                           && ((array_var is LocalVariable && !array_local.captured) || array_var is Field)) {
+                           && (array_var is LocalVariable || array_var is Field)) {
                                ccode.add_assignment (get_array_size_cvalue (ma.inner.target_value), temp_ref);
                        }
 
@@ -881,9 +880,8 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
                                if (param != null && 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)) {
+                                           && (array_var is LocalVariable || array_var is Field)) {
                                                ccode.add_assignment (get_array_size_cvalue (unary.inner.target_value), get_array_length_cvalue (unary.inner.target_value, 1));
                                        }
                                }
index a2f37571646aaff1f288e39398081eda466f6441..18560b63bd36666cdad89d92d322a52c1310bc63 100644 (file)
@@ -94,6 +94,8 @@ TESTS = \
        arrays/struct-field-initializer.vala \
        arrays/struct-namespaced-initializer.vala \
        arrays/resize.vala \
+       arrays/resize-local-size.vala \
+       arrays/resize-local-size-captured.vala \
        arrays/resize-unowned-invalid.test \
        arrays/resize-unowned-invalid-2.test \
        arrays/resize-unowned-invalid-3.test \
@@ -127,6 +129,7 @@ TESTS = \
        methods/iterator.vala \
        methods/parameter-fixed-array-initializer.vala \
        methods/parameter-ref-array-resize.vala \
+       methods/parameter-ref-array-resize-captured.vala \
        methods/prepostconditions.vala \
        methods/prepostconditions-captured.vala \
        methods/postconditions.vala \
diff --git a/tests/arrays/resize-local-size-captured.vala b/tests/arrays/resize-local-size-captured.vala
new file mode 100644 (file)
index 0000000..6e23d71
--- /dev/null
@@ -0,0 +1,14 @@
+delegate void FooFunc ();
+
+void main () {
+       int[] a = new int[10 * 1024 * 1024];
+
+       FooFunc func = () => {
+               a.resize (1);
+       };
+       func ();
+
+       for (int i = 1; i < 10 * 1024 * 1024; i++) {
+               a += 4711;
+       }
+}
diff --git a/tests/arrays/resize-local-size.vala b/tests/arrays/resize-local-size.vala
new file mode 100644 (file)
index 0000000..0552201
--- /dev/null
@@ -0,0 +1,9 @@
+void main() {
+       int[] a = new int[10 * 1024 * 1024];
+
+       a.resize (1);
+
+       for (int i = 1; i < 10 * 1024 * 1024; i++) {
+               a += 4711;
+       }
+}
diff --git a/tests/methods/parameter-ref-array-resize-captured.vala b/tests/methods/parameter-ref-array-resize-captured.vala
new file mode 100644 (file)
index 0000000..19fd639
--- /dev/null
@@ -0,0 +1,18 @@
+delegate void FooFunc ();
+
+void foo (ref int[] a) {
+       a = new int[1];
+}
+
+void main() {
+       int[] a = new int[10 * 1024 * 1024];
+
+       FooFunc func = () => {
+               foo (ref a);
+       };
+       func ();
+
+       for (int i = 1; i < 10 * 1024 * 1024; i++) {
+               a += 4711;
+       }
+}