aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/os/msgpack_rpc.c
diff options
context:
space:
mode:
authorThiago de Arruda <tpadilha84@gmail.com>2014-05-26 13:39:05 -0300
committerThiago de Arruda <tpadilha84@gmail.com>2014-05-26 14:02:12 -0300
commit4bac5e9ce19afd4647ee4d313c9485229d05a334 (patch)
tree5f6927bb13c8e68c6572c6d5d004c4517338cbfb /src/nvim/os/msgpack_rpc.c
parent339d106f7c1e756782980e884304b44e5faebddd (diff)
downloadrneovim-4bac5e9ce19afd4647ee4d313c9485229d05a334.tar.gz
rneovim-4bac5e9ce19afd4647ee4d313c9485229d05a334.tar.bz2
rneovim-4bac5e9ce19afd4647ee4d313c9485229d05a334.zip
API: Refactor: Duplicate/free string arguments coming from msgpack
When receiving strings *from* msgpack, we don't need to duplicate/free since the data only lives in the msgpack parse buffer until the end of the call. But in order to reuse `msgpack_rpc_free_object` when sending event data(which is sent *to* msgpack), Strings must be freed, which means they must also be allocated separately.
Diffstat (limited to 'src/nvim/os/msgpack_rpc.c')
-rw-r--r--src/nvim/os/msgpack_rpc.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/nvim/os/msgpack_rpc.c b/src/nvim/os/msgpack_rpc.c
index d7ffa6f559..8ca1e0a8c0 100644
--- a/src/nvim/os/msgpack_rpc.c
+++ b/src/nvim/os/msgpack_rpc.c
@@ -147,9 +147,13 @@ bool msgpack_rpc_to_float(msgpack_object *obj, Float *arg)
bool msgpack_rpc_to_string(msgpack_object *obj, String *arg)
{
- arg->data = (char *)obj->via.raw.ptr;
+ if (obj->type != MSGPACK_OBJECT_RAW) {
+ return false;
+ }
+
+ arg->data = xmemdup(obj->via.raw.ptr, obj->via.raw.size);
arg->size = obj->via.raw.size;
- return obj->type == MSGPACK_OBJECT_RAW;
+ return true;
}
bool msgpack_rpc_to_object(msgpack_object *obj, Object *arg)
@@ -328,6 +332,15 @@ void msgpack_rpc_from_dictionary(Dictionary result, msgpack_packer *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) {