Merge pull request #12448 from erw7/fix-shada-write-error-on-exit

Fix shada write error on exit, vim-patch:8.2.0920
This commit is contained in:
Matthieu Coudron 2020-07-19 21:17:55 +02:00 committed by GitHub
commit 6fcbcf72c3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 55 additions and 31 deletions

View File

@ -2676,6 +2676,36 @@ 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:
tv_clear(&vartv);
continue;
case VAR_DICT:
{
dict_T *di = vartv.vval.v_dict;
int copyID = get_copyID();
if (!set_ref_in_ht(&di->dv_hashtab, copyID, NULL)
&& copyID == di->dv_copyID) {
tv_clear(&vartv);
continue;
}
break;
}
case VAR_LIST:
{
list_T *l = vartv.vval.v_list;
int copyID = get_copyID();
if (!set_ref_in_list(l, copyID, NULL)
&& copyID == l->lv_copyID) {
tv_clear(&vartv);
continue;
}
break;
}
default:
break;
}
typval_T tgttv; typval_T tgttv;
tv_copy(&vartv, &tgttv); tv_copy(&vartv, &tgttv);
ShaDaWriteResult spe_ret; ShaDaWriteResult spe_ret;

View File

@ -1,7 +1,7 @@
-- ShaDa errors handling support -- ShaDa errors handling support
local helpers = require('test.functional.helpers')(after_each) local helpers = require('test.functional.helpers')(after_each)
local nvim_command, eq, exc_exec, redir_exec = local nvim_command, eq, exc_exec =
helpers.command, helpers.eq, helpers.exc_exec, helpers.redir_exec helpers.command, helpers.eq, helpers.exc_exec
local shada_helpers = require('test.functional.shada.helpers') local shada_helpers = require('test.functional.shada.helpers')
local reset, clear, get_shada_rw = local reset, clear, get_shada_rw =
@ -494,23 +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()
nvim_command('let L = []')
nvim_command('call add(L, L)')
nvim_command('set shada+=!')
eq('\nE5005: Unable to dump variable g:L: container references itself in index 0'
.. '\nE574: Failed to write variable L',
redir_exec('wshada'))
end)
it('errors with too large items', function() it('errors with too large items', function()
wshada({ wshada({
1, 206, 70, 90, 31, 179, 86, 133, 169, 103, 101, 110, 101, 114, 97, 1, 206, 70, 90, 31, 179, 86, 133, 169, 103, 101, 110, 101, 114, 97,

View File

@ -1,7 +1,7 @@
-- ShaDa variables saving/reading support -- ShaDa variables saving/reading support
local helpers = require('test.functional.helpers')(after_each) local helpers = require('test.functional.helpers')(after_each)
local meths, funcs, nvim_command, eq, exc_exec = local meths, funcs, nvim_command, eq =
helpers.meths, helpers.funcs, helpers.command, helpers.eq, helpers.exc_exec helpers.meths, helpers.funcs, helpers.command, helpers.eq
local shada_helpers = require('test.functional.shada.helpers') local shada_helpers = require('test.functional.shada.helpers')
local reset, clear = shada_helpers.reset, shada_helpers.clear local reset, clear = shada_helpers.reset, shada_helpers.clear
@ -121,28 +121,39 @@ 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')) eq('10', meths.get_var('U'))
end) end)
it('errors and writes when a self-referencing list is stored in a variable', 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'))
end)
it('ignore when a self-referencing list is stored in a variable',
function() function()
meths.set_var('L', {}) meths.set_var('L', {})
nvim_command('call add(L, L)') nvim_command('call add(L, L)')
meths.set_var('U', '10') meths.set_var('U', '10')
nvim_command('set shada+=!') nvim_command('set shada+=!')
eq('Vim(wshada):E5005: Unable to dump variable g:L: container references itself in index 0', nvim_command('wshada')
exc_exec('wshada')) reset()
meths.set_option('shada', '') nvim_command('rshada')
reset('set shada+=!')
eq('10', meths.get_var('U')) eq('10', meths.get_var('U'))
end) end)
end) end)