aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbfredl <bjorn.linse@gmail.com>2024-08-05 14:08:28 +0200
committerGitHub <noreply@github.com>2024-08-05 14:08:28 +0200
commitfd1d84c705128372dc25e3a833e9a1dc6b9e81e0 (patch)
treecd42ac3b29c6b2ac214bd81c3d11ece9dbd406c9
parentc7b100630ae65b904a722c57f1fde1d9669cc643 (diff)
parent1247684ae14e83c5b742be390de8dee00fd4e241 (diff)
downloadrneovim-fd1d84c705128372dc25e3a833e9a1dc6b9e81e0.tar.gz
rneovim-fd1d84c705128372dc25e3a833e9a1dc6b9e81e0.tar.bz2
rneovim-fd1d84c705128372dc25e3a833e9a1dc6b9e81e0.zip
Merge pull request #29540 from bfredl/neoshada
refactor(shada): rework msgpack decoding without msgpack-c
-rw-r--r--.github/workflows/test.yml1
-rw-r--r--BUILD.md6
-rw-r--r--cmake.deps/CMakeLists.txt5
-rw-r--r--cmake.deps/cmake/BuildMsgpack.cmake7
-rw-r--r--cmake.deps/deps.txt3
-rw-r--r--cmake/FindMsgpack.cmake24
-rw-r--r--contrib/local.mk.example1
-rwxr-xr-xscripts/gen_eval_files.lua3
-rw-r--r--src/nvim/CMakeLists.txt2
-rw-r--r--src/nvim/api/command.c6
-rw-r--r--src/nvim/api/keysets_defs.h42
-rw-r--r--src/nvim/api/private/defs.h10
-rw-r--r--src/nvim/api/private/helpers.c11
-rw-r--r--src/nvim/api/ui.c1
-rw-r--r--src/nvim/buffer.c2
-rw-r--r--src/nvim/buffer_defs.h2
-rw-r--r--src/nvim/cmdhist.c10
-rw-r--r--src/nvim/cmdhist.h2
-rw-r--r--src/nvim/context.h1
-rw-r--r--src/nvim/eval.c99
-rw-r--r--src/nvim/eval/decode.c307
-rw-r--r--src/nvim/eval/decode.h2
-rw-r--r--src/nvim/eval/encode.c5
-rw-r--r--src/nvim/eval/encode.h1
-rw-r--r--src/nvim/eval/funcs.c128
-rw-r--r--src/nvim/eval/typval.c5
-rw-r--r--src/nvim/ex_cmds.c6
-rw-r--r--src/nvim/ex_cmds_defs.h2
-rw-r--r--src/nvim/generators/c_grammar.lua6
-rw-r--r--src/nvim/generators/gen_api_dispatch.lua27
-rw-r--r--src/nvim/generators/hashy.lua22
-rw-r--r--src/nvim/main.c1
-rw-r--r--src/nvim/mark.c2
-rw-r--r--src/nvim/mark_defs.h8
-rw-r--r--src/nvim/msgpack_rpc/channel.c3
-rw-r--r--src/nvim/msgpack_rpc/channel_defs.h1
-rw-r--r--src/nvim/msgpack_rpc/unpacker.c196
-rw-r--r--src/nvim/msgpack_rpc/unpacker.h2
-rw-r--r--src/nvim/ops.c16
-rw-r--r--src/nvim/ops.h2
-rw-r--r--src/nvim/os/fileio.c16
-rw-r--r--src/nvim/search.c2
-rw-r--r--src/nvim/search.h2
-rw-r--r--src/nvim/shada.c1083
-rw-r--r--src/nvim/shada.h2
-rw-r--r--src/nvim/types_defs.h6
-rw-r--r--src/nvim/ui_client.c2
-rw-r--r--src/nvim/undo.c3
-rw-r--r--test/functional/shada/errors_spec.lua95
-rw-r--r--test/unit/eval/encode_spec.lua36
50 files changed, 1022 insertions, 1205 deletions
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index b6767e71b1..4759426bb4 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -241,7 +241,6 @@ jobs:
sudo add-apt-repository ppa:neovim-ppa/stable
sudo apt-get install -y \
libluajit-5.1-dev \
- libmsgpack-dev \
libtermkey-dev \
libunibilium-dev \
libuv1-dev \
diff --git a/BUILD.md b/BUILD.md
index 8ae13b295e..895aec5fd1 100644
--- a/BUILD.md
+++ b/BUILD.md
@@ -84,7 +84,7 @@ make deps
- Right-click _CMakeLists.txt → Delete Cache_.
- Right-click _CMakeLists.txt → Generate Cache_.
- If you see an "access violation" from `ntdll`, you can ignore it and continue.
-4. If you see an error like `msgpackc.dll not found`, try the `nvim.exe (Install)` target. Then switch back to `nvim.exe (bin\nvim.exe)`.
+4. If you see an error like `uv.dll not found`, try the `nvim.exe (Install)` target. Then switch back to `nvim.exe (bin\nvim.exe)`.
### Windows / MSVC PowerShell
@@ -240,7 +240,7 @@ cmake --build build
### How to build without "bundled" dependencies
1. Manually install the dependencies:
- - libuv libluv libutf8proc libvterm luajit lua-lpeg lua-mpack msgpack-c tree-sitter tree-sitter-c tree-sitter-lua tree-sitter-markdown tree-sitter-query tree-sitter-vim tree-sitter-vimdoc unibilium
+ - libuv libluv libutf8proc libvterm luajit lua-lpeg tree-sitter tree-sitter-c tree-sitter-lua tree-sitter-markdown tree-sitter-query tree-sitter-vim tree-sitter-vimdoc unibilium
2. Run CMake:
```sh
cmake -B build -G Ninja -D CMAKE_BUILD_TYPE=RelWithDebInfo
@@ -260,7 +260,7 @@ cmake --build build
#### Debian 10 (Buster) example:
```sh
-sudo apt install luajit libluajit-5.1-dev lua-mpack lua-lpeg libunibilium-dev libmsgpack-dev
+sudo apt install luajit libluajit-5.1-dev lua-lpeg libunibilium-dev
cmake -S cmake.deps -B .deps -G Ninja -D CMAKE_BUILD_TYPE=RelWithDebInfo -DUSE_BUNDLED=OFF -DUSE_BUNDLED_LIBUV=ON -DUSE_BUNDLED_LUV=ON -DUSE_BUNDLED_LIBVTERM=ON -DUSE_BUNDLED_TS=ON -DUSE_BUNDLED_UTF8PROC=ON
cmake --build .deps
cmake -B build -G Ninja -D CMAKE_BUILD_TYPE=RelWithDebInfo
diff --git a/cmake.deps/CMakeLists.txt b/cmake.deps/CMakeLists.txt
index 3c4a28f9ce..05db090765 100644
--- a/cmake.deps/CMakeLists.txt
+++ b/cmake.deps/CMakeLists.txt
@@ -33,7 +33,6 @@ option(USE_BUNDLED_LPEG "Use the bundled lpeg." ${USE_BUNDLED})
option(USE_BUNDLED_LUA "Use the bundled version of lua." OFF)
option(USE_BUNDLED_LUAJIT "Use the bundled version of luajit." ${USE_BUNDLED})
option(USE_BUNDLED_LUV "Use the bundled version of luv." ${USE_BUNDLED})
-option(USE_BUNDLED_MSGPACK "Use the bundled msgpack." ${USE_BUNDLED})
option(USE_BUNDLED_TS "Use the bundled treesitter runtime." ${USE_BUNDLED})
option(USE_BUNDLED_TS_PARSERS "Use the bundled treesitter parsers." ${USE_BUNDLED})
option(USE_BUNDLED_UNIBILIUM "Use the bundled unibilium." ${USE_BUNDLED})
@@ -105,10 +104,6 @@ if(USE_BUNDLED_LIBUV)
include(BuildLibuv)
endif()
-if(USE_BUNDLED_MSGPACK)
- include(BuildMsgpack)
-endif()
-
if(USE_BUNDLED_LUAJIT)
include(BuildLuajit)
endif()
diff --git a/cmake.deps/cmake/BuildMsgpack.cmake b/cmake.deps/cmake/BuildMsgpack.cmake
deleted file mode 100644
index 8f82dab140..0000000000
--- a/cmake.deps/cmake/BuildMsgpack.cmake
+++ /dev/null
@@ -1,7 +0,0 @@
-get_externalproject_options(msgpack ${DEPS_IGNORE_SHA})
-ExternalProject_Add(msgpack
- DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/msgpack
- CMAKE_ARGS ${DEPS_CMAKE_ARGS}
- -D MSGPACK_BUILD_TESTS=OFF
- -D MSGPACK_BUILD_EXAMPLES=OFF
- ${EXTERNALPROJECT_OPTIONS})
diff --git a/cmake.deps/deps.txt b/cmake.deps/deps.txt
index 9e3585472f..63ec369f76 100644
--- a/cmake.deps/deps.txt
+++ b/cmake.deps/deps.txt
@@ -1,9 +1,6 @@
LIBUV_URL https://github.com/libuv/libuv/archive/v1.48.0.tar.gz
LIBUV_SHA256 8c253adb0f800926a6cbd1c6576abae0bc8eb86a4f891049b72f9e5b7dc58f33
-MSGPACK_URL https://github.com/msgpack/msgpack-c/archive/c-6.0.1.tar.gz
-MSGPACK_SHA256 58d5fe49d0ee2b374d60a61aabf8028b2c92004e6f11bff04e74b639fc8ad541
-
LUAJIT_URL https://github.com/LuaJIT/LuaJIT/archive/04dca7911ea255f37be799c18d74c305b921c1a6.tar.gz
LUAJIT_SHA256 346b028d9ba85e04b7e23a43cc51ec076574d2efc0d271d4355141b0145cd6e0
diff --git a/cmake/FindMsgpack.cmake b/cmake/FindMsgpack.cmake
deleted file mode 100644
index 9ef18122ab..0000000000
--- a/cmake/FindMsgpack.cmake
+++ /dev/null
@@ -1,24 +0,0 @@
-find_path2(MSGPACK_INCLUDE_DIR msgpack/version_master.h)
-
-if(MSGPACK_INCLUDE_DIR)
- file(READ ${MSGPACK_INCLUDE_DIR}/msgpack/version_master.h msgpack_version_h)
- string(REGEX REPLACE ".*MSGPACK_VERSION_MAJOR +([0-9]+).*" "\\1" MSGPACK_VERSION_MAJOR "${msgpack_version_h}")
- string(REGEX REPLACE ".*MSGPACK_VERSION_MINOR +([0-9]+).*" "\\1" MSGPACK_VERSION_MINOR "${msgpack_version_h}")
- string(REGEX REPLACE ".*MSGPACK_VERSION_REVISION +([0-9]+).*" "\\1" MSGPACK_VERSION_REVISION "${msgpack_version_h}")
- set(MSGPACK_VERSION_STRING "${MSGPACK_VERSION_MAJOR}.${MSGPACK_VERSION_MINOR}.${MSGPACK_VERSION_REVISION}")
-else()
- set(MSGPACK_VERSION_STRING)
-endif()
-
-find_library2(MSGPACK_LIBRARY NAMES msgpackc msgpack msgpackc_import msgpack-c
- NAMES_PER_DIR)
-
-mark_as_advanced(MSGPACK_INCLUDE_DIR MSGPACK_LIBRARY)
-
-find_package_handle_standard_args(Msgpack
- REQUIRED_VARS MSGPACK_LIBRARY MSGPACK_INCLUDE_DIR
- VERSION_VAR MSGPACK_VERSION_STRING)
-
-add_library(msgpack INTERFACE)
-target_include_directories(msgpack SYSTEM BEFORE INTERFACE ${MSGPACK_INCLUDE_DIR})
-target_link_libraries(msgpack INTERFACE ${MSGPACK_LIBRARY})
diff --git a/contrib/local.mk.example b/contrib/local.mk.example
index 58474a3750..61fc0b95b8 100644
--- a/contrib/local.mk.example
+++ b/contrib/local.mk.example
@@ -48,7 +48,6 @@
# DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_LIBVTERM=OFF
# DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_LUAJIT=OFF
# DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_LUV=OFF
-# DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_MSGPACK=OFF
# DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_TS=OFF
# DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_TS_PARSERS=OFF
# DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_UNIBILIUM=OFF
diff --git a/scripts/gen_eval_files.lua b/scripts/gen_eval_files.lua
index b490e7b480..fc2fadc440 100755
--- a/scripts/gen_eval_files.lua
+++ b/scripts/gen_eval_files.lua
@@ -376,6 +376,9 @@ end
--- @param fun vim.EvalFn
--- @param write fun(line: string)
local function render_api_keyset_meta(_f, fun, write)
+ if string.sub(fun.name, 1, 1) == '_' then
+ return -- not exported
+ end
write('')
write('--- @class vim.api.keyset.' .. fun.name)
for _, p in ipairs(fun.params) do
diff --git a/src/nvim/CMakeLists.txt b/src/nvim/CMakeLists.txt
index 546dc3a1e6..d153c9e3ef 100644
--- a/src/nvim/CMakeLists.txt
+++ b/src/nvim/CMakeLists.txt
@@ -32,7 +32,6 @@ find_package(Iconv REQUIRED)
find_package(Libuv 1.28.0 REQUIRED)
find_package(Libvterm 0.3.3 REQUIRED)
find_package(Lpeg REQUIRED)
-find_package(Msgpack 1.0.0 REQUIRED)
find_package(Treesitter 0.22.6 REQUIRED)
find_package(Unibilium 2.0 REQUIRED)
find_package(UTF8proc REQUIRED)
@@ -41,7 +40,6 @@ target_link_libraries(main_lib INTERFACE
iconv
libvterm
lpeg
- msgpack
treesitter
unibilium
utf8proc)
diff --git a/src/nvim/api/command.c b/src/nvim/api/command.c
index 5ad439af9c..78be0a2cf7 100644
--- a/src/nvim/api/command.c
+++ b/src/nvim/api/command.c
@@ -515,7 +515,7 @@ String nvim_cmd(uint64_t channel_id, Dict(cmd) *cmd, Dict(cmd_opts) *opts, Arena
if (HAS_KEY(cmd, cmd, magic)) {
Dict(cmd_magic) magic[1] = KEYDICT_INIT;
- if (!api_dict_to_keydict(magic, KeyDict_cmd_magic_get_field, cmd->magic, err)) {
+ if (!api_dict_to_keydict(magic, DictHash(cmd_magic), cmd->magic, err)) {
goto end;
}
@@ -533,14 +533,14 @@ String nvim_cmd(uint64_t channel_id, Dict(cmd) *cmd, Dict(cmd_opts) *opts, Arena
if (HAS_KEY(cmd, cmd, mods)) {
Dict(cmd_mods) mods[1] = KEYDICT_INIT;
- if (!api_dict_to_keydict(mods, KeyDict_cmd_mods_get_field, cmd->mods, err)) {
+ if (!api_dict_to_keydict(mods, DictHash(cmd_mods), cmd->mods, err)) {
goto end;
}
if (HAS_KEY(mods, cmd_mods, filter)) {
Dict(cmd_mods_filter) filter[1] = KEYDICT_INIT;
- if (!api_dict_to_keydict(&filter, KeyDict_cmd_mods_filter_get_field,
+ if (!api_dict_to_keydict(&filter, DictHash(cmd_mods_filter),
mods->filter, err)) {
goto end;
}
diff --git a/src/nvim/api/keysets_defs.h b/src/nvim/api/keysets_defs.h
index cc2ef981b5..ce4e3d56e1 100644
--- a/src/nvim/api/keysets_defs.h
+++ b/src/nvim/api/keysets_defs.h
@@ -103,7 +103,7 @@ typedef struct {
Object nargs;
Object preview;
Object range;
- Boolean register_;
+ Boolean register_ DictKey(register);
} Dict(user_command);
typedef struct {
@@ -170,7 +170,7 @@ typedef struct {
Boolean reverse;
Boolean altfont;
Boolean nocombine;
- Boolean default_;
+ Boolean default_ DictKey(default);
Object cterm;
Object foreground;
Object fg;
@@ -392,3 +392,41 @@ typedef struct {
OptionalKeys is_set__ns_opts_;
Array wins;
} Dict(ns_opts);
+
+typedef struct {
+ OptionalKeys is_set___shada_search_pat_;
+ Boolean magic DictKey(sm);
+ Boolean smartcase DictKey(sc);
+ Boolean has_line_offset DictKey(sl);
+ Boolean place_cursor_at_end DictKey(se);
+ Boolean is_last_used DictKey(su);
+ Boolean is_substitute_pattern DictKey(ss);
+ Boolean highlighted DictKey(sh);
+ Boolean search_backward DictKey(sb);
+ Integer offset DictKey(so);
+ String pat DictKey(sp);
+} Dict(_shada_search_pat);
+
+typedef struct {
+ OptionalKeys is_set___shada_mark_;
+ Integer n;
+ Integer l;
+ Integer c;
+ String f;
+} Dict(_shada_mark);
+
+typedef struct {
+ OptionalKeys is_set___shada_register_;
+ StringArray rc;
+ Boolean ru;
+ Integer rt;
+ Integer n;
+ Integer rw;
+} Dict(_shada_register);
+
+typedef struct {
+ OptionalKeys is_set___shada_buflist_item_;
+ Integer l;
+ Integer c;
+ String f;
+} Dict(_shada_buflist_item);
diff --git a/src/nvim/api/private/defs.h b/src/nvim/api/private/defs.h
index 94e2d76cbe..ac3404cf86 100644
--- a/src/nvim/api/private/defs.h
+++ b/src/nvim/api/private/defs.h
@@ -19,6 +19,8 @@
# define ArrayOf(...) Array
# define DictionaryOf(...) Dictionary
# define Dict(name) KeyDict_##name
+# define DictHash(name) KeyDict_##name##_get_field
+# define DictKey(name)
# include "api/private/defs.h.inline.generated.h"
#endif
@@ -88,6 +90,8 @@ typedef kvec_t(Object) Array;
typedef struct key_value_pair KeyValuePair;
typedef kvec_t(KeyValuePair) Dictionary;
+typedef kvec_t(String) StringArray;
+
typedef enum {
kObjectTypeNil = 0,
kObjectTypeBoolean,
@@ -103,6 +107,10 @@ typedef enum {
kObjectTypeTabpage,
} ObjectType;
+typedef enum {
+ kUnpackTypeStringArray = -1,
+} UnpackType;
+
/// Value by which objects represented as EXT type are shifted
///
/// Subtracted when packing, added when unpacking. Used to allow moving
@@ -140,7 +148,7 @@ typedef struct {
typedef struct {
char *str;
size_t ptr_off;
- ObjectType type; // kObjectTypeNil == untyped
+ int type; // ObjectType or UnpackType. kObjectTypeNil == untyped
int opt_index;
bool is_hlgroup;
} KeySetLink;
diff --git a/src/nvim/api/private/helpers.c b/src/nvim/api/private/helpers.c
index ac621b1486..017265e0d3 100644
--- a/src/nvim/api/private/helpers.c
+++ b/src/nvim/api/private/helpers.c
@@ -1,6 +1,5 @@
#include <assert.h>
#include <limits.h>
-#include <msgpack/unpack.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stddef.h>
@@ -922,15 +921,17 @@ bool api_dict_to_keydict(void *retval, FieldHashfn hashy, Dictionary dict, Error
} else if (value->type == kObjectTypeDictionary) {
*val = value->data.dictionary;
} else {
- api_err_exp(err, field->str, api_typename(field->type), api_typename(value->type));
+ api_err_exp(err, field->str, api_typename((ObjectType)field->type),
+ api_typename(value->type));
return false;
}
} else if (field->type == kObjectTypeBuffer || field->type == kObjectTypeWindow
|| field->type == kObjectTypeTabpage) {
- if (value->type == kObjectTypeInteger || value->type == field->type) {
+ if (value->type == kObjectTypeInteger || value->type == (ObjectType)field->type) {
*(handle_T *)mem = (handle_T)value->data.integer;
} else {
- api_err_exp(err, field->str, api_typename(field->type), api_typename(value->type));
+ api_err_exp(err, field->str, api_typename((ObjectType)field->type),
+ api_typename(value->type));
return false;
}
} else if (field->type == kObjectTypeLuaRef) {
@@ -980,7 +981,7 @@ Dictionary api_keydict_to_dict(void *value, KeySetLink *table, size_t max_size,
} else if (field->type == kObjectTypeBuffer || field->type == kObjectTypeWindow
|| field->type == kObjectTypeTabpage) {
val.data.integer = *(handle_T *)mem;
- val.type = field->type;
+ val.type = (ObjectType)field->type;
} else if (field->type == kObjectTypeLuaRef) {
// do nothing
} else {
diff --git a/src/nvim/api/ui.c b/src/nvim/api/ui.c
index 852b8b9b48..82a5ff5f8e 100644
--- a/src/nvim/api/ui.c
+++ b/src/nvim/api/ui.c
@@ -1,6 +1,5 @@
#include <assert.h>
#include <inttypes.h>
-#include <msgpack/pack.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c
index 2fc684b412..0c301bd5e2 100644
--- a/src/nvim/buffer.c
+++ b/src/nvim/buffer.c
@@ -868,7 +868,7 @@ static void free_buffer(buf_T *buf)
}
unref_var_dict(buf->b_vars);
aubuflocal_remove(buf);
- tv_dict_unref(buf->additional_data);
+ xfree(buf->additional_data);
xfree(buf->b_prompt_text);
callback_free(&buf->b_prompt_callback);
callback_free(&buf->b_prompt_interrupt);
diff --git a/src/nvim/buffer_defs.h b/src/nvim/buffer_defs.h
index 221a86a907..8e076646c3 100644
--- a/src/nvim/buffer_defs.h
+++ b/src/nvim/buffer_defs.h
@@ -712,7 +712,7 @@ struct file_buffer {
Terminal *terminal; // Terminal instance associated with the buffer
- dict_T *additional_data; // Additional data from shada file if any.
+ AdditionalData *additional_data; // Additional data from shada file if any.
int b_mapped_ctrl_c; // modes where CTRL-C is mapped
diff --git a/src/nvim/cmdhist.c b/src/nvim/cmdhist.c
index ab05ae1cfc..47a4ffba9e 100644
--- a/src/nvim/cmdhist.c
+++ b/src/nvim/cmdhist.c
@@ -190,7 +190,7 @@ static inline void hist_free_entry(histentry_T *hisptr)
FUNC_ATTR_NONNULL_ALL
{
xfree(hisptr->hisstr);
- tv_list_unref(hisptr->additional_elements);
+ xfree(hisptr->additional_data);
clear_hist_entry(hisptr);
}
@@ -237,7 +237,7 @@ static int in_history(int type, const char *str, int move_to_front, int sep)
return false;
}
- list_T *const list = history[type][i].additional_elements;
+ AdditionalData *ad = history[type][i].additional_data;
char *const save_hisstr = history[type][i].hisstr;
while (i != hisidx[type]) {
if (++i >= hislen) {
@@ -246,11 +246,11 @@ static int in_history(int type, const char *str, int move_to_front, int sep)
history[type][last_i] = history[type][i];
last_i = i;
}
- tv_list_unref(list);
+ xfree(ad);
history[type][i].hisnum = ++hisnum[type];
history[type][i].hisstr = save_hisstr;
history[type][i].timestamp = os_time();
- history[type][i].additional_elements = NULL;
+ history[type][i].additional_data = NULL;
return true;
}
@@ -337,7 +337,7 @@ void add_to_history(int histype, const char *new_entry, size_t new_entrylen, boo
// Store the separator after the NUL of the string.
hisptr->hisstr = xstrnsave(new_entry, new_entrylen + 2);
hisptr->timestamp = os_time();
- hisptr->additional_elements = NULL;
+ hisptr->additional_data = NULL;
hisptr->hisstr[new_entrylen + 1] = (char)sep;
hisptr->hisnum = ++hisnum[histype];
diff --git a/src/nvim/cmdhist.h b/src/nvim/cmdhist.h
index 43be397cee..4df4b09e68 100644
--- a/src/nvim/cmdhist.h
+++ b/src/nvim/cmdhist.h
@@ -24,7 +24,7 @@ typedef struct {
int hisnum; ///< Entry identifier number.
char *hisstr; ///< Actual entry, separator char after the NUL.
Timestamp timestamp; ///< Time when entry was added.
- list_T *additional_elements; ///< Additional entries from ShaDa file.
+ AdditionalData *additional_data; ///< Additional entries from ShaDa file.
} histentry_T;
#ifdef INCLUDE_GENERATED_DECLARATIONS
diff --git a/src/nvim/context.h b/src/nvim/context.h
index 0bb7138b6c..4375030fbc 100644
--- a/src/nvim/context.h
+++ b/src/nvim/context.h
@@ -1,6 +1,5 @@
#pragma once
-#include <msgpack/sbuffer.h>
#include <stddef.h>
#include "klib/kvec.h"
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index 0180d37ad8..31e4953a5c 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -4788,19 +4788,6 @@ bool garbage_collect(bool testing)
FOR_ALL_BUFFERS(buf) {
// buffer-local variables
ABORTING(set_ref_in_item)(&buf->b_bufvar.di_tv, copyID, NULL, NULL);
- // buffer marks (ShaDa additional data)
- ABORTING(set_ref_in_fmark)(buf->b_last_cursor, copyID);
- ABORTING(set_ref_in_fmark)(buf->b_last_insert, copyID);
- ABORTING(set_ref_in_fmark)(buf->b_last_change, copyID);
- for (size_t i = 0; i < NMARKS; i++) {
- ABORTING(set_ref_in_fmark)(buf->b_namedm[i], copyID);
- }
- // buffer change list (ShaDa additional data)
- for (int i = 0; i < buf->b_changelistlen; i++) {
- ABORTING(set_ref_in_fmark)(buf->b_changelist[i], copyID);
- }
- // buffer ShaDa additional data
- ABORTING(set_ref_dict)(buf->additional_data, copyID);
// buffer callback functions
ABORTING(set_ref_in_callback)(&buf->b_prompt_callback, copyID, NULL, NULL);
@@ -4823,10 +4810,6 @@ bool garbage_collect(bool testing)
FOR_ALL_TAB_WINDOWS(tp, wp) {
// window-local variables
ABORTING(set_ref_in_item)(&wp->w_winvar.di_tv, copyID, NULL, NULL);
- // window jump list (ShaDa additional data)
- for (int i = 0; i < wp->w_jumplistlen; i++) {
- ABORTING(set_ref_in_fmark)(wp->w_jumplist[i].fmark, copyID);
- }
}
// window-local variables in autocmd windows
for (int i = 0; i < AUCMD_WIN_COUNT; i++) {
@@ -4843,9 +4826,6 @@ bool garbage_collect(bool testing)
char name = NUL;
bool is_unnamed = false;
reg_iter = op_global_reg_iter(reg_iter, &name, &reg, &is_unnamed);
- if (name != NUL) {
- ABORTING(set_ref_dict)(reg.additional_data, copyID);
- }
} while (reg_iter != NULL);
}
@@ -4856,9 +4836,6 @@ bool garbage_collect(bool testing)
xfmark_T fm;
char name = NUL;
mark_iter = mark_global_iter(mark_iter, &name, &fm);
- if (name != NUL) {
- ABORTING(set_ref_dict)(fm.fmark.additional_data, copyID);
- }
} while (mark_iter != NULL);
}
@@ -4900,36 +4877,6 @@ bool garbage_collect(bool testing)
// v: vars
ABORTING(set_ref_in_ht)(&vimvarht, copyID, NULL);
- // history items (ShaDa additional elements)
- if (p_hi) {
- for (int i = 0; i < HIST_COUNT; i++) {
- const void *iter = NULL;
- do {
- histentry_T hist;
- iter = hist_iter(iter, (uint8_t)i, false, &hist);
- if (hist.hisstr != NULL) {
- ABORTING(set_ref_list)(hist.additional_elements, copyID);
- }
- } while (iter != NULL);
- }
- }
-
- // previously used search/substitute patterns (ShaDa additional data)
- {
- SearchPattern pat;
- get_search_pattern(&pat);
- ABORTING(set_ref_dict)(pat.additional_data, copyID);
- get_substitute_pattern(&pat);
- ABORTING(set_ref_dict)(pat.additional_data, copyID);
- }
-
- // previously used replacement string
- {
- SubReplacementString sub;
- sub_get_replacement(&sub);
- ABORTING(set_ref_list)(sub.additional_elements, copyID);
- }
-
ABORTING(set_ref_in_quickfix)(copyID);
bool did_free = false;
@@ -5211,52 +5158,6 @@ bool set_ref_in_item(typval_T *tv, int copyID, ht_stack_T **ht_stack, list_stack
return abort;
}
-/// Mark all lists and dicts referenced in given mark
-///
-/// @return true if setting references failed somehow.
-static inline bool set_ref_in_fmark(fmark_T fm, int copyID)
- FUNC_ATTR_WARN_UNUSED_RESULT
-{
- if (fm.additional_data != NULL
- && fm.additional_data->dv_copyID != copyID) {
- fm.additional_data->dv_copyID = copyID;
- return set_ref_in_ht(&fm.additional_data->dv_hashtab, copyID, NULL);
- }
- return false;
-}
-
-/// Mark all lists and dicts referenced in given list and the list itself
-///
-/// @return true if setting references failed somehow.
-static inline bool set_ref_list(list_T *list, int copyID)
- FUNC_ATTR_WARN_UNUSED_RESULT
-{
- if (list != NULL) {
- typval_T tv = (typval_T) {
- .v_type = VAR_LIST,
- .vval = { .v_list = list }
- };
- return set_ref_in_item(&tv, copyID, NULL, NULL);
- }
- return false;
-}
-
-/// Mark all lists and dicts referenced in given dict and the dict itself
-///
-/// @return true if setting references failed somehow.
-static inline bool set_ref_dict(dict_T *dict, int copyID)
- FUNC_ATTR_WARN_UNUSED_RESULT
-{
- if (dict != NULL) {
- typval_T tv = (typval_T) {
- .v_type = VAR_DICT,
- .vval = { .v_dict = dict }
- };
- return set_ref_in_item(&tv, copyID, NULL, NULL);
- }
- return false;
-}
-
/// Get the key for #{key: val} into "tv" and advance "arg".
///
/// @return FAIL when there is no valid key.
diff --git a/src/nvim/eval/decode.c b/src/nvim/eval/decode.c
index 13cd3274dd..afc2efddf6 100644
--