mirror of
https://github.com/neovim/neovim.git
synced 2025-10-07 02:16:31 +00:00
refactor(api): use an arena for mappings
This commit is contained in:
@@ -294,7 +294,7 @@ Array nvim_get_autocmds(Dict(get_autocmds) *opts, Error *err)
|
||||
break;
|
||||
case kCallbackFuncref:
|
||||
case kCallbackPartial:
|
||||
PUT(autocmd_info, "callback", CSTR_AS_OBJ(callback_to_string(cb)));
|
||||
PUT(autocmd_info, "callback", CSTR_AS_OBJ(callback_to_string(cb, NULL)));
|
||||
break;
|
||||
case kCallbackNone:
|
||||
abort();
|
||||
|
@@ -905,7 +905,7 @@ Integer nvim_buf_get_changedtick(Buffer buffer, Error *err)
|
||||
/// @param[out] err Error details, if any
|
||||
/// @returns Array of |maparg()|-like dictionaries describing mappings.
|
||||
/// The "buffer" key holds the associated buffer handle.
|
||||
ArrayOf(Dictionary) nvim_buf_get_keymap(Buffer buffer, String mode, Error *err)
|
||||
ArrayOf(Dictionary) nvim_buf_get_keymap(Buffer buffer, String mode, Arena *arena, Error *err)
|
||||
FUNC_API_SINCE(3)
|
||||
{
|
||||
buf_T *buf = find_buffer_by_handle(buffer, err);
|
||||
@@ -914,7 +914,7 @@ ArrayOf(Dictionary) nvim_buf_get_keymap(Buffer buffer, String mode, Error *err)
|
||||
return (Array)ARRAY_DICT_INIT;
|
||||
}
|
||||
|
||||
return keymap_array(mode, buf);
|
||||
return keymap_array(mode, buf, arena);
|
||||
}
|
||||
|
||||
/// Sets a buffer-local |mapping| for the given mode.
|
||||
|
@@ -346,7 +346,7 @@ Array nvim_buf_get_extmarks(Buffer buffer, Integer ns_id, Object start, Object e
|
||||
|
||||
rv = arena_array(arena, kv_size(marks));
|
||||
for (size_t i = 0; i < kv_size(marks); i++) {
|
||||
ADD(rv, ARRAY_OBJ(extmark_to_array(kv_A(marks, i), true, details, hl_name, arena)));
|
||||
ADD_C(rv, ARRAY_OBJ(extmark_to_array(kv_A(marks, i), true, details, hl_name, arena)));
|
||||
}
|
||||
|
||||
kv_destroy(marks);
|
||||
|
@@ -581,6 +581,15 @@ String arena_string(Arena *arena, String str)
|
||||
}
|
||||
}
|
||||
|
||||
Array arena_take_arraybuilder(Arena *arena, ArrayBuilder *arr)
|
||||
{
|
||||
Array ret = arena_array(arena, kv_size(*arr));
|
||||
ret.size = kv_size(*arr);
|
||||
memcpy((ret).items, (*arr).items, sizeof((ret).items[0]) * (ret).size);
|
||||
kvi_destroy(*arr);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void api_free_object(Object value)
|
||||
{
|
||||
switch (value.type) {
|
||||
|
@@ -95,6 +95,8 @@
|
||||
name.capacity = maxsize; \
|
||||
name.items = name##__items; \
|
||||
|
||||
typedef kvec_withinit_t(Object, 16) ArrayBuilder;
|
||||
|
||||
#define cbuf_as_string(d, s) ((String) { .data = d, .size = s })
|
||||
|
||||
#define STATIC_CSTR_AS_STRING(s) ((String) { .data = s, .size = sizeof("" s) - 1 })
|
||||
|
@@ -1456,10 +1456,10 @@ Dictionary nvim_get_mode(Arena *arena)
|
||||
/// @param mode Mode short-name ("n", "i", "v", ...)
|
||||
/// @returns Array of |maparg()|-like dictionaries describing mappings.
|
||||
/// The "buffer" key is always zero.
|
||||
ArrayOf(Dictionary) nvim_get_keymap(String mode)
|
||||
ArrayOf(Dictionary) nvim_get_keymap(String mode, Arena *arena)
|
||||
FUNC_API_SINCE(3)
|
||||
{
|
||||
return keymap_array(mode, NULL);
|
||||
return keymap_array(mode, NULL, arena);
|
||||
}
|
||||
|
||||
/// Sets a global |mapping| for the given mode.
|
||||
|
@@ -77,15 +77,16 @@ void nvim_win_set_buf(Window window, Buffer buffer, Error *err)
|
||||
/// @param window Window handle, or 0 for current window
|
||||
/// @param[out] err Error details, if any
|
||||
/// @return (row, col) tuple
|
||||
ArrayOf(Integer, 2) nvim_win_get_cursor(Window window, Error *err)
|
||||
ArrayOf(Integer, 2) nvim_win_get_cursor(Window window, Arena *arena, Error *err)
|
||||
FUNC_API_SINCE(1)
|
||||
{
|
||||
Array rv = ARRAY_DICT_INIT;
|
||||
win_T *win = find_window_by_handle(window, err);
|
||||
|
||||
if (win) {
|
||||
ADD(rv, INTEGER_OBJ(win->w_cursor.lnum));
|
||||
ADD(rv, INTEGER_OBJ(win->w_cursor.col));
|
||||
rv = arena_array(arena, 2);
|
||||
ADD_C(rv, INTEGER_OBJ(win->w_cursor.lnum));
|
||||
ADD_C(rv, INTEGER_OBJ(win->w_cursor.col));
|
||||
}
|
||||
|
||||
return rv;
|
||||
|
Reference in New Issue
Block a user