diff options
author | zeertzjq <zeertzjq@outlook.com> | 2022-12-03 03:44:37 +0800 |
---|---|---|
committer | zeertzjq <zeertzjq@outlook.com> | 2022-12-03 04:05:18 +0800 |
commit | afb3ff52ecafe2d5bd1239869124794bb2ac68b9 (patch) | |
tree | 6be3628f7d152c1f703f59fa1050039c90244707 | |
parent | 1e6d5fdf3f15142dafef6c5bd32ebacf383460f1 (diff) | |
download | rneovim-afb3ff52ecafe2d5bd1239869124794bb2ac68b9.tar.gz rneovim-afb3ff52ecafe2d5bd1239869124794bb2ac68b9.tar.bz2 rneovim-afb3ff52ecafe2d5bd1239869124794bb2ac68b9.zip |
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)
https://github.com/vim/vim/commit/c96b7f5d2af241c5eb1589e9da3dc09e45355e65
Co-authored-by: Bram Moolenaar <Bram@vim.org>
-rw-r--r-- | src/nvim/eval.c | 15 | ||||
-rw-r--r-- | src/nvim/testdir/test_quickfix.vim | 12 |
2 files changed, 19 insertions, 8 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c index d8dbcf6eb0..6d8f4d092c 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -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) 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->data.funcref = NULL; } else { + callback->data.funcref = NULL; if (arg->v_type == VAR_STRING) { - char *newname = get_scriptlocal_funcname(arg->vval.v_string); - if (newname != NULL) { - xfree(arg->vval.v_string); - name = arg->vval.v_string = newname; - } + callback->data.funcref = get_scriptlocal_funcname(name); } - - func_ref((char_u *)name); - callback->data.funcref = xstrdup(name); + if (callback->data.funcref == NULL) { + callback->data.funcref = xstrdup(name); + } + func_ref((char_u *)callback->data.funcref); callback->type = kCallbackFuncref; } } else if (nlua_is_table_from_lua(arg)) { diff --git a/src/nvim/testdir/test_quickfix.vim b/src/nvim/testdir/test_quickfix.vim index a6c0b2491a..7b94c4027c 100644 --- a/src/nvim/testdir/test_quickfix.vim +++ b/src/nvim/testdir/test_quickfix.vim @@ -6180,5 +6180,17 @@ func Test_loclist_replace_autocmd() call setloclist(0, [], 'f') 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 |