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.
This commit is contained in:
Thiago de Arruda 2014-05-26 13:39:05 -03:00
parent 339d106f7c
commit 4bac5e9ce1
5 changed files with 20 additions and 8 deletions

View File

@ -307,7 +307,7 @@ Integer buffer_get_number(Buffer buffer, Error *err)
String buffer_get_name(Buffer buffer, Error *err) String buffer_get_name(Buffer buffer, Error *err)
{ {
String rv = {.size = 0, .data = ""}; String rv = STRING_INIT;
buf_T *buf = find_buffer(buffer, err); buf_T *buf = find_buffer(buffer, err);
if (!buf || buf->b_ffname == NULL) { if (!buf || buf->b_ffname == NULL) {

View File

@ -6,6 +6,7 @@
#include <string.h> #include <string.h>
#define ARRAY_DICT_INIT {.size = 0, .items = NULL} #define ARRAY_DICT_INIT {.size = 0, .items = NULL}
#define STRING_INIT {.data = NULL, .size = 0}
#define REMOTE_TYPE(type) typedef uint64_t type #define REMOTE_TYPE(type) typedef uint64_t type
#define TYPED_ARRAY_OF(type) \ #define TYPED_ARRAY_OF(type) \

View File

@ -319,7 +319,7 @@ tabpage_T * find_tab(Tabpage tabpage, Error *err)
String cstr_to_string(const char *str) { String cstr_to_string(const char *str) {
if (str == NULL) { if (str == NULL) {
return (String) { .data = NULL, .size = 0 }; return (String) STRING_INIT;
} }
size_t len = strlen(str); size_t len = strlen(str);

View File

@ -147,9 +147,13 @@ bool msgpack_rpc_to_float(msgpack_object *obj, Float *arg)
bool msgpack_rpc_to_string(msgpack_object *obj, String *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; arg->size = obj->via.raw.size;
return obj->type == MSGPACK_OBJECT_RAW; return true;
} }
bool msgpack_rpc_to_object(msgpack_object *obj, Object *arg) 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) void msgpack_rpc_free_object(Object value)
{ {
switch (value.type) { switch (value.type) {

View File

@ -81,7 +81,7 @@ void msgpack_rpc_from_dictionary(Dictionary result, msgpack_packer *res);
#define msgpack_rpc_init_integer #define msgpack_rpc_init_integer
#define msgpack_rpc_init_float #define msgpack_rpc_init_float
#define msgpack_rpc_init_position #define msgpack_rpc_init_position
#define msgpack_rpc_init_string #define msgpack_rpc_init_string = STRING_INIT
#define msgpack_rpc_init_buffer #define msgpack_rpc_init_buffer
#define msgpack_rpc_init_window #define msgpack_rpc_init_window
#define msgpack_rpc_init_tabpage #define msgpack_rpc_init_tabpage
@ -100,9 +100,7 @@ void msgpack_rpc_from_dictionary(Dictionary result, msgpack_packer *res);
#define msgpack_rpc_free_integer(value) #define msgpack_rpc_free_integer(value)
#define msgpack_rpc_free_float(value) #define msgpack_rpc_free_float(value)
#define msgpack_rpc_free_position(value) #define msgpack_rpc_free_position(value)
// Strings are not copied from msgpack and so don't need to be freed(they void msgpack_rpc_free_string(String value);
// probably "live" in the msgpack streaming buffer)
#define msgpack_rpc_free_string(value)
#define msgpack_rpc_free_buffer(value) #define msgpack_rpc_free_buffer(value)
#define msgpack_rpc_free_window(value) #define msgpack_rpc_free_window(value)
#define msgpack_rpc_free_tabpage(value) #define msgpack_rpc_free_tabpage(value)