1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

builtin: don't memdup element for array.pop (depends on how cgen works) (#13789)

The voidptr returned is immediately dereferenced in cgen so the memory
is copied before the array can be appended to: `*(int*)array_pop(&a)`
This commit is contained in:
Nick Treleaven 2022-03-21 21:34:35 +00:00 committed by GitHub
parent f66d2f5d43
commit afbccf79f7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -402,12 +402,13 @@ pub fn (mut a array) pop() voidptr {
a.len = new_len a.len = new_len
// Note: a.cap is not changed here *on purpose*, so that // Note: a.cap is not changed here *on purpose*, so that
// further << ops on that array will be more efficient. // further << ops on that array will be more efficient.
return unsafe { memdup(last_elem, a.element_size) } return last_elem
} }
// delete_last efficiently deletes the last element of the array. // delete_last efficiently deletes the last element of the array.
// It does it simply by reducing the length of the array by 1. // It does it simply by reducing the length of the array by 1.
// If the array is empty, this will panic. // If the array is empty, this will panic.
// See also: [trim](#array.trim)
pub fn (mut a array) delete_last() { pub fn (mut a array) delete_last() {
// copy pasting code for performance // copy pasting code for performance
$if !no_bounds_checking ? { $if !no_bounds_checking ? {