From e2143674ae20fbadbea004bd54d6f5dc32b83803 Mon Sep 17 00:00:00 2001 From: Thiago de Arruda Date: Sun, 31 Aug 2014 10:46:28 -0300 Subject: deps: Update to the experimental msgpack v5 branch Using msgpack v5 will let nvim be more compatible with msgpack libraries for other platforms. This also replaces "raw" references by "bin" which is the new name for msgpack binary data type --- src/nvim/os/msgpack_rpc_helpers.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'src/nvim/os/msgpack_rpc_helpers.c') diff --git a/src/nvim/os/msgpack_rpc_helpers.c b/src/nvim/os/msgpack_rpc_helpers.c index e2c277abe4..eb43c3b2a6 100644 --- a/src/nvim/os/msgpack_rpc_helpers.c +++ b/src/nvim/os/msgpack_rpc_helpers.c @@ -81,12 +81,12 @@ bool msgpack_rpc_to_float(msgpack_object *obj, Float *arg) bool msgpack_rpc_to_string(msgpack_object *obj, String *arg) { - if (obj->type != MSGPACK_OBJECT_RAW) { + if (obj->type != MSGPACK_OBJECT_BIN) { return false; } - arg->data = xmemdupz(obj->via.raw.ptr, obj->via.raw.size); - arg->size = obj->via.raw.size; + arg->data = xmemdupz(obj->via.bin.ptr, obj->via.bin.size); + arg->size = obj->via.bin.size; return true; } @@ -110,7 +110,7 @@ bool msgpack_rpc_to_object(msgpack_object *obj, Object *arg) arg->type = kObjectTypeFloat; return msgpack_rpc_to_float(obj, &arg->data.floating); - case MSGPACK_OBJECT_RAW: + case MSGPACK_OBJECT_BIN: arg->type = kObjectTypeString; return msgpack_rpc_to_string(obj, &arg->data.string); @@ -200,8 +200,8 @@ void msgpack_rpc_from_float(Float result, msgpack_packer *res) void msgpack_rpc_from_string(String result, msgpack_packer *res) { - msgpack_pack_raw(res, result.size); - msgpack_pack_raw_body(res, result.data, result.size); + msgpack_pack_bin(res, result.size); + msgpack_pack_bin_body(res, result.data, result.size); } void msgpack_rpc_from_object(Object result, msgpack_packer *res) -- cgit From 74aff19691aeea83fa23265719668467db2b049c Mon Sep 17 00:00:00 2001 From: Thiago de Arruda Date: Wed, 3 Sep 2014 14:26:16 -0300 Subject: msgpack-rpc: Refactor initializer and dispatcher Use Map(String, rpc_method_handler_fn) for storing/retrieving rpc method handlers in msgpack_rpc_init and msgpack_rpc_dispatch. Also refactor serialization/validation functions in the msgpack_rpc.c/msgpack_rpc_helpers.c modules to accept the new STR and BIN types. --- src/nvim/os/msgpack_rpc_helpers.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'src/nvim/os/msgpack_rpc_helpers.c') diff --git a/src/nvim/os/msgpack_rpc_helpers.c b/src/nvim/os/msgpack_rpc_helpers.c index eb43c3b2a6..eaba3b9785 100644 --- a/src/nvim/os/msgpack_rpc_helpers.c +++ b/src/nvim/os/msgpack_rpc_helpers.c @@ -81,12 +81,13 @@ bool msgpack_rpc_to_float(msgpack_object *obj, Float *arg) bool msgpack_rpc_to_string(msgpack_object *obj, String *arg) { - if (obj->type != MSGPACK_OBJECT_BIN) { + if (obj->type == MSGPACK_OBJECT_BIN || obj->type == MSGPACK_OBJECT_STR) { + arg->data = xmemdupz(obj->via.bin.ptr, obj->via.bin.size); + arg->size = obj->via.bin.size; + } else { return false; } - arg->data = xmemdupz(obj->via.bin.ptr, obj->via.bin.size); - arg->size = obj->via.bin.size; return true; } @@ -111,6 +112,7 @@ bool msgpack_rpc_to_object(msgpack_object *obj, Object *arg) return msgpack_rpc_to_float(obj, &arg->data.floating); case MSGPACK_OBJECT_BIN: + case MSGPACK_OBJECT_STR: arg->type = kObjectTypeString; return msgpack_rpc_to_string(obj, &arg->data.string); -- cgit From d5a60d17fbca33ca96124288e69937a276d3abda Mon Sep 17 00:00:00 2001 From: Thiago de Arruda Date: Sun, 7 Sep 2014 18:48:10 -0300 Subject: api/msgpack-rpc: Remove specialized array types Specialized array types(BufferArray, WindowArray, etc) were added to the API for two main reasons: - msgpack used to lack a way of serializing appliaction-specific types and there was no obvious way of making an API function accept/return arrays of custom objects such as buffers(which are represented as integers, so clients didn't have a way to distinguish from normal numbers) - Let clients in statically-typed languages that support generics have a better typed API With msgpack 2.0 EXT type the first item is no longer a factor and this commit starts by removing the specialized array types. The second item will be addressed in the future by making the API metadata return extra useful information for statically-typed languages. --- src/nvim/os/msgpack_rpc_helpers.c | 74 --------------------------------------- 1 file changed, 74 deletions(-) (limited to 'src/nvim/os/msgpack_rpc_helpers.c') diff --git a/src/nvim/os/msgpack_rpc_helpers.c b/src/nvim/os/msgpack_rpc_helpers.c index eaba3b9785..3210f2b6b2 100644 --- a/src/nvim/os/msgpack_rpc_helpers.c +++ b/src/nvim/os/msgpack_rpc_helpers.c @@ -19,42 +19,6 @@ msgpack_pack_uint64(res, result); \ } -#define TYPED_ARRAY_IMPL(t, lt) \ - bool msgpack_rpc_to_##lt##array(msgpack_object *obj, t##Array *arg) \ - { \ - if (obj->type != MSGPACK_OBJECT_ARRAY) { \ - return false; \ - } \ - \ - arg->size = obj->via.array.size; \ - arg->items = xcalloc(obj->via.array.size, sizeof(t)); \ - \ - for (size_t i = 0; i < obj->via.array.size; i++) { \ - if (!msgpack_rpc_to_##lt(obj->via.array.ptr + i, &arg->items[i])) { \ - return false; \ - } \ - } \ - \ - return true; \ - } \ - \ - void msgpack_rpc_from_##lt##array(t##Array result, msgpack_packer *res) \ - { \ - msgpack_pack_array(res, result.size); \ - \ - for (size_t i = 0; i < result.size; i++) { \ - msgpack_rpc_from_##lt(result.items[i], res); \ - } \ - } \ - \ - void msgpack_rpc_free_##lt##array(t##Array value) { \ - for (size_t i = 0; i < value.size; i++) { \ - msgpack_rpc_free_##lt(value.items[i]); \ - } \ - \ - free(value.items); \ - } - bool msgpack_rpc_to_boolean(msgpack_object *obj, Boolean *arg) { *arg = obj->via.boolean; @@ -249,22 +213,6 @@ void msgpack_rpc_from_object(Object result, msgpack_packer *res) msgpack_rpc_from_tabpage(result.data.tabpage, res); break; - case kObjectTypeStringArray: - msgpack_rpc_from_stringarray(result.data.stringarray, res); - break; - - case kObjectTypeBufferArray: - msgpack_rpc_from_bufferarray(result.data.bufferarray, res); - break; - - case kObjectTypeWindowArray: - msgpack_rpc_from_windowarray(result.data.windowarray, res); - break; - - case kObjectTypeTabpageArray: - msgpack_rpc_from_tabpagearray(result.data.tabpagearray, res); - break; - case kObjectTypeDictionary: msgpack_rpc_from_dictionary(result.data.dictionary, res); break; @@ -327,22 +275,6 @@ void msgpack_rpc_free_object(Object value) msgpack_rpc_free_array(value.data.array); break; - case kObjectTypeStringArray: - msgpack_rpc_free_stringarray(value.data.stringarray); - break; - - case kObjectTypeBufferArray: - msgpack_rpc_free_bufferarray(value.data.bufferarray); - break; - - case kObjectTypeWindowArray: - msgpack_rpc_free_windowarray(value.data.windowarray); - break; - - case kObjectTypeTabpageArray: - msgpack_rpc_free_tabpagearray(value.data.tabpagearray); - break; - case kObjectTypeDictionary: msgpack_rpc_free_dictionary(value.data.dictionary); break; @@ -374,9 +306,3 @@ void msgpack_rpc_free_dictionary(Dictionary value) REMOTE_FUNCS_IMPL(Buffer, buffer) REMOTE_FUNCS_IMPL(Window, window) REMOTE_FUNCS_IMPL(Tabpage, tabpage) - -TYPED_ARRAY_IMPL(Buffer, buffer) -TYPED_ARRAY_IMPL(Window, window) -TYPED_ARRAY_IMPL(Tabpage, tabpage) -TYPED_ARRAY_IMPL(String, string) - -- cgit From 38dcfb60627cbdfa2eaf5d0d991c872c85868f22 Mon Sep 17 00:00:00 2001 From: Thiago de Arruda Date: Mon, 8 Sep 2014 16:03:37 -0300 Subject: api/msgpack-rpc: Use EXT type to serialize Buffer/Window/Tabpage --- src/nvim/os/msgpack_rpc_helpers.c | 55 +++++++++++++++++++++++++++++++++------ 1 file changed, 47 insertions(+), 8 deletions(-) (limited to 'src/nvim/os/msgpack_rpc_helpers.c') diff --git a/src/nvim/os/msgpack_rpc_helpers.c b/src/nvim/os/msgpack_rpc_helpers.c index 3210f2b6b2..5d2f53bbcf 100644 --- a/src/nvim/os/msgpack_rpc_helpers.c +++ b/src/nvim/os/msgpack_rpc_helpers.c @@ -7,18 +7,48 @@ #include "nvim/vim.h" #include "nvim/memory.h" -#define REMOTE_FUNCS_IMPL(t, lt) \ +static msgpack_zone zone; +static msgpack_sbuffer sbuffer; + +#define HANDLE_TYPE_CONVERSION_IMPL(t, lt) \ bool msgpack_rpc_to_##lt(msgpack_object *obj, t *arg) \ { \ - *arg = obj->via.u64; \ - return obj->type == MSGPACK_OBJECT_POSITIVE_INTEGER; \ + if (obj->type != MSGPACK_OBJECT_EXT \ + || obj->via.ext.type != kObjectType##t) { \ + return false; \ + } \ + \ + msgpack_object data; \ + msgpack_unpack_return ret = msgpack_unpack(obj->via.ext.ptr, \ + obj->via.ext.size, \ + NULL, \ + &zone, \ + &data); \ + \ + if (ret != MSGPACK_UNPACK_SUCCESS) { \ + return false; \ + } \ + \ + *arg = data.via.u64; \ + return true; \ } \ \ - void msgpack_rpc_from_##lt(t result, msgpack_packer *res) \ + void msgpack_rpc_from_##lt(t o, msgpack_packer *res) \ { \ - msgpack_pack_uint64(res, result); \ + msgpack_packer pac; \ + msgpack_packer_init(&pac, &sbuffer, msgpack_sbuffer_write); \ + msgpack_pack_uint64(&pac, o); \ + msgpack_pack_ext(res, sbuffer.size, kObjectType##t); \ + msgpack_pack_ext_body(res, sbuffer.data, sbuffer.size); \ + msgpack_sbuffer_clear(&sbuffer); \ } +void msgpack_rpc_helpers_init(void) +{ + msgpack_zone_init(&zone, 0xfff); + msgpack_sbuffer_init(&sbuffer); +} + bool msgpack_rpc_to_boolean(msgpack_object *obj, Boolean *arg) { *arg = obj->via.boolean; @@ -88,6 +118,15 @@ bool msgpack_rpc_to_object(msgpack_object *obj, Object *arg) arg->type = kObjectTypeDictionary; return msgpack_rpc_to_dictionary(obj, &arg->data.dictionary); + case MSGPACK_OBJECT_EXT: + switch (obj->via.ext.type) { + case kObjectTypeBuffer: + return msgpack_rpc_to_buffer(obj, &arg->data.buffer); + case kObjectTypeWindow: + return msgpack_rpc_to_window(obj, &arg->data.window); + case kObjectTypeTabpage: + return msgpack_rpc_to_tabpage(obj, &arg->data.tabpage); + } default: return false; } @@ -303,6 +342,6 @@ void msgpack_rpc_free_dictionary(Dictionary value) free(value.items); } -REMOTE_FUNCS_IMPL(Buffer, buffer) -REMOTE_FUNCS_IMPL(Window, window) -REMOTE_FUNCS_IMPL(Tabpage, tabpage) +HANDLE_TYPE_CONVERSION_IMPL(Buffer, buffer) +HANDLE_TYPE_CONVERSION_IMPL(Window, window) +HANDLE_TYPE_CONVERSION_IMPL(Tabpage, tabpage) -- cgit From 2792a0e33c0845fdd5b1b752d99ee573f6534256 Mon Sep 17 00:00:00 2001 From: Thiago de Arruda Date: Tue, 9 Sep 2014 08:59:48 -0300 Subject: api/msgpack-rpc: Remove Position type, using arrays instead. --- src/nvim/os/msgpack_rpc_helpers.c | 21 --------------------- 1 file changed, 21 deletions(-) (limited to 'src/nvim/os/msgpack_rpc_helpers.c') diff --git a/src/nvim/os/msgpack_rpc_helpers.c b/src/nvim/os/msgpack_rpc_helpers.c index 5d2f53bbcf..67c37fa8f4 100644 --- a/src/nvim/os/msgpack_rpc_helpers.c +++ b/src/nvim/os/msgpack_rpc_helpers.c @@ -132,15 +132,6 @@ bool msgpack_rpc_to_object(msgpack_object *obj, Object *arg) } } -bool msgpack_rpc_to_position(msgpack_object *obj, Position *arg) -{ - return obj->type == MSGPACK_OBJECT_ARRAY - && obj->via.array.size == 2 - && msgpack_rpc_to_integer(obj->via.array.ptr, &arg->row) - && msgpack_rpc_to_integer(obj->via.array.ptr + 1, &arg->col); -} - - bool msgpack_rpc_to_array(msgpack_object *obj, Array *arg) { if (obj->type != MSGPACK_OBJECT_ARRAY) { @@ -236,10 +227,6 @@ void msgpack_rpc_from_object(Object result, msgpack_packer *res) msgpack_rpc_from_array(result.data.array, res); break; - case kObjectTypePosition: - msgpack_rpc_from_position(result.data.position, res); - break; - case kObjectTypeBuffer: msgpack_rpc_from_buffer(result.data.buffer, res); break; @@ -258,13 +245,6 @@ void msgpack_rpc_from_object(Object result, msgpack_packer *res) } } -void msgpack_rpc_from_position(Position result, msgpack_packer *res) -{ - msgpack_pack_array(res, 2);; - msgpack_pack_int64(res, result.row); - msgpack_pack_int64(res, result.col); -} - void msgpack_rpc_from_array(Array result, msgpack_packer *res) { msgpack_pack_array(res, result.size); @@ -300,7 +280,6 @@ void msgpack_rpc_free_object(Object value) case kObjectTypeBoolean: case kObjectTypeInteger: case kObjectTypeFloat: - case kObjectTypePosition: case kObjectTypeBuffer: case kObjectTypeWindow: case kObjectTypeTabpage: -- cgit From cac24cb06ddcad0cfb3a9379c3bdd0e8706602f9 Mon Sep 17 00:00:00 2001 From: Thiago de Arruda Date: Tue, 9 Sep 2014 09:36:14 -0300 Subject: 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 --- src/nvim/os/msgpack_rpc_helpers.c | 85 +++++++++++---------------------------- 1 file changed, 24 insertions(+), 61 deletions(-) (limited to 'src/nvim/os/msgpack_rpc_helpers.c') diff --git a/src/nvim/os/msgpack_rpc_helpers.c b/src/nvim/os/msgpack_rpc_helpers.c index 67c37fa8f4..b14de8245c 100644 --- a/src/nvim/os/msgpack_rpc_helpers.c +++ b/src/nvim/os/msgpack_rpc_helpers.c @@ -7,11 +7,16 @@ #include "nvim/vim.h" #include "nvim/memory.h" +#ifdef INCLUDE_GENERATED_DECLARATIONS +# include "os/msgpack_rpc_helpers.c.generated.h" +#endif + static msgpack_zone zone; static msgpack_sbuffer sbuffer; #define HANDLE_TYPE_CONVERSION_IMPL(t, lt) \ bool msgpack_rpc_to_##lt(msgpack_object *obj, t *arg) \ + FUNC_ATTR_NONNULL_ALL \ { \ if (obj->type != MSGPACK_OBJECT_EXT \ || obj->via.ext.type != kObjectType##t) { \ @@ -34,6 +39,7 @@ static msgpack_sbuffer sbuffer; } \ \ void msgpack_rpc_from_##lt(t o, msgpack_packer *res) \ + FUNC_ATTR_NONNULL_ARG(2) \ { \ msgpack_packer pac; \ msgpack_packer_init(&pac, &sbuffer, msgpack_sbuffer_write); \ @@ -49,13 +55,19 @@ void msgpack_rpc_helpers_init(void) msgpack_sbuffer_init(&sbuffer); } +HANDLE_TYPE_CONVERSION_IMPL(Buffer, buffer) +HANDLE_TYPE_CONVERSION_IMPL(Window, window) +HANDLE_TYPE_CONVERSION_IMPL(Tabpage, tabpage) + bool msgpack_rpc_to_boolean(msgpack_object *obj, Boolean *arg) + FUNC_ATTR_NONNULL_ALL { *arg = obj->via.boolean; return obj->type == MSGPACK_OBJECT_BOOLEAN; } bool msgpack_rpc_to_integer(msgpack_object *obj, Integer *arg) + FUNC_ATTR_NONNULL_ALL { if (obj->type == MSGPACK_OBJECT_POSITIVE_INTEGER && obj->via.u64 <= INT64_MAX) { @@ -68,12 +80,14 @@ bool msgpack_rpc_to_integer(msgpack_object *obj, Integer *arg) } bool msgpack_rpc_to_float(msgpack_object *obj, Float *arg) + FUNC_ATTR_NONNULL_ALL { *arg = obj->via.dec; return obj->type == MSGPACK_OBJECT_DOUBLE; } bool msgpack_rpc_to_string(msgpack_object *obj, String *arg) + FUNC_ATTR_NONNULL_ALL { if (obj->type == MSGPACK_OBJECT_BIN || obj->type == MSGPACK_OBJECT_STR) { arg->data = xmemdupz(obj->via.bin.ptr, obj->via.bin.size); @@ -86,6 +100,7 @@ bool msgpack_rpc_to_string(msgpack_object *obj, String *arg) } bool msgpack_rpc_to_object(msgpack_object *obj, Object *arg) + FUNC_ATTR_NONNULL_ALL { switch (obj->type) { case MSGPACK_OBJECT_NIL: @@ -133,6 +148,7 @@ bool msgpack_rpc_to_object(msgpack_object *obj, Object *arg) } bool msgpack_rpc_to_array(msgpack_object *obj, Array *arg) + FUNC_ATTR_NONNULL_ALL { if (obj->type != MSGPACK_OBJECT_ARRAY) { return false; @@ -151,6 +167,7 @@ bool msgpack_rpc_to_array(msgpack_object *obj, Array *arg) } bool msgpack_rpc_to_dictionary(msgpack_object *obj, Dictionary *arg) + FUNC_ATTR_NONNULL_ALL { if (obj->type != MSGPACK_OBJECT_MAP) { return false; @@ -176,6 +193,7 @@ bool msgpack_rpc_to_dictionary(msgpack_object *obj, Dictionary *arg) } void msgpack_rpc_from_boolean(Boolean result, msgpack_packer *res) + FUNC_ATTR_NONNULL_ARG(2) { if (result) { msgpack_pack_true(res); @@ -185,22 +203,26 @@ void msgpack_rpc_from_boolean(Boolean result, msgpack_packer *res) } void msgpack_rpc_from_integer(Integer result, msgpack_packer *res) + FUNC_ATTR_NONNULL_ARG(2) { msgpack_pack_int64(res, result); } void msgpack_rpc_from_float(Float result, msgpack_packer *res) + FUNC_ATTR_NONNULL_ARG(2) { msgpack_pack_double(res, result); } void msgpack_rpc_from_string(String result, msgpack_packer *res) + FUNC_ATTR_NONNULL_ARG(2) { msgpack_pack_bin(res, result.size); msgpack_pack_bin_body(res, result.data, result.size); } void msgpack_rpc_from_object(Object result, msgpack_packer *res) + FUNC_ATTR_NONNULL_ARG(2) { switch (result.type) { case kObjectTypeNil: @@ -246,6 +268,7 @@ void msgpack_rpc_from_object(Object result, msgpack_packer *res) } void msgpack_rpc_from_array(Array result, msgpack_packer *res) + FUNC_ATTR_NONNULL_ARG(2) { msgpack_pack_array(res, result.size); @@ -255,6 +278,7 @@ void msgpack_rpc_from_array(Array result, msgpack_packer *res) } void msgpack_rpc_from_dictionary(Dictionary result, msgpack_packer *res) + FUNC_ATTR_NONNULL_ARG(2) { msgpack_pack_map(res, result.size); @@ -263,64 +287,3 @@ void msgpack_rpc_from_dictionary(Dictionary result, msgpack_packer *res) msgpack_rpc_from_object(result.items[i].value, res); } } - -void msgpack_rpc_free_string(String value) -{ - if (!value.data) { - return; - } - - free(value.data); -} - -void msgpack_rpc_free_object(Object value) -{ - switch (value.type) { - case kObjectTypeNil: - case kObjectTypeBoolean: - case kObjectTypeInteger: - case kObjectTypeFloat: - case kObjectTypeBuffer: - case kObjectTypeWindow: - case kObjectTypeTabpage: - break; - - case kObjectTypeString: - msgpack_rpc_free_string(value.data.string); - break; - - case kObjectTypeArray: - msgpack_rpc_free_array(value.data.array); - break; - - case kObjectTypeDictionary: - msgpack_rpc_free_dictionary(value.data.dictionary); - break; - - default: - abort(); - } -} - -void msgpack_rpc_free_array(Array value) -{ - for (uint32_t i = 0; i < value.size; i++) { - msgpack_rpc_free_object(value.items[i]); - } - - free(value.items); -} - -void msgpack_rpc_free_dictionary(Dictionary value) -{ - for (uint32_t i = 0; i < value.size; i++) { - msgpack_rpc_free_string(value.items[i].key); - msgpack_rpc_free_object(value.items[i].value); - } - - free(value.items); -} - -HANDLE_TYPE_CONVERSION_IMPL(Buffer, buffer) -HANDLE_TYPE_CONVERSION_IMPL(Window, window) -HANDLE_TYPE_CONVERSION_IMPL(Tabpage, tabpage) -- cgit