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)));
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);
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);
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);
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);
static void _vala_array_move (gpointer array,
gsize element_size,
GDestroyNotify free_func,
+ gboolean is_pointer,
gssize src,
gssize dest,
gssize length);
_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];
_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];
_vala_array_move (gpointer array,
gsize element_size,
GDestroyNotify free_func,
+ gboolean is_pointer,
gssize src,
gssize dest,
gssize length)
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));
+ }
}
}
}
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);
_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];
_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];
_vala_array_move (void* array,
size_t element_size,
ValaDestroyNotify free_func,
+ bool is_pointer,
ssize_t src,
ssize_t dest,
ssize_t length)
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));
+ }
}
}
}