mirror of
https://github.com/neovim/neovim.git
synced 2025-10-10 03:46:31 +00:00
api/msgpack-rpc: Refactor msgpack_rpc_helpers.{c,h}
- Move helpers that are specific to API types to api/private/helpers.{c,h} - Include headers with generated declarations - Delete unused macros
This commit is contained in:
@@ -449,6 +449,64 @@ bool object_to_vim(Object obj, typval_T *tv, Error *err)
|
||||
return true;
|
||||
}
|
||||
|
||||
void api_free_string(String value)
|
||||
{
|
||||
if (!value.data) {
|
||||
return;
|
||||
}
|
||||
|
||||
free(value.data);
|
||||
}
|
||||
|
||||
void api_free_object(Object value)
|
||||
{
|
||||
switch (value.type) {
|
||||
case kObjectTypeNil:
|
||||
case kObjectTypeBoolean:
|
||||
case kObjectTypeInteger:
|
||||
case kObjectTypeFloat:
|
||||
case kObjectTypeBuffer:
|
||||
case kObjectTypeWindow:
|
||||
case kObjectTypeTabpage:
|
||||
break;
|
||||
|
||||
case kObjectTypeString:
|
||||
api_free_string(value.data.string);
|
||||
break;
|
||||
|
||||
case kObjectTypeArray:
|
||||
api_free_array(value.data.array);
|
||||
break;
|
||||
|
||||
case kObjectTypeDictionary:
|
||||
api_free_dictionary(value.data.dictionary);
|
||||
break;
|
||||
|
||||
default:
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
void api_free_array(Array value)
|
||||
{
|
||||
for (size_t i = 0; i < value.size; i++) {
|
||||
api_free_object(value.items[i]);
|
||||
}
|
||||
|
||||
free(value.items);
|
||||
}
|
||||
|
||||
void api_free_dictionary(Dictionary value)
|
||||
{
|
||||
for (size_t i = 0; i < value.size; i++) {
|
||||
api_free_string(value.items[i].key);
|
||||
api_free_object(value.items[i].value);
|
||||
}
|
||||
|
||||
free(value.items);
|
||||
}
|
||||
|
||||
|
||||
/// Recursion helper for the `vim_to_object`. This uses a pointer table
|
||||
/// to avoid infinite recursion due to cyclic references
|
||||
///
|
||||
|
@@ -51,36 +51,11 @@
|
||||
.data.array = a \
|
||||
})
|
||||
|
||||
#define STRINGARRAY_OBJ(a) ((Object) { \
|
||||
.type = kObjectTypeStringArray, \
|
||||
.data.stringarray = a \
|
||||
})
|
||||
|
||||
#define BUFFERARRAY_OBJ(a) ((Object) { \
|
||||
.type = kObjectTypeBufferArray, \
|
||||
.data.bufferarray = a \
|
||||
})
|
||||
|
||||
#define WINDOWARRAY_OBJ(a) ((Object) { \
|
||||
.type = kObjectTypeWindowArray, \
|
||||
.data.windowarray = a \
|
||||
})
|
||||
|
||||
#define TABPAGEARRAY_OBJ(a) ((Object) { \
|
||||
.type = kObjectTypeTabpageArray, \
|
||||
.data.tabpagearray = a \
|
||||
})
|
||||
|
||||
#define DICTIONARY_OBJ(d) ((Object) { \
|
||||
.type = kObjectTypeDictionary, \
|
||||
.data.dictionary = d \
|
||||
})
|
||||
|
||||
#define POSITION_OBJ(p) ((Object) { \
|
||||
.type = kObjectTypePosition, \
|
||||
.data.position = p \
|
||||
})
|
||||
|
||||
#define NIL ((Object) {.type = kObjectTypeNil})
|
||||
|
||||
#define PUT(dict, k, v) \
|
||||
@@ -91,6 +66,25 @@
|
||||
#define ADD(array, item) \
|
||||
kv_push(Object, array, item)
|
||||
|
||||
// Helpers used by the generated msgpack-rpc api wrappers
|
||||
#define api_init_boolean
|
||||
#define api_init_integer
|
||||
#define api_init_float
|
||||
#define api_init_string = STRING_INIT
|
||||
#define api_init_buffer
|
||||
#define api_init_window
|
||||
#define api_init_tabpage
|
||||
#define api_init_object = NIL
|
||||
#define api_init_array = ARRAY_DICT_INIT
|
||||
#define api_init_dictionary = ARRAY_DICT_INIT
|
||||
|
||||
#define api_free_boolean(value)
|
||||
#define api_free_integer(value)
|
||||
#define api_free_float(value)
|
||||
#define api_free_buffer(value)
|
||||
#define api_free_window(value)
|
||||
#define api_free_tabpage(value)
|
||||
|
||||
#ifdef INCLUDE_GENERATED_DECLARATIONS
|
||||
# include "api/private/helpers.h.generated.h"
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user