vim-patch:9.0.0990: callback name argument is changed by setqflist()

Problem:    Callback name argument is changed by setqflist().
Solution:   Use the expanded function name for the callback, do not store it
            in the argument. (closes vim/vim#11653)

c96b7f5d2a

Co-authored-by: Bram Moolenaar <Bram@vim.org>
This commit is contained in:
zeertzjq
2022-12-03 03:44:37 +08:00
parent 1e6d5fdf3f
commit afb3ff52ec
2 changed files with 19 additions and 8 deletions

View File

@@ -5510,6 +5510,7 @@ void get_system_output_as_rettv(typval_T *argvars, typval_T *rettv, bool retlist
} }
} }
/// Get a callback from "arg". It can be a Funcref or a function name.
bool callback_from_typval(Callback *const callback, typval_T *const arg) bool callback_from_typval(Callback *const callback, typval_T *const arg)
FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT FUNC_ATTR_NONNULL_ALL FUNC_ATTR_WARN_UNUSED_RESULT
{ {
@@ -5531,16 +5532,14 @@ bool callback_from_typval(Callback *const callback, typval_T *const arg)
callback->type = kCallbackNone; callback->type = kCallbackNone;
callback->data.funcref = NULL; callback->data.funcref = NULL;
} else { } else {
callback->data.funcref = NULL;
if (arg->v_type == VAR_STRING) { if (arg->v_type == VAR_STRING) {
char *newname = get_scriptlocal_funcname(arg->vval.v_string); callback->data.funcref = get_scriptlocal_funcname(name);
if (newname != NULL) {
xfree(arg->vval.v_string);
name = arg->vval.v_string = newname;
}
} }
if (callback->data.funcref == NULL) {
func_ref((char_u *)name); callback->data.funcref = xstrdup(name);
callback->data.funcref = xstrdup(name); }
func_ref((char_u *)callback->data.funcref);
callback->type = kCallbackFuncref; callback->type = kCallbackFuncref;
} }
} else if (nlua_is_table_from_lua(arg)) { } else if (nlua_is_table_from_lua(arg)) {

View File

@@ -6180,5 +6180,17 @@ func Test_loclist_replace_autocmd()
call setloclist(0, [], 'f') call setloclist(0, [], 'f')
endfunc endfunc
func s:QfTf(_)
endfunc
func Test_setqflist_cb_arg()
" This was changing the callback name in the dictionary.
let d = #{quickfixtextfunc: 's:QfTf'}
call setqflist([], 'a', d)
call assert_equal('s:QfTf', d.quickfixtextfunc)
call setqflist([], 'f')
endfunc
" vim: shiftwidth=2 sts=2 expandtab " vim: shiftwidth=2 sts=2 expandtab