]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
Handle unowned arrays
authorVladyslav Stovmanenko <flaviusglamfenix@gmail.com>
Sat, 7 May 2022 19:31:36 +0000 (19:31 +0000)
committerRico Tzschichholz <ricotz@ubuntu.com>
Mon, 15 Aug 2022 18:53:20 +0000 (18:53 +0000)
codegen/valaccodemethodcallmodule.vala
tests/basic-types/arrays-move-with-class.vala

index 4c6ecf069cdddbd759df7b1dbfd2a9fd7227178f..2b4a6d66f0bf0f8061302a42bbac824474811bdd 100644 (file)
@@ -338,7 +338,12 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
                        csizeof.add_argument (new CCodeIdentifier (get_ccode_name (array_type.element_type)));
                        in_arg_map.set (get_param_pos (0.1), csizeof);
 
-                       in_arg_map.set (get_param_pos (0.2), get_destroy_func_expression(array_type.element_type));
+                       CCodeExpression? free_func_expr = new CCodeIdentifier("NULL");
+                       if (array_type.element_type.value_owned) {
+                               free_func_expr = get_destroy_func_expression(array_type.element_type);
+                       }
+
+                       in_arg_map.set (get_param_pos (0.2), free_func_expr);
                } else if (m is DynamicMethod) {
                        emit_context.push_symbol (m);
                        m.clear_parameters ();
index 4a6525703f383ad7a09ac4787e7039378100d840..c01d1062377418d07dcf98ac2ffa43c123433ca5 100644 (file)
@@ -14,17 +14,35 @@ void test_array_with_classes_move (int src, int dest, int count, int expected_de
        TestDestructorCalls[] arr = new TestDestructorCalls[arr_size];
         for(int i=0; i<arr_size; i++)
        {
-            arr[i] = new TestDestructorCalls (i);
+               arr[i] = new TestDestructorCalls (i);
        }
 
         arr.move (src, dest, count);
        assert (TestDestructorCalls.destructor_calls == expected_destructor_calls);
 }
 
+void test_unowned_array_move (int src, int dest, int count)
+{
+       const int arr_size = 5;
+       TestDestructorCalls.destructor_calls = 0; 
+       (unowned TestDestructorCalls)[] arr = new TestDestructorCalls[arr_size];
+       TestDestructorCalls[] owner = new TestDestructorCalls[arr_size];
+
+       for(int i=0; i<arr_size; i++)
+       {
+               var obj = new TestDestructorCalls (i);
+               owner[i] = obj;
+               arr[i] = obj;
+       }
+
+        arr.move (src, dest, count);
+       assert (TestDestructorCalls.destructor_calls == 0);
+}
+
 void main()
 {
        test_array_with_classes_move(0, 2, 3, 1);
        test_array_with_classes_move(2, 0, 3, 2);
        test_array_with_classes_move(0, 3, 1, 1);
-
+       test_unowned_array_move(3, 0, 1); 
 }