mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
builtin: zero out internal map/array pointers on m.free(), to reduce the work for the GC mark phase for non escaping maps/arrays, used in hot loops (#18415)
This commit is contained in:
@ -728,11 +728,15 @@ pub fn (m &map) clone() map {
|
||||
[unsafe]
|
||||
pub fn (m &map) free() {
|
||||
unsafe { free(m.metas) }
|
||||
unsafe {
|
||||
m.metas = nil
|
||||
}
|
||||
if m.key_values.deletes == 0 {
|
||||
for i := 0; i < m.key_values.len; i++ {
|
||||
unsafe {
|
||||
pkey := m.key_values.key(i)
|
||||
m.free_fn(pkey)
|
||||
vmemset(pkey, 0, m.key_bytes)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@ -743,12 +747,28 @@ pub fn (m &map) free() {
|
||||
unsafe {
|
||||
pkey := m.key_values.key(i)
|
||||
m.free_fn(pkey)
|
||||
vmemset(pkey, 0, m.key_bytes)
|
||||
}
|
||||
}
|
||||
unsafe { free(m.key_values.all_deleted) }
|
||||
}
|
||||
unsafe {
|
||||
free(m.key_values.keys)
|
||||
free(m.key_values.values)
|
||||
if m.key_values.all_deleted != nil {
|
||||
free(m.key_values.all_deleted)
|
||||
m.key_values.all_deleted = nil
|
||||
}
|
||||
if m.key_values.keys != nil {
|
||||
free(m.key_values.keys)
|
||||
m.key_values.keys = nil
|
||||
}
|
||||
if m.key_values.values != nil {
|
||||
free(m.key_values.values)
|
||||
m.key_values.values = nil
|
||||
}
|
||||
// TODO: the next lines assume that callback functions are static and independent from each particular
|
||||
// map instance. Closures may invalidate that assumption, so revisit when RC for closures works.
|
||||
m.hash_fn = nil
|
||||
m.key_eq_fn = nil
|
||||
m.clone_fn = nil
|
||||
m.free_fn = nil
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user