array: fix arr << arr bug

pull/3501/head
Alexander Medvednikov 2020-01-19 12:11:58 +00:00
parent 6e9822929f
commit cf1fd6e950
1 changed files with 23 additions and 14 deletions

View File

@ -66,19 +66,20 @@ fn new_array_from_c_array_no_alloc(len, cap, elm_size int, c_array voidptr) arra
// Private function. Doubles array capacity if needed
fn (a mut array) ensure_cap(required int) {
if required > a.cap {
mut cap := if a.cap == 0 { 2 } else { a.cap * 2 }
for required > cap && true {
cap *= 2
}
if a.cap == 0 {
a.data = calloc(cap * a.element_size)
}
else {
a.data = C.realloc(a.data, cap * a.element_size)
}
a.cap = cap
if required <= a.cap {
return
}
mut cap := if a.cap == 0 { 2 } else { a.cap * 2 }
for required > cap {
cap *= 2
}
if a.cap == 0 {
a.data = calloc(cap * a.element_size)
}
else {
a.data = C.realloc(a.data, cap * a.element_size)
}
a.cap = cap
}
// array.repeat returns new array with the given array elements
@ -280,8 +281,16 @@ fn (a mut array) push(val voidptr) {
// `val` is array.data
// TODO make private, right now it's used by strings.Builder
pub fn (a mut array) push_many(val voidptr, size int) {
a.ensure_cap(a.len + size)
C.memcpy(a.data + a.element_size * a.len, val, a.element_size * size)
// handle `arr << arr`
if a.data == val {
copy := a.clone()
a.ensure_cap(a.len + size)
//C.memcpy(a.data, copy.data, copy.element_size * copy.len)
C.memcpy(a.data + a.element_size * a.len, copy.data, a.element_size * size)
} else {
a.ensure_cap(a.len + size)
C.memcpy(a.data + a.element_size * a.len, val, a.element_size * size)
}
a.len += size
}