mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
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:
commit
6fcbcf72c3
@ -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;
|
||||||
|
@ -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,
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user