diff options
author | bfredl <bjorn.linse@gmail.com> | 2024-02-11 15:46:14 +0100 |
---|---|---|
committer | bfredl <bjorn.linse@gmail.com> | 2024-02-13 11:54:44 +0100 |
commit | 0353dd3029f9ce31c3894530385443a90f6677ee (patch) | |
tree | fa288427461ee2c1ce1c271d01a760977a161bf5 /src/nvim/autocmd.c | |
parent | 89135cff030b06f60cd596a9ae81cd9583987517 (diff) | |
download | rneovim-0353dd3029f9ce31c3894530385443a90f6677ee.tar.gz rneovim-0353dd3029f9ce31c3894530385443a90f6677ee.tar.bz2 rneovim-0353dd3029f9ce31c3894530385443a90f6677ee.zip |
refactor(lua): use Arena when converting from lua stack to API args
and for return value of nlua_exec/nlua_call_ref, as this uses
the same family of functions.
NB: the handling of luaref:s is a bit of a mess.
add api_luarefs_free_XX functions as a stop-gap as refactoring
luarefs is a can of worms for another PR:s.
as a minor feature/bug-fix, nvim_buf_call and nvim_win_call now preserves
arbitrary return values.
Diffstat (limited to 'src/nvim/autocmd.c')
-rw-r--r-- | src/nvim/autocmd.c | 26 |
1 files changed, 10 insertions, 16 deletions
diff --git a/src/nvim/autocmd.c b/src/nvim/autocmd.c index 1edc60f230..3b747e0920 100644 --- a/src/nvim/autocmd.c +++ b/src/nvim/autocmd.c @@ -2002,15 +2002,15 @@ static bool call_autocmd_callback(const AutoCmd *ac, const AutoPatCmd *apc) { Callback callback = ac->exec.callable.cb; if (callback.type == kCallbackLua) { - Dictionary data = ARRAY_DICT_INIT; - PUT(data, "id", INTEGER_OBJ(ac->id)); - PUT(data, "event", CSTR_TO_OBJ(event_nr2name(apc->event))); - PUT(data, "match", CSTR_TO_OBJ(autocmd_match)); - PUT(data, "file", CSTR_TO_OBJ(autocmd_fname)); - PUT(data, "buf", INTEGER_OBJ(autocmd_bufnr)); + MAXSIZE_TEMP_DICT(data, 7); + PUT_C(data, "id", INTEGER_OBJ(ac->id)); + PUT_C(data, "event", CSTR_AS_OBJ(event_nr2name(apc->event))); + PUT_C(data, "match", CSTR_AS_OBJ(autocmd_match)); + PUT_C(data, "file", CSTR_AS_OBJ(autocmd_fname)); + PUT_C(data, "buf", INTEGER_OBJ(autocmd_bufnr)); if (apc->data) { - PUT(data, "data", copy_object(*apc->data, NULL)); + PUT_C(data, "data", *apc->data); } int group = ac->pat->group; @@ -2023,21 +2023,15 @@ static bool call_autocmd_callback(const AutoCmd *ac, const AutoPatCmd *apc) // omit group in these cases break; default: - PUT(data, "group", INTEGER_OBJ(group)); + PUT_C(data, "group", INTEGER_OBJ(group)); break; } MAXSIZE_TEMP_ARRAY(args, 1); ADD_C(args, DICTIONARY_OBJ(data)); - Object result = nlua_call_ref(callback.data.luaref, NULL, args, true, NULL); - bool ret = false; - if (result.type == kObjectTypeBoolean) { - ret = result.data.boolean; - } - api_free_dictionary(data); - api_free_object(result); - return ret; + Object result = nlua_call_ref(callback.data.luaref, NULL, args, kRetNilBool, NULL, NULL); + return LUARET_TRUTHY(result); } else { typval_T argsin = TV_INITIAL_VALUE; typval_T rettv = TV_INITIAL_VALUE; |