fix(events): make v:event readonly in more events (#18070)

This makes v:event readonly in these four events:
- ChanInfo
- ChanOpen
- RecordingLeave
- TermClose
This commit is contained in:
zeertzjq 2022-04-11 11:32:15 +08:00 committed by GitHub
parent cdfb045ea0
commit f89ca7194f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 35 additions and 0 deletions

View File

@ -836,6 +836,7 @@ static void set_info_event(void **argv)
typval_T retval; typval_T retval;
(void)object_to_vim(DICTIONARY_OBJ(info), &retval, NULL); (void)object_to_vim(DICTIONARY_OBJ(info), &retval, NULL);
tv_dict_add_dict(dict, S_LEN("info"), retval.vval.v_dict); tv_dict_add_dict(dict, S_LEN("info"), retval.vval.v_dict);
tv_dict_set_keys_readonly(dict);
apply_autocmds(event, NULL, NULL, false, curbuf); apply_autocmds(event, NULL, NULL, false, curbuf);

View File

@ -944,6 +944,7 @@ int do_record(int c)
buf[0] = (char)regname; buf[0] = (char)regname;
buf[1] = NUL; buf[1] = NUL;
(void)tv_dict_add_str(dict, S_LEN("regname"), buf); (void)tv_dict_add_str(dict, S_LEN("regname"), buf);
tv_dict_set_keys_readonly(dict);
// Get the recorded key hits. K_SPECIAL will be escaped, this // Get the recorded key hits. K_SPECIAL will be escaped, this
// needs to be removed again to put it in a register. exec_reg then // needs to be removed again to put it in a register. exec_reg then

View File

@ -336,6 +336,7 @@ void terminal_close(Terminal *term, int status)
save_v_event_T save_v_event; save_v_event_T save_v_event;
dict_T *dict = get_v_event(&save_v_event); dict_T *dict = get_v_event(&save_v_event);
tv_dict_add_nr(dict, S_LEN("status"), status); tv_dict_add_nr(dict, S_LEN("status"), status);
tv_dict_set_keys_readonly(dict);
apply_autocmds(EVENT_TERMCLOSE, NULL, NULL, false, buf); apply_autocmds(EVENT_TERMCLOSE, NULL, NULL, false, buf);
restore_v_event(dict, &save_v_event); restore_v_event(dict, &save_v_event);
} }

View File

@ -17,6 +17,7 @@ local command = helpers.command
local exc_exec = helpers.exc_exec local exc_exec = helpers.exc_exec
local exec_lua = helpers.exec_lua local exec_lua = helpers.exec_lua
local curbufmeths = helpers.curbufmeths local curbufmeths = helpers.curbufmeths
local retry = helpers.retry
local source = helpers.source local source = helpers.source
describe('autocmd', function() describe('autocmd', function()
@ -439,6 +440,37 @@ describe('autocmd', function()
]]} ]]}
end) end)
describe('v:event is readonly #18063', function()
it('during ChanOpen event', function()
command('autocmd ChanOpen * let v:event.info.id = 0')
funcs.jobstart({'cat'})
retry(nil, nil, function()
eq('E46: Cannot change read-only variable "v:event.info"', meths.get_vvar('errmsg'))
end)
end)
it('during ChanOpen event', function()
command('autocmd ChanInfo * let v:event.info.id = 0')
meths.set_client_info('foo', {}, 'remote', {}, {})
retry(nil, nil, function()
eq('E46: Cannot change read-only variable "v:event.info"', meths.get_vvar('errmsg'))
end)
end)
it('during RecordingLeave event', function()
command([[autocmd RecordingLeave * let v:event.regname = '']])
eq('Vim(let):E46: Cannot change read-only variable "v:event.regname"',
pcall_err(command, 'normal! qqq'))
end)
it('during TermClose event', function()
command('autocmd TermClose * let v:event.status = 0')
command('terminal')
eq('Vim(let):E46: Cannot change read-only variable "v:event.status"',
pcall_err(command, 'bdelete!'))
end)
end)
describe('old_tests', function() describe('old_tests', function()
it('vimscript: WinNew ++once', function() it('vimscript: WinNew ++once', function()
source [[ source [[