mirror of
https://github.com/neovim/neovim.git
synced 2025-09-15 07:48:18 +00:00
eval: let getreg() return valid list for an undefined register
vim-patch:7.4.1755 this prevents a crash when the list is used in setreg() later
This commit is contained in:
@@ -10096,9 +10096,10 @@ static void f_getreg(typval_T *argvars, typval_T *rettv)
|
|||||||
rettv->v_type = VAR_LIST;
|
rettv->v_type = VAR_LIST;
|
||||||
rettv->vval.v_list =
|
rettv->vval.v_list =
|
||||||
get_reg_contents(regname, (arg2 ? kGRegExprSrc : 0) | kGRegList);
|
get_reg_contents(regname, (arg2 ? kGRegExprSrc : 0) | kGRegList);
|
||||||
if (rettv->vval.v_list != NULL) {
|
if (rettv->vval.v_list == NULL) {
|
||||||
rettv->vval.v_list->lv_refcount++;
|
rettv->vval.v_list = list_alloc();
|
||||||
}
|
}
|
||||||
|
rettv->vval.v_list->lv_refcount++;
|
||||||
} else {
|
} else {
|
||||||
rettv->v_type = VAR_STRING;
|
rettv->v_type = VAR_STRING;
|
||||||
rettv->vval.v_string = get_reg_contents(regname, arg2 ? kGRegExprSrc : 0);
|
rettv->vval.v_string = get_reg_contents(regname, arg2 ? kGRegExprSrc : 0);
|
||||||
|
@@ -69,6 +69,7 @@ static char *features[] = {
|
|||||||
|
|
||||||
// clang-format off
|
// clang-format off
|
||||||
static int included_patches[] = {
|
static int included_patches[] = {
|
||||||
|
1755,
|
||||||
1654,
|
1654,
|
||||||
1652,
|
1652,
|
||||||
1643,
|
1643,
|
||||||
|
@@ -495,6 +495,28 @@ describe('eval', function()
|
|||||||
' abcE4b10-4\000abcE4b10-4-2')
|
' abcE4b10-4\000abcE4b10-4-2')
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it('getreg("a",1,1) returns a valid list when "a is unset', function()
|
||||||
|
-- Precondition: "a is actually unset and "0 is nonempty
|
||||||
|
eq('', eval("getregtype('a')"))
|
||||||
|
eq('', eval("getreg('a')"))
|
||||||
|
execute("call setreg('0','text')")
|
||||||
|
|
||||||
|
-- This used to return a NULL list
|
||||||
|
-- which setreg didn't handle
|
||||||
|
execute("let x = getreg('a',1,1)")
|
||||||
|
execute("call setreg('0',x)")
|
||||||
|
|
||||||
|
-- nvim didn't crash and "0 was emptied
|
||||||
|
eq(2, eval("1+1"))
|
||||||
|
eq({}, eval("getreg('0',1,1)"))
|
||||||
|
|
||||||
|
-- x is a mutable list
|
||||||
|
execute("let y = x")
|
||||||
|
eq({}, eval("y"))
|
||||||
|
execute("call add(x, 'item')")
|
||||||
|
eq({'item'}, eval("y"))
|
||||||
|
end)
|
||||||
|
|
||||||
it('search and expressions', function()
|
it('search and expressions', function()
|
||||||
execute('so test_eval_setup.vim')
|
execute('so test_eval_setup.vim')
|
||||||
execute([=[call SetReg('/', ['abc/'])]=])
|
execute([=[call SetReg('/', ['abc/'])]=])
|
||||||
|
@@ -270,9 +270,7 @@ describe('ShaDa forward compatibility support code', function()
|
|||||||
it('works with register item with type 10', function()
|
it('works with register item with type 10', function()
|
||||||
wshada('\005\001\019\132\161na\162rX\194\162rc\145\196\001-\162rt\010')
|
wshada('\005\001\019\132\161na\162rX\194\162rc\145\196\001-\162rt\010')
|
||||||
eq(0, exc_exec(sdrcmd(true)))
|
eq(0, exc_exec(sdrcmd(true)))
|
||||||
-- getreg may return empty list as list with NULL pointer which API
|
eq({}, funcs.getreg('a', 1, 1))
|
||||||
-- translates into nil for some reason.
|
|
||||||
eq(NIL, funcs.getreg('a', 1, 1) or {})
|
|
||||||
eq('', funcs.getregtype('a'))
|
eq('', funcs.getregtype('a'))
|
||||||
nvim_command('wshada ' .. shada_fname)
|
nvim_command('wshada ' .. shada_fname)
|
||||||
local found = 0
|
local found = 0
|
||||||
|
@@ -43,9 +43,9 @@ describe('ShaDa support code', function()
|
|||||||
setreg('b', {'bca', 'abc', 'cba'}, 'b3')
|
setreg('b', {'bca', 'abc', 'cba'}, 'b3')
|
||||||
nvim_command('qall')
|
nvim_command('qall')
|
||||||
reset()
|
reset()
|
||||||
eq({NIL, ''}, getreg('c'))
|
eq({{}, ''}, getreg('c'))
|
||||||
eq({NIL, ''}, getreg('l'))
|
eq({{}, ''}, getreg('l'))
|
||||||
eq({NIL, ''}, getreg('b'))
|
eq({{}, ''}, getreg('b'))
|
||||||
end)
|
end)
|
||||||
|
|
||||||
it('does restore registers with zero <', function()
|
it('does restore registers with zero <', function()
|
||||||
@@ -67,9 +67,9 @@ describe('ShaDa support code', function()
|
|||||||
setreg('b', {'bca', 'abc', 'cba'}, 'b3')
|
setreg('b', {'bca', 'abc', 'cba'}, 'b3')
|
||||||
nvim_command('qall')
|
nvim_command('qall')
|
||||||
reset()
|
reset()
|
||||||
eq({NIL, ''}, getreg('c'))
|
eq({{}, ''}, getreg('c'))
|
||||||
eq({NIL, ''}, getreg('l'))
|
eq({{}, ''}, getreg('l'))
|
||||||
eq({NIL, ''}, getreg('b'))
|
eq({{}, ''}, getreg('b'))
|
||||||
end)
|
end)
|
||||||
|
|
||||||
it('does restore registers with zero "', function()
|
it('does restore registers with zero "', function()
|
||||||
@@ -103,7 +103,7 @@ describe('ShaDa support code', function()
|
|||||||
nvim_command('qall')
|
nvim_command('qall')
|
||||||
reset()
|
reset()
|
||||||
eq({{'d'}, 'v'}, getreg('o'))
|
eq({{'d'}, 'v'}, getreg('o'))
|
||||||
eq({NIL, ''}, getreg('t'))
|
eq({{}, ''}, getreg('t'))
|
||||||
end)
|
end)
|
||||||
|
|
||||||
it('does limit number of lines according to "', function()
|
it('does limit number of lines according to "', function()
|
||||||
@@ -113,7 +113,7 @@ describe('ShaDa support code', function()
|
|||||||
nvim_command('qall')
|
nvim_command('qall')
|
||||||
reset()
|
reset()
|
||||||
eq({{'d'}, 'v'}, getreg('o'))
|
eq({{'d'}, 'v'}, getreg('o'))
|
||||||
eq({NIL, ''}, getreg('t'))
|
eq({{}, ''}, getreg('t'))
|
||||||
end)
|
end)
|
||||||
|
|
||||||
it('does limit number of lines according to < rather then "', function()
|
it('does limit number of lines according to < rather then "', function()
|
||||||
@@ -125,7 +125,7 @@ describe('ShaDa support code', function()
|
|||||||
reset()
|
reset()
|
||||||
eq({{'d'}, 'v'}, getreg('o'))
|
eq({{'d'}, 'v'}, getreg('o'))
|
||||||
eq({{'a', 'b', 'cde'}, 'V'}, getreg('t'))
|
eq({{'a', 'b', 'cde'}, 'V'}, getreg('t'))
|
||||||
eq({NIL, ''}, getreg('h'))
|
eq({{}, ''}, getreg('h'))
|
||||||
end)
|
end)
|
||||||
|
|
||||||
it('dumps and loads register correctly when &encoding is not UTF-8',
|
it('dumps and loads register correctly when &encoding is not UTF-8',
|
||||||
|
Reference in New Issue
Block a user