aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/nvim/eval.c15
-rw-r--r--src/nvim/testdir/test_quickfix.vim12
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