aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/shada.c
diff options
context:
space:
mode:
authorbfredl <bjorn.linse@gmail.com>2024-06-15 19:50:44 +0200
committerbfredl <bjorn.linse@gmail.com>2024-06-24 10:38:36 +0200
commit2bb1a18631c4035e4a582b7d995968acbac874bf (patch)
tree91cbe1813e2b1c6f3b940c21aced43d36cab8366 /src/nvim/shada.c
parentda4e8dc5b04a82c6dd483f6c5345a81d8b375bec (diff)
downloadrneovim-2bb1a18631c4035e4a582b7d995968acbac874bf.tar.gz
rneovim-2bb1a18631c4035e4a582b7d995968acbac874bf.tar.bz2
rneovim-2bb1a18631c4035e4a582b7d995968acbac874bf.zip
refactor(typval): don't use msgpack_packer for msgpackdump()
Step towords completely eliminating msgpack_packer.
Diffstat (limited to 'src/nvim/shada.c')
-rw-r--r--src/nvim/shada.c56
1 files changed, 17 insertions, 39 deletions
diff --git a/src/nvim/shada.c b/src/nvim/shada.c
index 5736ea0f09..34e1590458 100644
--- a/src/nvim/shada.c
+++ b/src/nvim/shada.c
@@ -1354,6 +1354,12 @@ static char *shada_filename(const char *file)
#define SHADA_MPACK_FREE_SPACE (4 * MPACK_ITEM_SIZE)
+static int mpack_raw_wrapper(void *cookie, const char *data, size_t len)
+{
+ mpack_raw(data, len, (PackerBuffer *)cookie);
+ return 0;
+}
+
/// Write single ShaDa entry
///
/// @param[in] packer Packer used to write entry.
@@ -1367,14 +1373,13 @@ static ShaDaWriteResult shada_pack_entry(PackerBuffer *const packer, ShadaEntry
FUNC_ATTR_NONNULL_ALL
{
ShaDaWriteResult ret = kSDWriteFailed;
- msgpack_sbuffer sbuf;
- msgpack_sbuffer_init(&sbuf);
- msgpack_packer *spacker = msgpack_packer_new(&sbuf, &msgpack_sbuffer_write);
+ PackerBuffer sbuf = packer_string_buffer();
+ msgpack_packer *spacker = msgpack_packer_new(&sbuf, &mpack_raw_wrapper);
#define DUMP_ADDITIONAL_ELEMENTS(src, what) \
do { \
if ((src) != NULL) { \
TV_LIST_ITER((src), li, { \
- if (encode_vim_to_msgpack(spacker, TV_LIST_ITEM_TV(li), \
+ if (encode_vim_to_msgpack(&sbuf, TV_LIST_ITEM_TV(li), \
_("additional elements of ShaDa " what)) \
== FAIL) { \
goto shada_pack_entry_error; \
@@ -1394,7 +1399,7 @@ static ShaDaWriteResult shada_pack_entry(PackerBuffer *const packer, ShadaEntry
const size_t key_len = strlen(hi->hi_key); \
msgpack_pack_str(spacker, key_len); \
msgpack_pack_str_body(spacker, hi->hi_key, key_len); \
- if (encode_vim_to_msgpack(spacker, &di->di_tv, \
+ if (encode_vim_to_msgpack(&sbuf, &di->di_tv, \
_("additional data of ShaDa " what)) \
== FAIL) { \
goto shada_pack_entry_error; \
@@ -1460,7 +1465,7 @@ static ShaDaWriteResult shada_pack_entry(PackerBuffer *const packer, ShadaEntry
char vardesc[256] = "variable g:";
memcpy(&vardesc[sizeof("variable g:") - 1], varname.data,
varname.size + 1);
- if (encode_vim_to_msgpack(spacker, &entry.data.global_var.value, vardesc)
+ if (encode_vim_to_msgpack(&sbuf, &entry.data.global_var.value, vardesc)
== FAIL) {
ret = kSDWriteIgnError;
semsg(_(WERR "Failed to write variable %s"),
@@ -1645,7 +1650,8 @@ static ShaDaWriteResult shada_pack_entry(PackerBuffer *const packer, ShadaEntry
}
#undef CHECK_DEFAULT
#undef ONE_IF_NOT_DEFAULT
- if (!max_kbyte || sbuf.size <= max_kbyte * 1024) {
+ String packed = packer_take_string(&sbuf);
+ if (!max_kbyte || packed.size <= max_kbyte * 1024) {
if (mpack_remaining(packer) < SHADA_MPACK_FREE_SPACE) {
packer->packer_flush(packer);
}
@@ -1656,9 +1662,9 @@ static ShaDaWriteResult shada_pack_entry(PackerBuffer *const packer, ShadaEntry
mpack_uint64(&packer->ptr, (uint64_t)entry.type);
}
mpack_uint64(&packer->ptr, (uint64_t)entry.timestamp);
- if (sbuf.size > 0) {
- mpack_uint64(&packer->ptr, (uint64_t)sbuf.size);
- mpack_raw(sbuf.data, sbuf.size, packer);
+ if (packed.size > 0) {
+ mpack_uint64(&packer->ptr, (uint64_t)packed.size);
+ mpack_raw(packed.data, packed.size, packer);
}
if (packer->anyint != 0) { // error code
@@ -1668,7 +1674,7 @@ static ShaDaWriteResult shada_pack_entry(PackerBuffer *const packer, ShadaEntry
ret = kSDWriteSuccessful;
shada_pack_entry_error:
msgpack_packer_free(spacker);
- msgpack_sbuffer_destroy(&sbuf);
+ xfree(sbuf.startptr);
return ret;
}
@@ -3960,34 +3966,6 @@ static inline size_t shada_init_jumps(PossiblyFreedShadaEntry *jumps,
return jumps_size;
}
-static PackerBuffer packer_string_buffer(void)
-{
- const size_t initial_size = 64; // must be larger than SHADA_MPACK_FREE_SPACE
- char *alloc = xmalloc(initial_size);
- return (PackerBuffer) {
- .startptr = alloc,
- .ptr = alloc,
- .endptr = alloc + initial_size,
- .packer_flush = flush_string_buffer,
- };
-}
-
-static void flush_string_buffer(PackerBuffer *buffer)
-{
- size_t current_capacity = (size_t)(buffer->endptr - buffer->startptr);
- size_t new_capacity = 2 * current_capacity;
- size_t len = (size_t)(buffer->ptr - buffer->startptr);
-
- buffer->startptr = xrealloc(buffer->startptr, new_capacity);
- buffer->ptr = buffer->startptr + len;
- buffer->endptr = buffer->startptr + new_capacity;
-}
-
-static String packer_take_string(PackerBuffer *buffer)
-{
- return (String){ .data = buffer->startptr, .size = (size_t)(buffer->ptr - buffer->startptr) };
-}
-
/// Write registers ShaDa entries in given msgpack_sbuffer.
///
/// @param[in] sbuf target msgpack_sbuffer to write to.