mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +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:
		 Jan Edmund Lazo
					Jan Edmund Lazo
				
			
				
					committed by
					
						 Jan Edmund Lazo
						Jan Edmund Lazo
					
				
			
			
				
	
			
			
			 Jan Edmund Lazo
						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