mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
Merge #12275 from erw7/profile-fix-use-after-free
viml/profile: fix missing fixes when merging vim-patch:8.1.0130 Fix #12255 ### Steps to reproduce using `nvim -u NORC` ``` nvim -u NORC :function Test() :endfunction :profile start log1 :profile func Test :call Test() :profile stop :profile start log2 :profile func Test :call Test() :profile stop ``` ### Actual behaviour #### log1 ``` FUNCTION Test() Called 1 times ... ``` #### log2 ``` FUNCTION Test() Called 2 times ... ``` ### Expected behaviour #### log1 ``` FUNCTION Test() Called 1 times ... ``` #### log2 ``` FUNCTION Test() Called 1 times ... ```
This commit is contained in:
commit
9816173fb3
@ -1038,16 +1038,17 @@ static void profile_reset(void)
|
||||
if (!HASHITEM_EMPTY(hi)) {
|
||||
n--;
|
||||
ufunc_T *uf = HI2UF(hi);
|
||||
if (uf->uf_profiling) {
|
||||
if (uf->uf_prof_initialized) {
|
||||
uf->uf_profiling = 0;
|
||||
uf->uf_tm_count = 0;
|
||||
uf->uf_tm_total = profile_zero();
|
||||
uf->uf_tm_self = profile_zero();
|
||||
uf->uf_tm_children = profile_zero();
|
||||
|
||||
XFREE_CLEAR(uf->uf_tml_count);
|
||||
XFREE_CLEAR(uf->uf_tml_total);
|
||||
XFREE_CLEAR(uf->uf_tml_self);
|
||||
for (int i = 0; i < uf->uf_lines.ga_len; i++) {
|
||||
uf->uf_tml_count[i] = 0;
|
||||
uf->uf_tml_total[i] = uf->uf_tml_self[i] = 0;
|
||||
}
|
||||
|
||||
uf->uf_tml_start = profile_zero();
|
||||
uf->uf_tml_children = profile_zero();
|
||||
|
@ -6,6 +6,9 @@ local eval = helpers.eval
|
||||
local command = helpers.command
|
||||
local eq, neq = helpers.eq, helpers.neq
|
||||
local tempfile = helpers.tmpname()
|
||||
local source = helpers.source
|
||||
local matches = helpers.matches
|
||||
local read_file = helpers.read_file
|
||||
|
||||
-- tmpname() also creates the file on POSIX systems. Remove it again.
|
||||
-- We just need the name, ignoring any race conditions.
|
||||
@ -32,7 +35,8 @@ describe(':profile', function()
|
||||
end
|
||||
end)
|
||||
|
||||
it('dump', function()
|
||||
describe('dump', function()
|
||||
it('works', function()
|
||||
eq(0, eval('v:profiling'))
|
||||
command('profile start ' .. tempfile)
|
||||
eq(1, eval('v:profiling'))
|
||||
@ -41,11 +45,57 @@ describe(':profile', function()
|
||||
assert_file_exists(tempfile)
|
||||
end)
|
||||
|
||||
it('stop', function()
|
||||
it('not resetting the profile', function()
|
||||
source([[
|
||||
function! Test()
|
||||
endfunction
|
||||
]])
|
||||
command('profile start ' .. tempfile)
|
||||
assert_file_exists_not(tempfile)
|
||||
command('profile func Test')
|
||||
command('call Test()')
|
||||
command('profile dump')
|
||||
assert_file_exists(tempfile)
|
||||
local profile = read_file(tempfile)
|
||||
matches('Called 1 time', profile)
|
||||
command('call Test()')
|
||||
command('profile dump')
|
||||
assert_file_exists(tempfile)
|
||||
profile = read_file(tempfile)
|
||||
matches('Called 2 time', profile)
|
||||
command('profile stop')
|
||||
end)
|
||||
end)
|
||||
|
||||
describe('stop', function()
|
||||
it('works', function()
|
||||
command('profile start ' .. tempfile)
|
||||
assert_file_exists_not(tempfile)
|
||||
command('profile stop')
|
||||
assert_file_exists(tempfile)
|
||||
eq(0, eval('v:profiling'))
|
||||
end)
|
||||
|
||||
it('resetting the profile', function()
|
||||
source([[
|
||||
function! Test()
|
||||
endfunction
|
||||
]])
|
||||
command('profile start ' .. tempfile)
|
||||
assert_file_exists_not(tempfile)
|
||||
command('profile func Test')
|
||||
command('call Test()')
|
||||
command('profile stop')
|
||||
assert_file_exists(tempfile)
|
||||
local profile = read_file(tempfile)
|
||||
matches('Called 1 time', profile)
|
||||
command('profile start ' .. tempfile)
|
||||
command('profile func Test')
|
||||
command('call Test()')
|
||||
command('profile stop')
|
||||
assert_file_exists(tempfile)
|
||||
profile = read_file(tempfile)
|
||||
matches('Called 1 time', profile)
|
||||
end)
|
||||
end)
|
||||
end)
|
||||
|
Loading…
Reference in New Issue
Block a user