diff options
author | Björn Linse <bjorn.linse@gmail.com> | 2021-03-27 17:15:04 +0100 |
---|---|---|
committer | Björn Linse <bjorn.linse@gmail.com> | 2021-04-03 16:27:58 +0200 |
commit | 7e799502e513bd2e60120012b069eb67c1c511e7 (patch) | |
tree | 1d36a1c758117d365e423622c479f54540972604 /src/nvim/eval/funcs.c | |
parent | 623fe4dc7ede5d292bca66e0a132975b16a7c825 (diff) | |
download | rneovim-7e799502e513bd2e60120012b069eb67c1c511e7.tar.gz rneovim-7e799502e513bd2e60120012b069eb67c1c511e7.tar.bz2 rneovim-7e799502e513bd2e60120012b069eb67c1c511e7.zip |
luaref: simplify handling of table callables and fix leak in vim.fn.call(table)
I AM THE TABLE
Diffstat (limited to 'src/nvim/eval/funcs.c')
-rw-r--r-- | src/nvim/eval/funcs.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/src/nvim/eval/funcs.c b/src/nvim/eval/funcs.c index 38002474af..51e5a27348 100644 --- a/src/nvim/eval/funcs.c +++ b/src/nvim/eval/funcs.c @@ -810,6 +810,7 @@ static void f_call(typval_T *argvars, typval_T *rettv, FunPtr fptr) return; } + bool owned = false; char_u *func; partial_T *partial = NULL; dict_T *selfdict = NULL; @@ -820,6 +821,7 @@ static void f_call(typval_T *argvars, typval_T *rettv, FunPtr fptr) func = partial_name(partial); } else if (nlua_is_table_from_lua(&argvars[0])) { func = nlua_register_table_as_callable(&argvars[0]); + owned = true; } else { func = (char_u *)tv_get_string(&argvars[0]); } @@ -837,6 +839,9 @@ static void f_call(typval_T *argvars, typval_T *rettv, FunPtr fptr) } func_call(func, &argvars[1], partial, selfdict, rettv); + if (owned) { + func_unref(func); + } } /* |