From cfc2db6182dead341c29e301cd26cc3d6986295b Mon Sep 17 00:00:00 2001 From: Vladyslav Stovmanenko Date: Wed, 4 May 2022 20:31:03 +0000 Subject: [PATCH 01/12] Start implementing cleaning after move --- codegen/valaccodearraymodule.vala | 51 +++++++++++++++++++++++++- codegen/valaccodemethodcallmodule.vala | 2 + 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/codegen/valaccodearraymodule.vala b/codegen/valaccodearraymodule.vala index 9a84ef848..1f56f032d 100644 --- a/codegen/valaccodearraymodule.vala +++ b/codegen/valaccodearraymodule.vala @@ -388,8 +388,8 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule { cfile.add_include ("string.h"); generate_type_declaration (ssize_t_type, cfile); - // assumes that overwritten array elements are null before invocation - // FIXME will leak memory if that's not the case + var null_id = new CCodeIdentifier("NULL"); + var fun = new CCodeFunction ("_vala_array_move", "void"); fun.modifiers = CCodeModifiers.STATIC; fun.add_parameter (new CCodeParameter ("array", get_ccode_name (pointer_type))); @@ -397,6 +397,7 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule { fun.add_parameter (new CCodeParameter ("src", get_ccode_name (ssize_t_type))); fun.add_parameter (new CCodeParameter ("dest", get_ccode_name (ssize_t_type))); fun.add_parameter (new CCodeParameter ("length", get_ccode_name (ssize_t_type))); + fun.add_parameter (new CCodeParameter ("free_func", "GDestroyNotify")); push_function (fun); @@ -410,6 +411,7 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule { var src_address = new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, array, new CCodeBinaryExpression (CCodeBinaryOperator.MUL, src, element_size)); var dest_address = new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, array, new CCodeBinaryExpression (CCodeBinaryOperator.MUL, dest, element_size)); var dest_end_address = new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, array, new CCodeBinaryExpression (CCodeBinaryOperator.MUL, dest_end, element_size)); + var free_func = new CCodeIdentifier("free_func"); var ccall = new CCodeFunctionCall (new CCodeIdentifier ("memmove")); ccall.add_argument (dest_address); @@ -419,6 +421,21 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule { ccode.open_if (new CCodeBinaryExpression (CCodeBinaryOperator.AND, new CCodeBinaryExpression (CCodeBinaryOperator.LESS_THAN, src, dest), new CCodeBinaryExpression (CCodeBinaryOperator.GREATER_THAN, src_end, dest))); + ccode.open_if (new CCodeBinaryExpression(CCodeBinaryOperator.INEQUALITY, free_func, null_id)); + var init_expr = new CCodeVariableDeclarator("i", src_address); + var iterator_var = new CCodeIdentifier("i"); + var cond_expr = new CCodeBinaryExpression(CCodeBinaryOperator.LESS_THAN, iterator_var, dest); + var iter_expr = new CCodeUnaryExpression(CCodeUnaryOperator.POSTFIX_INCREMENT, iterator_var); + + ccode.open_for(init_expr, cond_expr, iter_expr); + var accessed_element = new CCodeElementAccess(array, new CCodeBinaryExpression(CCodeBinaryOperator.MUL, iterator_var, element_size)); + var free_call = new CCodeFunctionCall(free_func); + free_call.add_argument(accessed_element); + ccode.add_expression(free_call); + + ccode.close(); + ccode.close(); + var czero1 = new CCodeFunctionCall (new CCodeIdentifier ("memset")); czero1.add_argument (src_address); czero1.add_argument (new CCodeConstant ("0")); @@ -427,6 +444,21 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule { ccode.else_if (new CCodeBinaryExpression (CCodeBinaryOperator.AND, new CCodeBinaryExpression (CCodeBinaryOperator.GREATER_THAN, src, dest), new CCodeBinaryExpression (CCodeBinaryOperator.LESS_THAN, src, dest_end))); + ccode.open_if (new CCodeBinaryExpression(CCodeBinaryOperator.INEQUALITY, free_func, null_id)); + init_expr = new CCodeVariableDeclarator("i", dest); + iterator_var = new CCodeIdentifier("i"); + cond_expr = new CCodeBinaryExpression(CCodeBinaryOperator.LESS_THAN, iterator_var, src); + iter_expr = new CCodeUnaryExpression(CCodeUnaryOperator.POSTFIX_INCREMENT, iterator_var); + + ccode.open_for(init_expr, cond_expr, iter_expr); + accessed_element = new CCodeElementAccess(array, new CCodeBinaryExpression(CCodeBinaryOperator.MUL, iterator_var, element_size)); + free_call = new CCodeFunctionCall(free_func); + free_call.add_argument(accessed_element); + ccode.add_expression(free_call); + + ccode.close(); + ccode.close(); + var czero2 = new CCodeFunctionCall (new CCodeIdentifier ("memset")); czero2.add_argument (dest_end_address); czero2.add_argument (new CCodeConstant ("0")); @@ -435,6 +467,21 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule { ccode.else_if (new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, src, dest)); + ccode.open_if (new CCodeBinaryExpression(CCodeBinaryOperator.INEQUALITY, free_func, null_id)); + init_expr = new CCodeVariableDeclarator("i", src); + iterator_var = new CCodeIdentifier("i"); + cond_expr = new CCodeBinaryExpression(CCodeBinaryOperator.LESS_THAN, iterator_var, length); + iter_expr = new CCodeUnaryExpression(CCodeUnaryOperator.POSTFIX_INCREMENT, iterator_var); + + ccode.open_for(init_expr, cond_expr, iter_expr); + accessed_element = new CCodeElementAccess(array, new CCodeBinaryExpression(CCodeBinaryOperator.MUL, iterator_var, element_size)); + free_call = new CCodeFunctionCall(free_func); + free_call.add_argument(accessed_element); + ccode.add_expression(free_call); + + ccode.close(); + ccode.close(); + var czero3 = new CCodeFunctionCall (new CCodeIdentifier ("memset")); czero3.add_argument (src_address); czero3.add_argument (new CCodeConstant ("0")); diff --git a/codegen/valaccodemethodcallmodule.vala b/codegen/valaccodemethodcallmodule.vala index 6332271ad..4df84d950 100644 --- a/codegen/valaccodemethodcallmodule.vala +++ b/codegen/valaccodemethodcallmodule.vala @@ -337,6 +337,8 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule { var csizeof = new CCodeFunctionCall (new CCodeIdentifier ("sizeof")); 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.5), get_destroy_func_expression(array_type.element_type)); } else if (m is DynamicMethod) { emit_context.push_symbol (m); m.clear_parameters (); -- GitLab From eb803baf60a3a03c1d2a428f7b044a69da169369 Mon Sep 17 00:00:00 2001 From: Vladyslav Stovmanenko Date: Thu, 5 May 2022 09:17:33 +0000 Subject: [PATCH 02/12] Fix iterator variable declaration. --- codegen/valaccodearraymodule.vala | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/codegen/valaccodearraymodule.vala b/codegen/valaccodearraymodule.vala index 1f56f032d..9b5096d79 100644 --- a/codegen/valaccodearraymodule.vala +++ b/codegen/valaccodearraymodule.vala @@ -389,6 +389,7 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule { generate_type_declaration (ssize_t_type, cfile); var null_id = new CCodeIdentifier("NULL"); + var free_func = new CCodeIdentifier("free_func"); var fun = new CCodeFunction ("_vala_array_move", "void"); fun.modifiers = CCodeModifiers.STATIC; @@ -397,7 +398,7 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule { fun.add_parameter (new CCodeParameter ("src", get_ccode_name (ssize_t_type))); fun.add_parameter (new CCodeParameter ("dest", get_ccode_name (ssize_t_type))); fun.add_parameter (new CCodeParameter ("length", get_ccode_name (ssize_t_type))); - fun.add_parameter (new CCodeParameter ("free_func", "GDestroyNotify")); + fun.add_parameter (new CCodeParameter (free_func.name, get_ccode_name (delegate_target_destroy_type))); push_function (fun); @@ -411,7 +412,6 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule { var src_address = new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, array, new CCodeBinaryExpression (CCodeBinaryOperator.MUL, src, element_size)); var dest_address = new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, array, new CCodeBinaryExpression (CCodeBinaryOperator.MUL, dest, element_size)); var dest_end_address = new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, array, new CCodeBinaryExpression (CCodeBinaryOperator.MUL, dest_end, element_size)); - var free_func = new CCodeIdentifier("free_func"); var ccall = new CCodeFunctionCall (new CCodeIdentifier ("memmove")); ccall.add_argument (dest_address); @@ -421,9 +421,15 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule { ccode.open_if (new CCodeBinaryExpression (CCodeBinaryOperator.AND, new CCodeBinaryExpression (CCodeBinaryOperator.LESS_THAN, src, dest), new CCodeBinaryExpression (CCodeBinaryOperator.GREATER_THAN, src_end, dest))); - ccode.open_if (new CCodeBinaryExpression(CCodeBinaryOperator.INEQUALITY, free_func, null_id)); - var init_expr = new CCodeVariableDeclarator("i", src_address); + var free_func_not_null_check = new CCodeBinaryExpression(CCodeBinaryOperator.INEQUALITY, free_func, null_id); + ccode.open_if (free_func_not_null_check); + + var iterator_declarator = new CCodeVariableDeclarator ("i"); + ccode.add_declaration (get_ccode_name (ssize_t_type), iterator_declarator); + var iterator_var = new CCodeIdentifier("i"); + var init_expr = new CCodeAssignment(iterator_var, src); + var cond_expr = new CCodeBinaryExpression(CCodeBinaryOperator.LESS_THAN, iterator_var, dest); var iter_expr = new CCodeUnaryExpression(CCodeUnaryOperator.POSTFIX_INCREMENT, iterator_var); @@ -444,9 +450,10 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule { ccode.else_if (new CCodeBinaryExpression (CCodeBinaryOperator.AND, new CCodeBinaryExpression (CCodeBinaryOperator.GREATER_THAN, src, dest), new CCodeBinaryExpression (CCodeBinaryOperator.LESS_THAN, src, dest_end))); - ccode.open_if (new CCodeBinaryExpression(CCodeBinaryOperator.INEQUALITY, free_func, null_id)); - init_expr = new CCodeVariableDeclarator("i", dest); - iterator_var = new CCodeIdentifier("i"); + ccode.open_if (free_func_not_null_check); + ccode.add_declaration (get_ccode_name (ssize_t_type), iterator_declarator); + + init_expr = new CCodeAssignment(iterator_var, dest); cond_expr = new CCodeBinaryExpression(CCodeBinaryOperator.LESS_THAN, iterator_var, src); iter_expr = new CCodeUnaryExpression(CCodeUnaryOperator.POSTFIX_INCREMENT, iterator_var); @@ -467,9 +474,10 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule { ccode.else_if (new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, src, dest)); - ccode.open_if (new CCodeBinaryExpression(CCodeBinaryOperator.INEQUALITY, free_func, null_id)); - init_expr = new CCodeVariableDeclarator("i", src); - iterator_var = new CCodeIdentifier("i"); + ccode.open_if (free_func_not_null_check); + ccode.add_declaration (get_ccode_name (ssize_t_type), iterator_declarator); + + init_expr = new CCodeAssignment(iterator_var, src); cond_expr = new CCodeBinaryExpression(CCodeBinaryOperator.LESS_THAN, iterator_var, length); iter_expr = new CCodeUnaryExpression(CCodeUnaryOperator.POSTFIX_INCREMENT, iterator_var); -- GitLab From 886c7d93090c4304187b4c1cd1c31221196f33c3 Mon Sep 17 00:00:00 2001 From: Vladyslav Stovmanenko Date: Thu, 5 May 2022 09:43:09 +0000 Subject: [PATCH 03/12] Change order of free_func --- codegen/valaccodearraymodule.vala | 2 +- codegen/valaccodemethodcallmodule.vala | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/codegen/valaccodearraymodule.vala b/codegen/valaccodearraymodule.vala index 9b5096d79..849e9ce19 100644 --- a/codegen/valaccodearraymodule.vala +++ b/codegen/valaccodearraymodule.vala @@ -395,10 +395,10 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule { fun.modifiers = CCodeModifiers.STATIC; fun.add_parameter (new CCodeParameter ("array", get_ccode_name (pointer_type))); fun.add_parameter (new CCodeParameter ("element_size", get_ccode_name (size_t_type))); + fun.add_parameter (new CCodeParameter (free_func.name, get_ccode_name (delegate_target_destroy_type))); fun.add_parameter (new CCodeParameter ("src", get_ccode_name (ssize_t_type))); fun.add_parameter (new CCodeParameter ("dest", get_ccode_name (ssize_t_type))); fun.add_parameter (new CCodeParameter ("length", get_ccode_name (ssize_t_type))); - fun.add_parameter (new CCodeParameter (free_func.name, get_ccode_name (delegate_target_destroy_type))); push_function (fun); diff --git a/codegen/valaccodemethodcallmodule.vala b/codegen/valaccodemethodcallmodule.vala index 4df84d950..4c6ecf069 100644 --- a/codegen/valaccodemethodcallmodule.vala +++ b/codegen/valaccodemethodcallmodule.vala @@ -338,7 +338,7 @@ 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.5), get_destroy_func_expression(array_type.element_type)); + in_arg_map.set (get_param_pos (0.2), get_destroy_func_expression(array_type.element_type)); } else if (m is DynamicMethod) { emit_context.push_symbol (m); m.clear_parameters (); -- GitLab From 4a46cdaa4f4d1005071509be9c4a863251e7c403 Mon Sep 17 00:00:00 2001 From: Vladyslav Stovmanenko Date: Thu, 5 May 2022 09:52:55 +0000 Subject: [PATCH 04/12] Properly cast array. --- codegen/valaccodearraymodule.vala | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/codegen/valaccodearraymodule.vala b/codegen/valaccodearraymodule.vala index 849e9ce19..4c74edbaa 100644 --- a/codegen/valaccodearraymodule.vala +++ b/codegen/valaccodearraymodule.vala @@ -390,10 +390,11 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule { var null_id = new CCodeIdentifier("NULL"); var free_func = new CCodeIdentifier("free_func"); + var array_id = new CCodeIdentifier ("array"); var fun = new CCodeFunction ("_vala_array_move", "void"); fun.modifiers = CCodeModifiers.STATIC; - fun.add_parameter (new CCodeParameter ("array", get_ccode_name (pointer_type))); + fun.add_parameter (new CCodeParameter (array_id.name, get_ccode_name (pointer_type))); fun.add_parameter (new CCodeParameter ("element_size", get_ccode_name (size_t_type))); fun.add_parameter (new CCodeParameter (free_func.name, get_ccode_name (delegate_target_destroy_type))); fun.add_parameter (new CCodeParameter ("src", get_ccode_name (ssize_t_type))); @@ -402,7 +403,8 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule { push_function (fun); - var array = new CCodeCastExpression (new CCodeIdentifier ("array"), "char*"); + var array = new CCodeCastExpression (array_id, "char*"); + var void_array = new CCodeCastExpression(array_id, "void**"); var element_size = new CCodeIdentifier ("element_size"); var length = new CCodeIdentifier ("length"); var src = new CCodeIdentifier ("src"); @@ -434,7 +436,7 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule { var iter_expr = new CCodeUnaryExpression(CCodeUnaryOperator.POSTFIX_INCREMENT, iterator_var); ccode.open_for(init_expr, cond_expr, iter_expr); - var accessed_element = new CCodeElementAccess(array, new CCodeBinaryExpression(CCodeBinaryOperator.MUL, iterator_var, element_size)); + var accessed_element = new CCodeElementAccess(void_array, iterator_var); var free_call = new CCodeFunctionCall(free_func); free_call.add_argument(accessed_element); ccode.add_expression(free_call); @@ -458,7 +460,7 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule { iter_expr = new CCodeUnaryExpression(CCodeUnaryOperator.POSTFIX_INCREMENT, iterator_var); ccode.open_for(init_expr, cond_expr, iter_expr); - accessed_element = new CCodeElementAccess(array, new CCodeBinaryExpression(CCodeBinaryOperator.MUL, iterator_var, element_size)); + accessed_element = new CCodeElementAccess(void_array, iterator_var); free_call = new CCodeFunctionCall(free_func); free_call.add_argument(accessed_element); ccode.add_expression(free_call); -- GitLab From ae625b1b40350f3bf500c6b6c4d0e2ff92623e20 Mon Sep 17 00:00:00 2001 From: Vladyslav Stovmanenko Date: Thu, 5 May 2022 09:55:19 +0000 Subject: [PATCH 05/12] Fix cast one more time. --- codegen/valaccodearraymodule.vala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codegen/valaccodearraymodule.vala b/codegen/valaccodearraymodule.vala index 4c74edbaa..3463df12e 100644 --- a/codegen/valaccodearraymodule.vala +++ b/codegen/valaccodearraymodule.vala @@ -484,7 +484,7 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule { iter_expr = new CCodeUnaryExpression(CCodeUnaryOperator.POSTFIX_INCREMENT, iterator_var); ccode.open_for(init_expr, cond_expr, iter_expr); - accessed_element = new CCodeElementAccess(array, new CCodeBinaryExpression(CCodeBinaryOperator.MUL, iterator_var, element_size)); + accessed_element = new CCodeElementAccess(void_array, iterator_var); free_call = new CCodeFunctionCall(free_func); free_call.add_argument(accessed_element); ccode.add_expression(free_call); -- GitLab From 7eab17b93d522fec7dfe0b161e6432f971cd5f53 Mon Sep 17 00:00:00 2001 From: Vladyslav Stovmanenko Date: Thu, 5 May 2022 10:18:00 +0000 Subject: [PATCH 06/12] Free before moving. --- codegen/valaccodearraymodule.vala | 57 +++++++++++++++++-------------- 1 file changed, 32 insertions(+), 25 deletions(-) diff --git a/codegen/valaccodearraymodule.vala b/codegen/valaccodearraymodule.vala index 3463df12e..b788cf48b 100644 --- a/codegen/valaccodearraymodule.vala +++ b/codegen/valaccodearraymodule.vala @@ -415,17 +415,15 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule { var dest_address = new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, array, new CCodeBinaryExpression (CCodeBinaryOperator.MUL, dest, element_size)); var dest_end_address = new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, array, new CCodeBinaryExpression (CCodeBinaryOperator.MUL, dest_end, element_size)); - var ccall = new CCodeFunctionCall (new CCodeIdentifier ("memmove")); - ccall.add_argument (dest_address); - ccall.add_argument (src_address); - ccall.add_argument (new CCodeBinaryExpression (CCodeBinaryOperator.MUL, length, element_size)); - ccode.add_expression (ccall); - - ccode.open_if (new CCodeBinaryExpression (CCodeBinaryOperator.AND, new CCodeBinaryExpression (CCodeBinaryOperator.LESS_THAN, src, dest), new CCodeBinaryExpression (CCodeBinaryOperator.GREATER_THAN, src_end, dest))); + var moving_forward_overlapping = new CCodeBinaryExpression (CCodeBinaryOperator.AND, new CCodeBinaryExpression (CCodeBinaryOperator.LESS_THAN, src, dest), new CCodeBinaryExpression (CCodeBinaryOperator.GREATER_THAN, src_end, dest)); + var moving_back_overlapping = new CCodeBinaryExpression (CCodeBinaryOperator.AND, new CCodeBinaryExpression (CCodeBinaryOperator.GREATER_THAN, src, dest), new CCodeBinaryExpression (CCodeBinaryOperator.LESS_THAN, src, dest_end)); + var move_without_overlapping = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, src, dest); var free_func_not_null_check = new CCodeBinaryExpression(CCodeBinaryOperator.INEQUALITY, free_func, null_id); ccode.open_if (free_func_not_null_check); + ccode.open_if (moving_forward_overlapping); + var iterator_declarator = new CCodeVariableDeclarator ("i"); ccode.add_declaration (get_ccode_name (ssize_t_type), iterator_declarator); @@ -441,18 +439,10 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule { free_call.add_argument(accessed_element); ccode.add_expression(free_call); - ccode.close(); ccode.close(); - var czero1 = new CCodeFunctionCall (new CCodeIdentifier ("memset")); - czero1.add_argument (src_address); - czero1.add_argument (new CCodeConstant ("0")); - czero1.add_argument (new CCodeBinaryExpression (CCodeBinaryOperator.MUL, new CCodeBinaryExpression (CCodeBinaryOperator.MINUS, dest, src), element_size)); - ccode.add_expression (czero1); - - ccode.else_if (new CCodeBinaryExpression (CCodeBinaryOperator.AND, new CCodeBinaryExpression (CCodeBinaryOperator.GREATER_THAN, src, dest), new CCodeBinaryExpression (CCodeBinaryOperator.LESS_THAN, src, dest_end))); + ccode.else_if(moving_back_overlapping); - ccode.open_if (free_func_not_null_check); ccode.add_declaration (get_ccode_name (ssize_t_type), iterator_declarator); init_expr = new CCodeAssignment(iterator_var, dest); @@ -465,18 +455,10 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule { free_call.add_argument(accessed_element); ccode.add_expression(free_call); - ccode.close(); ccode.close(); - var czero2 = new CCodeFunctionCall (new CCodeIdentifier ("memset")); - czero2.add_argument (dest_end_address); - czero2.add_argument (new CCodeConstant ("0")); - czero2.add_argument (new CCodeBinaryExpression (CCodeBinaryOperator.MUL, new CCodeBinaryExpression (CCodeBinaryOperator.MINUS, src, dest), element_size)); - ccode.add_expression (czero2); + ccode.else_if(move_without_overlapping); - ccode.else_if (new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, src, dest)); - - ccode.open_if (free_func_not_null_check); ccode.add_declaration (get_ccode_name (ssize_t_type), iterator_declarator); init_expr = new CCodeAssignment(iterator_var, src); @@ -490,8 +472,33 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule { ccode.add_expression(free_call); ccode.close(); + ccode.close(); + var ccall = new CCodeFunctionCall (new CCodeIdentifier ("memmove")); + ccall.add_argument (dest_address); + ccall.add_argument (src_address); + ccall.add_argument (new CCodeBinaryExpression (CCodeBinaryOperator.MUL, length, element_size)); + ccode.add_expression (ccall); + + ccode.open_if (moving_forward_overlapping); + + var czero1 = new CCodeFunctionCall (new CCodeIdentifier ("memset")); + czero1.add_argument (src_address); + czero1.add_argument (new CCodeConstant ("0")); + czero1.add_argument (new CCodeBinaryExpression (CCodeBinaryOperator.MUL, new CCodeBinaryExpression (CCodeBinaryOperator.MINUS, dest, src), element_size)); + ccode.add_expression (czero1); + + ccode.else_if (moving_back_overlapping); + + var czero2 = new CCodeFunctionCall (new CCodeIdentifier ("memset")); + czero2.add_argument (dest_end_address); + czero2.add_argument (new CCodeConstant ("0")); + czero2.add_argument (new CCodeBinaryExpression (CCodeBinaryOperator.MUL, new CCodeBinaryExpression (CCodeBinaryOperator.MINUS, src, dest), element_size)); + ccode.add_expression (czero2); + + ccode.else_if (move_without_overlapping); + var czero3 = new CCodeFunctionCall (new CCodeIdentifier ("memset")); czero3.add_argument (src_address); czero3.add_argument (new CCodeConstant ("0")); -- GitLab From b318a6912ca9a7ff71ef46d1a0ef5e3dfe2ffe74 Mon Sep 17 00:00:00 2001 From: Vladyslav Stovmanenko Date: Thu, 5 May 2022 10:21:13 +0000 Subject: [PATCH 07/12] Change brackets order. --- codegen/valaccodearraymodule.vala | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/codegen/valaccodearraymodule.vala b/codegen/valaccodearraymodule.vala index b788cf48b..7a32b9495 100644 --- a/codegen/valaccodearraymodule.vala +++ b/codegen/valaccodearraymodule.vala @@ -471,9 +471,9 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule { free_call.add_argument(accessed_element); ccode.add_expression(free_call); - ccode.close(); - - ccode.close(); + ccode.close(); //close cycle + ccode.close(); //close endif + ccode.close(); //close if for free_func_not_null_check var ccall = new CCodeFunctionCall (new CCodeIdentifier ("memmove")); ccall.add_argument (dest_address); -- GitLab From 90032acf53c2696c2c278ab5ea3a039ff0e1d84d Mon Sep 17 00:00:00 2001 From: Vladyslav Stovmanenko Date: Thu, 5 May 2022 20:35:35 +0000 Subject: [PATCH 08/12] Free proper elements. --- codegen/valaccodearraymodule.vala | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/codegen/valaccodearraymodule.vala b/codegen/valaccodearraymodule.vala index 7a32b9495..0b8c6d662 100644 --- a/codegen/valaccodearraymodule.vala +++ b/codegen/valaccodearraymodule.vala @@ -428,9 +428,9 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule { ccode.add_declaration (get_ccode_name (ssize_t_type), iterator_declarator); var iterator_var = new CCodeIdentifier("i"); - var init_expr = new CCodeAssignment(iterator_var, src); + var init_expr = new CCodeAssignment(iterator_var, dest); - var cond_expr = new CCodeBinaryExpression(CCodeBinaryOperator.LESS_THAN, iterator_var, dest); + var cond_expr = new CCodeBinaryExpression(CCodeBinaryOperator.LESS_THAN, iterator_var, src_end); var iter_expr = new CCodeUnaryExpression(CCodeUnaryOperator.POSTFIX_INCREMENT, iterator_var); ccode.open_for(init_expr, cond_expr, iter_expr); @@ -461,8 +461,8 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule { ccode.add_declaration (get_ccode_name (ssize_t_type), iterator_declarator); - init_expr = new CCodeAssignment(iterator_var, src); - cond_expr = new CCodeBinaryExpression(CCodeBinaryOperator.LESS_THAN, iterator_var, length); + init_expr = new CCodeAssignment(iterator_var, dest); + cond_expr = new CCodeBinaryExpression(CCodeBinaryOperator.LESS_THAN, iterator_var, dest_end); iter_expr = new CCodeUnaryExpression(CCodeUnaryOperator.POSTFIX_INCREMENT, iterator_var); ccode.open_for(init_expr, cond_expr, iter_expr); -- GitLab From edc8aaa7ef71360b95a673ce6937246bc194151e Mon Sep 17 00:00:00 2001 From: Vladyslav Stovmanenko Date: Fri, 6 May 2022 14:02:05 +0000 Subject: [PATCH 09/12] Update tests --- tests/Makefile.am | 1 + tests/basic-types/arrays-move-with-class.vala | 30 ++++ tests/basic-types/arrays.c-expected | 152 +++++++++++++++++- tests/basic-types/arrays.vala | 28 +++- tests/posix/arrays.c-expected | 129 ++++++++++++++- 5 files changed, 330 insertions(+), 10 deletions(-) create mode 100644 tests/basic-types/arrays-move-with-class.vala diff --git a/tests/Makefile.am b/tests/Makefile.am index 3dd2cad45..356a878aa 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -56,6 +56,7 @@ TESTS = \ basic-types/arrays.vala \ basic-types/arrays-generics.vala \ basic-types/arrays-fixed-assignment.vala \ + basic-types/arrays-move-with-class.vala \ basic-types/array-uint8-uchar-compat.vala \ basic-types/pointers.vala \ basic-types/pointers-arithmetic.vala \ diff --git a/tests/basic-types/arrays-move-with-class.vala b/tests/basic-types/arrays-move-with-class.vala new file mode 100644 index 000000000..4a6525703 --- /dev/null +++ b/tests/basic-types/arrays-move-with-class.vala @@ -0,0 +1,30 @@ +class TestDestructorCalls { + public static int destructor_calls = 0; + private int idx; + + public TestDestructorCalls (int idx) { this.idx = idx; } + + ~TestDestructorCalls () { destructor_calls++; } +} + +void test_array_with_classes_move (int src, int dest, int count, int expected_destructor_calls) +{ + const int arr_size = 5; + TestDestructorCalls.destructor_calls = 0; + TestDestructorCalls[] arr = new TestDestructorCalls[arr_size]; + for(int i=0; i dest)) { + gssize i; + for (i = dest; i < (src + length); i++) { + free_func (((void**) array)[i]); + } + } else if ((src > dest) && (src < (dest + length))) { + gssize i; + for (i = dest; i < src; i++) { + free_func (((void**) array)[i]); + } + } else if (src != dest) { + gssize i; + for (i = dest; i < (dest + length); i++) { + free_func (((void**) array)[i]); + } + } + } memmove (((char*) array) + (dest * element_size), ((char*) array) + (src * element_size), length * element_size); if ((src < dest) && ((src + length) > dest)) { memset (((char*) array) + (src * element_size), 0, (dest - src) * element_size); diff --git a/tests/basic-types/arrays.vala b/tests/basic-types/arrays.vala index 1321c1b31..0a94a6acb 100644 --- a/tests/basic-types/arrays.vala +++ b/tests/basic-types/arrays.vala @@ -213,11 +213,32 @@ void test_explicit_copying () { assert (a0[1] == a1[1]); } -void test_array_move () { +void test_array_with_primitives_move () { int[] a = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; assert (a[4] == 5); a.move (4, 0, 5); assert (a[4] == 9); + assert (a[8] == 0); +} + +struct TestMoveCall { + int idx; + + public TestMoveCall (int idx) { this.idx = idx; } +} + +void test_array_with_struct_move (int src, int dest, int count, int expected_destructor_calls) +{ + const int arr_size = 5; + TestMoveCall[] arr = new TestMoveCall[arr_size]; + for(int i=0; i dest)) { + ssize_t i; + for (i = dest; i < (src + length); i++) { + free_func (((void**) array)[i]); + } + } else if ((src > dest) && (src < (dest + length))) { + ssize_t i; + for (i = dest; i < src; i++) { + free_func (((void**) array)[i]); + } + } else if (src != dest) { + ssize_t i; + for (i = dest; i < (dest + length); i++) { + free_func (((void**) array)[i]); + } + } + } memmove (((char*) array) + (dest * element_size), ((char*) array) + (src * element_size), length * element_size); if ((src < dest) && ((src + length) > dest)) { memset (((char*) array) + (src * element_size), 0, (dest - src) * element_size); -- GitLab From 2ad2f8a01c736d07a4421c1f4061fc8a10ee05d4 Mon Sep 17 00:00:00 2001 From: Vladyslav Stovmanenko Date: Sat, 7 May 2022 19:31:36 +0000 Subject: [PATCH 10/12] Handle unowned arrays --- codegen/valaccodemethodcallmodule.vala | 7 +++++- tests/basic-types/arrays-move-with-class.vala | 22 +++++++++++++++++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/codegen/valaccodemethodcallmodule.vala b/codegen/valaccodemethodcallmodule.vala index 4c6ecf069..2b4a6d66f 100644 --- a/codegen/valaccodemethodcallmodule.vala +++ b/codegen/valaccodemethodcallmodule.vala @@ -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 (); diff --git a/tests/basic-types/arrays-move-with-class.vala b/tests/basic-types/arrays-move-with-class.vala index 4a6525703..c01d10623 100644 --- a/tests/basic-types/arrays-move-with-class.vala +++ b/tests/basic-types/arrays-move-with-class.vala @@ -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 Date: Sat, 7 May 2022 19:40:01 +0000 Subject: [PATCH 11/12] Adjustments --- codegen/valaccodemethodcallmodule.vala | 2 +- tests/basic-types/arrays.c-expected | 3 +++ tests/basic-types/arrays.vala | 6 +++--- tests/posix/arrays.c-expected | 3 +++ 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/codegen/valaccodemethodcallmodule.vala b/codegen/valaccodemethodcallmodule.vala index 2b4a6d66f..825b9c7c6 100644 --- a/codegen/valaccodemethodcallmodule.vala +++ b/codegen/valaccodemethodcallmodule.vala @@ -338,7 +338,7 @@ 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); - CCodeExpression? free_func_expr = new CCodeIdentifier("NULL"); + 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); } diff --git a/tests/basic-types/arrays.c-expected b/tests/basic-types/arrays.c-expected index 7839707a6..6ffe7bb00 100644 --- a/tests/basic-types/arrays.c-expected +++ b/tests/basic-types/arrays.c-expected @@ -1763,6 +1763,9 @@ _vala_main (void) test_void_array (); test_explicit_copying (); test_array_with_primitives_move (); + test_array_with_struct_move (0, 2, 3, 1); + test_array_with_struct_move (2, 0, 3, 2); + test_array_with_struct_move (0, 3, 1, 1); test_array_resize (); test_struct_array (); test_fixed_array (); diff --git a/tests/basic-types/arrays.vala b/tests/basic-types/arrays.vala index 0a94a6acb..b269ce8ac 100644 --- a/tests/basic-types/arrays.vala +++ b/tests/basic-types/arrays.vala @@ -322,9 +322,9 @@ void main () { test_void_array (); test_explicit_copying (); test_array_with_primitives_move (); - //test_array_with_struct_move(0, 2, 3, 1); - //test_array_with_struct_move(2, 0, 3, 2); - //test_array_with_struct_move(0, 3, 1, 1); + test_array_with_struct_move(0, 2, 3, 1); + test_array_with_struct_move(2, 0, 3, 2); + test_array_with_struct_move(0, 3, 1, 1); test_array_resize (); test_struct_array (); test_fixed_array (); diff --git a/tests/posix/arrays.c-expected b/tests/posix/arrays.c-expected index 47710c9cf..6f3b664f3 100644 --- a/tests/posix/arrays.c-expected +++ b/tests/posix/arrays.c-expected @@ -1718,6 +1718,9 @@ _vala_main (void) test_void_array (); test_explicit_copying (); test_array_with_primitives_move (); + test_array_with_struct_move (0, 2, 3, 1); + test_array_with_struct_move (2, 0, 3, 2); + test_array_with_struct_move (0, 3, 1, 1); test_array_resize (); test_struct_array (); test_fixed_array (); -- GitLab From 5f8ced82b0e4c02d51256f0f97127cf6a156e888 Mon Sep 17 00:00:00 2001 From: Vladyslav Stovmanenko Date: Wed, 11 May 2022 10:02:27 +0000 Subject: [PATCH 12/12] Add support for freeing non-pointer elements in the arrays. --- codegen/valaccodearraymodule.vala | 56 ++++++++++++++++++++++---- codegen/valaccodemethodcallmodule.vala | 8 +++- tests/basic-types/arrays.c-expected | 36 +++++++++++++---- tests/posix/arrays.c-expected | 36 +++++++++++++---- 4 files changed, 110 insertions(+), 26 deletions(-) diff --git a/codegen/valaccodearraymodule.vala b/codegen/valaccodearraymodule.vala index 0b8c6d662..9f6590c3c 100644 --- a/codegen/valaccodearraymodule.vala +++ b/codegen/valaccodearraymodule.vala @@ -391,12 +391,14 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule { var null_id = new CCodeIdentifier("NULL"); var free_func = new CCodeIdentifier("free_func"); var array_id = new CCodeIdentifier ("array"); + var is_pointer_id = new CCodeIdentifier ("is_pointer"); var fun = new CCodeFunction ("_vala_array_move", "void"); fun.modifiers = CCodeModifiers.STATIC; fun.add_parameter (new CCodeParameter (array_id.name, get_ccode_name (pointer_type))); fun.add_parameter (new CCodeParameter ("element_size", get_ccode_name (size_t_type))); fun.add_parameter (new CCodeParameter (free_func.name, get_ccode_name (delegate_target_destroy_type))); + fun.add_parameter (new CCodeParameter (is_pointer_id.name, get_ccode_name (bool_type))); fun.add_parameter (new CCodeParameter ("src", get_ccode_name (ssize_t_type))); fun.add_parameter (new CCodeParameter ("dest", get_ccode_name (ssize_t_type))); fun.add_parameter (new CCodeParameter ("length", get_ccode_name (ssize_t_type))); @@ -419,7 +421,7 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule { var moving_back_overlapping = new CCodeBinaryExpression (CCodeBinaryOperator.AND, new CCodeBinaryExpression (CCodeBinaryOperator.GREATER_THAN, src, dest), new CCodeBinaryExpression (CCodeBinaryOperator.LESS_THAN, src, dest_end)); var move_without_overlapping = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, src, dest); - var free_func_not_null_check = new CCodeBinaryExpression(CCodeBinaryOperator.INEQUALITY, free_func, null_id); + var free_func_not_null_check = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, free_func, null_id); ccode.open_if (free_func_not_null_check); ccode.open_if (moving_forward_overlapping); @@ -433,12 +435,26 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule { var cond_expr = new CCodeBinaryExpression(CCodeBinaryOperator.LESS_THAN, iterator_var, src_end); var iter_expr = new CCodeUnaryExpression(CCodeUnaryOperator.POSTFIX_INCREMENT, iterator_var); + ccode.open_if (is_pointer_id); + ccode.open_for(init_expr, cond_expr, iter_expr); - var accessed_element = new CCodeElementAccess(void_array, iterator_var); + var accessed_element = new CCodeElementAccess (void_array, iterator_var); var free_call = new CCodeFunctionCall(free_func); - free_call.add_argument(accessed_element); - ccode.add_expression(free_call); + free_call.add_argument (accessed_element); + ccode.add_expression (free_call); + ccode.close (); + + ccode.add_else (); + + ccode.open_for(init_expr, cond_expr, iter_expr); + var offset = new CCodeBinaryExpression(CCodeBinaryOperator.MUL, iterator_var, element_size); + var address_to_clean = new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, array, offset); + free_call = new CCodeFunctionCall(free_func); + free_call.add_argument (address_to_clean); + ccode.add_expression (free_call); + + ccode.close(); ccode.close(); ccode.else_if(moving_back_overlapping); @@ -449,14 +465,25 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule { cond_expr = new CCodeBinaryExpression(CCodeBinaryOperator.LESS_THAN, iterator_var, src); iter_expr = new CCodeUnaryExpression(CCodeUnaryOperator.POSTFIX_INCREMENT, iterator_var); + ccode.open_if (is_pointer_id); + ccode.open_for(init_expr, cond_expr, iter_expr); - accessed_element = new CCodeElementAccess(void_array, iterator_var); free_call = new CCodeFunctionCall(free_func); free_call.add_argument(accessed_element); ccode.add_expression(free_call); ccode.close(); + ccode.add_else (); + + ccode.open_for(init_expr, cond_expr, iter_expr); + free_call = new CCodeFunctionCall(free_func); + free_call.add_argument (address_to_clean); + ccode.add_expression (free_call); + + ccode.close(); + ccode.close(); + ccode.else_if(move_without_overlapping); ccode.add_declaration (get_ccode_name (ssize_t_type), iterator_declarator); @@ -465,15 +492,28 @@ public class Vala.CCodeArrayModule : CCodeMethodCallModule { cond_expr = new CCodeBinaryExpression(CCodeBinaryOperator.LESS_THAN, iterator_var, dest_end); iter_expr = new CCodeUnaryExpression(CCodeUnaryOperator.POSTFIX_INCREMENT, iterator_var); + ccode.open_if (is_pointer_id); + ccode.open_for(init_expr, cond_expr, iter_expr); accessed_element = new CCodeElementAccess(void_array, iterator_var); free_call = new CCodeFunctionCall(free_func); free_call.add_argument(accessed_element); ccode.add_expression(free_call); - ccode.close(); //close cycle - ccode.close(); //close endif - ccode.close(); //close if for free_func_not_null_check + ccode.close(); /*close cycle*/ + + ccode.add_else (); + + ccode.open_for(init_expr, cond_expr, iter_expr); + free_call = new CCodeFunctionCall(free_func); + free_call.add_argument (address_to_clean); + ccode.add_expression (free_call); + + ccode.close(); /*close cycle*/ + ccode.close(); /*close is_pointer_check*/ + + ccode.close(); /*close endif*/ + ccode.close(); /*close if for free_func_not_null_check*/ var ccall = new CCodeFunctionCall (new CCodeIdentifier ("memmove")); ccall.add_argument (dest_address); diff --git a/codegen/valaccodemethodcallmodule.vala b/codegen/valaccodemethodcallmodule.vala index 825b9c7c6..2f1f62568 100644 --- a/codegen/valaccodemethodcallmodule.vala +++ b/codegen/valaccodemethodcallmodule.vala @@ -338,12 +338,16 @@ 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); - CCodeExpression free_func_expr = new CCodeIdentifier("NULL"); + 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); + free_func_expr = get_destroy_func_expression (array_type.element_type); } in_arg_map.set (get_param_pos (0.2), free_func_expr); + + CCodeExpression is_pointer = get_boolean_cconstant (array_type.element_type.nullable || array_type.element_type.is_reference_type_or_type_parameter ()); + + in_arg_map.set (get_param_pos (0.3), is_pointer); } else if (m is DynamicMethod) { emit_context.push_symbol (m); m.clear_parameters (); diff --git a/tests/basic-types/arrays.c-expected b/tests/basic-types/arrays.c-expected index 6ffe7bb00..e3bf50eef 100644 --- a/tests/basic-types/arrays.c-expected +++ b/tests/basic-types/arrays.c-expected @@ -183,6 +183,7 @@ static void _vala_array_free (gpointer array, static void _vala_array_move (gpointer array, gsize element_size, GDestroyNotify free_func, + gboolean is_pointer, gssize src, gssize dest, gssize length); @@ -1341,7 +1342,7 @@ test_array_with_primitives_move (void) _a_size_ = a_length1; _tmp1_ = a[4]; _vala_assert (_tmp1_ == 5, "a[4] == 5"); - _vala_array_move (a, sizeof (gint), NULL, 4, 0, 5); + _vala_array_move (a, sizeof (gint), NULL, FALSE, 4, 0, 5); _tmp2_ = a[4]; _vala_assert (_tmp2_ == 9, "a[4] == 9"); _tmp3_ = a[8]; @@ -1445,7 +1446,7 @@ test_array_with_struct_move (gint src, _tmp5__length1 = arr_length1; _tmp6_ = _tmp5_[src]; testObj = _tmp6_; - _vala_array_move (arr, sizeof (TestMoveCall), NULL, src, dest, count); + _vala_array_move (arr, sizeof (TestMoveCall), NULL, FALSE, src, dest, count); _tmp7_ = arr; _tmp7__length1 = arr_length1; _tmp8_ = _tmp7_[dest]; @@ -1807,6 +1808,7 @@ static void _vala_array_move (gpointer array, gsize element_size, GDestroyNotify free_func, + gboolean is_pointer, gssize src, gssize dest, gssize length) @@ -1814,18 +1816,36 @@ _vala_array_move (gpointer array, if (free_func != NULL) { if ((src < dest) && ((src + length) > dest)) { gssize i; - for (i = dest; i < (src + length); i++) { - free_func (((void**) array)[i]); + if (is_pointer) { + for (i = dest; i < (src + length); i++) { + free_func (((void**) array)[i]); + } + } else { + for (i = dest; i < (src + length); i++) { + free_func (((char*) array) + (i * element_size)); + } } } else if ((src > dest) && (src < (dest + length))) { gssize i; - for (i = dest; i < src; i++) { - free_func (((void**) array)[i]); + if (is_pointer) { + for (i = dest; i < src; i++) { + free_func (((void**) array)[i]); + } + } else { + for (i = dest; i < src; i++) { + free_func (((char*) array) + (i * element_size)); + } } } else if (src != dest) { gssize i; - for (i = dest; i < (dest + length); i++) { - free_func (((void**) array)[i]); + if (is_pointer) { + for (i = dest; i < (dest + length); i++) { + free_func (((void**) array)[i]); + } + } else { + for (i = dest; i < (dest + length); i++) { + free_func (((char*) array) + (i * element_size)); + } } } } diff --git a/tests/posix/arrays.c-expected b/tests/posix/arrays.c-expected index 6f3b664f3..17012c236 100644 --- a/tests/posix/arrays.c-expected +++ b/tests/posix/arrays.c-expected @@ -171,6 +171,7 @@ static void _vala_array_free (void* array, static void _vala_array_move (void* array, size_t element_size, ValaDestroyNotify free_func, + bool is_pointer, ssize_t src, ssize_t dest, ssize_t length); @@ -1376,7 +1377,7 @@ test_array_with_primitives_move (void) _a_size_ = a_length1; _tmp1_ = a[4]; assert (_tmp1_ == 5); - _vala_array_move (a, sizeof (int), NULL, 4, 0, 5); + _vala_array_move (a, sizeof (int), NULL, false, 4, 0, 5); _tmp2_ = a[4]; assert (_tmp2_ == 9); _tmp3_ = a[8]; @@ -1460,7 +1461,7 @@ test_array_with_struct_move (int src, _tmp5__length1 = arr_length1; _tmp6_ = _tmp5_[src]; testObj = _tmp6_; - _vala_array_move (arr, sizeof (TestMoveCall), NULL, src, dest, count); + _vala_array_move (arr, sizeof (TestMoveCall), NULL, false, src, dest, count); _tmp7_ = arr; _tmp7__length1 = arr_length1; _tmp8_ = _tmp7_[dest]; @@ -1762,6 +1763,7 @@ static void _vala_array_move (void* array, size_t element_size, ValaDestroyNotify free_func, + bool is_pointer, ssize_t src, ssize_t dest, ssize_t length) @@ -1769,18 +1771,36 @@ _vala_array_move (void* array, if (free_func != NULL) { if ((src < dest) && ((src + length) > dest)) { ssize_t i; - for (i = dest; i < (src + length); i++) { - free_func (((void**) array)[i]); + if (is_pointer) { + for (i = dest; i < (src + length); i++) { + free_func (((void**) array)[i]); + } + } else { + for (i = dest; i < (src + length); i++) { + free_func (((char*) array) + (i * element_size)); + } } } else if ((src > dest) && (src < (dest + length))) { ssize_t i; - for (i = dest; i < src; i++) { - free_func (((void**) array)[i]); + if (is_pointer) { + for (i = dest; i < src; i++) { + free_func (((void**) array)[i]); + } + } else { + for (i = dest; i < src; i++) { + free_func (((char*) array) + (i * element_size)); + } } } else if (src != dest) { ssize_t i; - for (i = dest; i < (dest + length); i++) { - free_func (((void**) array)[i]); + if (is_pointer) { + for (i = dest; i < (dest + length); i++) { + free_func (((void**) array)[i]); + } + } else { + for (i = dest; i < (dest + length); i++) { + free_func (((char*) array) + (i * element_size)); + } } } } -- GitLab