mirror of
https://github.com/neovim/neovim.git
synced 2025-10-07 02:16:31 +00:00
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.
This commit is contained in:
@@ -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;
|
||||
|
Reference in New Issue
Block a user