diff options
author | bfredl <bjorn.linse@gmail.com> | 2024-06-15 19:50:44 +0200 |
---|---|---|
committer | bfredl <bjorn.linse@gmail.com> | 2024-06-24 10:38:36 +0200 |
commit | 2bb1a18631c4035e4a582b7d995968acbac874bf (patch) | |
tree | 91cbe1813e2b1c6f3b940c21aced43d36cab8366 /src/nvim/shada.c | |
parent | da4e8dc5b04a82c6dd483f6c5345a81d8b375bec (diff) | |
download | rneovim-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.c | 56 |
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. |