mirror of
https://github.com/neovim/neovim.git
synced 2025-09-06 03:18:16 +00:00
vim-patch:8.0.1372: profile log may be truncated halfway a character
Problem: Profile log may be truncated halfway a character.
Solution: Find the start of the character. (Ozaki Kiichi, closes vim/vim#2385)
ac112f01a6
nvim does not support "--clean" yet but "-es" should suffice for the test.
This commit is contained in:

committed by
Jan Edmund Lazo

parent
4352d41db0
commit
c1ee5e0694
@@ -1152,6 +1152,21 @@ static void script_dump_profile(FILE *fd)
|
|||||||
if (vim_fgets(IObuff, IOSIZE, sfd)) {
|
if (vim_fgets(IObuff, IOSIZE, sfd)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
// When a line has been truncated, append NL, taking care
|
||||||
|
// of multi-byte characters .
|
||||||
|
if (IObuff[IOSIZE - 2] != NUL && IObuff[IOSIZE - 2] != NL) {
|
||||||
|
int n = IOSIZE - 2;
|
||||||
|
|
||||||
|
// Move to the first byte of this char.
|
||||||
|
// utf_head_off() doesn't work, because it checks
|
||||||
|
// for a truncated character.
|
||||||
|
while (n > 0 && (IObuff[n] & 0xc0) == 0x80) {
|
||||||
|
n--;
|
||||||
|
}
|
||||||
|
|
||||||
|
IObuff[n] = NL;
|
||||||
|
IObuff[n + 1] = NUL;
|
||||||
|
}
|
||||||
if (i < si->sn_prl_ga.ga_len
|
if (i < si->sn_prl_ga.ga_len
|
||||||
&& (pp = &PRL_ITEM(si, i))->snp_count > 0) {
|
&& (pp = &PRL_ITEM(si, i))->snp_count > 0) {
|
||||||
fprintf(fd, "%5d ", pp->snp_count);
|
fprintf(fd, "%5d ", pp->snp_count);
|
||||||
|
@@ -181,3 +181,44 @@ func Test_profile_errors()
|
|||||||
call assert_fails("profile pause", 'E750:')
|
call assert_fails("profile pause", 'E750:')
|
||||||
call assert_fails("profile continue", 'E750:')
|
call assert_fails("profile continue", 'E750:')
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Test_profile_truncate_mbyte()
|
||||||
|
if !has('multi_byte') || &enc !=# 'utf-8'
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
let lines = [
|
||||||
|
\ 'scriptencoding utf-8',
|
||||||
|
\ 'func! Foo()',
|
||||||
|
\ ' return [',
|
||||||
|
\ ' \ "' . join(map(range(0x4E00, 0x4E00 + 340), 'nr2char(v:val)'), '') . '",',
|
||||||
|
\ ' \ "' . join(map(range(0x4F00, 0x4F00 + 340), 'nr2char(v:val)'), '') . '",',
|
||||||
|
\ ' \ ]',
|
||||||
|
\ 'endfunc',
|
||||||
|
\ 'call Foo()',
|
||||||
|
\ ]
|
||||||
|
|
||||||
|
call writefile(lines, 'Xprofile_file.vim')
|
||||||
|
call system(v:progpath
|
||||||
|
\ . ' -es --cmd "set enc=utf-8"'
|
||||||
|
\ . ' -c "profile start Xprofile_file.log"'
|
||||||
|
\ . ' -c "profile file Xprofile_file.vim"'
|
||||||
|
\ . ' -c "so Xprofile_file.vim"'
|
||||||
|
\ . ' -c "qall!"')
|
||||||
|
call assert_equal(0, v:shell_error)
|
||||||
|
|
||||||
|
split Xprofile_file.log
|
||||||
|
if &fenc != ''
|
||||||
|
call assert_equal('utf-8', &fenc)
|
||||||
|
endif
|
||||||
|
/func! Foo()
|
||||||
|
let lnum = line('.')
|
||||||
|
call assert_match('^\s*return \[$', getline(lnum + 1))
|
||||||
|
call assert_match("\u4F52$", getline(lnum + 2))
|
||||||
|
call assert_match("\u5052$", getline(lnum + 3))
|
||||||
|
call assert_match('^\s*\\ \]$', getline(lnum + 4))
|
||||||
|
bwipe!
|
||||||
|
|
||||||
|
call delete('Xprofile_file.vim')
|
||||||
|
call delete('Xprofile_file.log')
|
||||||
|
endfunc
|
||||||
|
Reference in New Issue
Block a user