Mercurial > vim
view src/testdir/test_smartindent.vim @ 33471:baa62f464436 v9.0.1988
patch 9.0.1988: Vim9: potential use-after-free for class members
Commit: https://github.com/vim/vim/commit/d2f4800099733216e28d59e1a5710f624b0d9ec1
Author: Yegappan Lakshmanan <yegappan@yahoo.com>
Date: Thu Oct 5 20:24:18 2023 +0200
patch 9.0.1988: Vim9: potential use-after-free for class members
Problem: Vim9: potential use-after-free for class members
Solution: Use the class-related grow array for storing the
member type instead of using a temporary type
list grow array
Use the type list grow array associated with the class than using a
temporary type list grow array to allocate the class member type.
For simple types, a predefined type is used. For complex types, the type
is dynamically allocated from a grow array. For class variables, the
type grow array in the class should be used. So that the lifetime of the
type is same as the lifetime of the class.
closes: #13279
Signed-off-by: Christian Brabandt <cb@256bit.org>
Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Thu, 05 Oct 2023 20:30:11 +0200 |
parents | 3942ea75b4c0 |
children |
line wrap: on
line source
" Tests for smartindent " Tests for not doing smart indenting when it isn't set. func Test_nosmartindent() new call append(0, [" some test text", \ " test text", \ "test text", \ " test text"]) set nocindent nosmartindent autoindent exe "normal! gg/some\<CR>" exe "normal! 2cc#test\<Esc>" call assert_equal(" #test", getline(1)) enew! | close endfunc func MyIndent() endfunc " When 'indentexpr' is set, setting 'si' has no effect. func Test_smartindent_has_no_effect() new exe "normal! i\<Tab>one\<Esc>" setlocal noautoindent smartindent indentexpr= exe "normal! Gotwo\<Esc>" call assert_equal("\ttwo", getline("$")) set indentexpr=MyIndent exe "normal! Gothree\<Esc>" call assert_equal("three", getline("$")) delfunction! MyIndent bwipe! endfunc " Test for inserting '{' and '} with smartindent func Test_smartindent_braces() new setlocal smartindent shiftwidth=4 call setline(1, [' if (a)', "\tif (b)", "\t return 1"]) normal 2ggO{ normal 3ggA { normal 4ggo} normal o} normal 4ggO#define FOO 1 call assert_equal([ \ ' if (a)', \ ' {', \ "\tif (b) {", \ '#define FOO 1', \ "\t return 1", \ "\t}", \ ' }' \ ], getline(1, '$')) close! endfunc " Test for adding a new line before and after comments with smartindent func Test_si_add_line_around_comment() new setlocal smartindent shiftwidth=4 call setline(1, [' A', '# comment1', '# comment2']) exe "normal GoC\<Esc>2GOB" call assert_equal([' A', ' B', '# comment1', '# comment2', ' C'], \ getline(1, '$')) close! endfunc " After a C style comment, indent for a following line should line up with the " line containing the start of the comment. func Test_si_indent_after_c_comment() new setlocal smartindent shiftwidth=4 fo+=ro exe "normal i\<C-t>/*\ncomment\n/\n#define FOOBAR\n75\<Esc>ggOabc" normal 3jOcont call assert_equal([' abc', ' /*', ' * comment', ' * cont', \ ' */', '#define FOOBAR', ' 75'], getline(1, '$')) close! endfunc " Test for indenting a statement after a if condition split across lines func Test_si_if_cond_split_across_lines() new setlocal smartindent shiftwidth=4 exe "normal i\<C-t>if (cond1 &&\n\<C-t>cond2) {\ni = 10;\n}" call assert_equal([' if (cond1 &&', "\t cond2) {", "\ti = 10;", \ ' }'], getline(1, '$')) close! endfunc " Test for inserting lines before and after a one line comment func Test_si_one_line_comment() new setlocal smartindent shiftwidth=4 exe "normal i\<C-t>abc;\n\<C-t>/* comment */" normal oi = 10; normal kOj = 1; call assert_equal([' abc;', "\tj = 1;", "\t/* comment */", "\ti = 10;"], \ getline(1, '$')) close! endfunc " Test for smartindent with a comment continued across multiple lines func Test_si_comment_line_continuation() new setlocal smartindent shiftwidth=4 call setline(1, ['# com1', '# com2 \', ' contd', '# com3', ' xyz']) normal ggOabc call assert_equal([' abc', '# com1', '# com2 \', ' contd', '# com3', \ ' xyz'], getline(1, '$')) close! endfunc " When 'paste' is set, 'smartindent' should not take effect. func Test_si_with_paste() new setlocal smartindent autoindent set paste " insert text that will trigger smartindent exe "norm! i {\nif (x)\ni = 1;\n#define FOO 1\nj = 2;\n}" exe "norm! Ok = 3;" exe "norm! 4G>>" call assert_equal([' {', 'if (x)', 'i = 1;', '#define FOO 1', \ 'j = 2;', 'k = 3;', '}'], getline(1, '$')) call assert_true(&smartindent) set nopaste %d _ exe "norm! i {\nif (x)\ni = 1;\n#define FOO 1\nj = 2;\n}" exe "norm! Ok = 3;" exe "norm! 4G>>" call assert_equal([' {', "\t if (x)", "\t\t i = 1;", \ '#define FOO 1', "\t\t j = 2;", "\t k = 3;", ' }'], \ getline(1, '$')) bw! endfunc func Test_si_after_completion() new setlocal ai smartindent indentexpr= call setline(1, 'foo foot') call feedkeys("o f\<C-X>\<C-N>#", 'tx') call assert_equal(' foo#', getline(2)) call setline(2, '') call feedkeys("1Go f\<C-X>\<C-N>}", 'tx') call assert_equal(' foo}', getline(2)) bwipe! endfunc func Test_no_si_after_completion() new call setline(1, 'foo foot') call feedkeys("o f\<C-X>\<C-N>#", 'tx') call assert_equal(' foo#', getline(2)) bwipe! endfunc " vim: shiftwidth=2 sts=2 expandtab