shada: fix write E5004 error on exit

Fix the problem of failing to write shada when the global variable contains
Funcref or Partial.
This commit is contained in:
erw7 2020-06-07 01:31:23 +09:00
parent dbc8ec9446
commit 9fc3949841
3 changed files with 24 additions and 13 deletions

View File

@ -2676,6 +2676,13 @@ static ShaDaWriteResult shada_write(ShaDaWriteDef *const sd_writer,
if (name == NULL) { if (name == NULL) {
break; break;
} }
switch (vartv.v_type) {
case VAR_FUNC:
case VAR_PARTIAL:
continue;
default:
break;
}
typval_T tgttv; typval_T tgttv;
tv_copy(&vartv, &tgttv); tv_copy(&vartv, &tgttv);
ShaDaWriteResult spe_ret; ShaDaWriteResult spe_ret;

View File

@ -494,14 +494,6 @@ $
eq(0, exc_exec('wshada! ' .. shada_fname)) eq(0, exc_exec('wshada! ' .. shada_fname))
end) end)
it('errors when a funcref is stored in a variable', function()
nvim_command('let F = function("tr")')
nvim_command('set shada+=!')
eq('\nE5004: Error while dumping variable g:F, itself: attempt to dump function reference'
.. '\nE574: Failed to write variable F',
redir_exec('wshada'))
end)
it('errors when a self-referencing list is stored in a variable', function() it('errors when a self-referencing list is stored in a variable', function()
nvim_command('let L = []') nvim_command('let L = []')
nvim_command('call add(L, L)') nvim_command('call add(L, L)')

View File

@ -121,15 +121,27 @@ describe('ShaDa support code', function()
meths.get_var('NESTEDVAR')) meths.get_var('NESTEDVAR'))
end) end)
it('errors and writes when a funcref is stored in a variable', it('ignore when a funcref is stored in a variable',
function() function()
nvim_command('let F = function("tr")') nvim_command('let F = function("tr")')
meths.set_var('U', '10') meths.set_var('U', '10')
nvim_command('set shada+=!') nvim_command('set shada+=!')
eq('Vim(wshada):E5004: Error while dumping variable g:F, itself: attempt to dump function reference', nvim_command('wshada')
exc_exec('wshada')) reset()
meths.set_option('shada', '') nvim_command('set shada+=!')
reset('set shada+=!') nvim_command('rshada')
eq('10', meths.get_var('U'))
end)
it('ignore when a partial is stored in a variable',
function()
nvim_command('let P = { -> 1 }')
meths.set_var('U', '10')
nvim_command('set shada+=!')
nvim_command('wshada')
reset()
nvim_command('set shada+=!')
nvim_command('rshada')
eq('10', meths.get_var('U')) eq('10', meths.get_var('U'))
end) end)