aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/api
diff options
context:
space:
mode:
authorbfredl <bjorn.linse@gmail.com>2024-07-02 13:45:50 +0200
committerbfredl <bjorn.linse@gmail.com>2024-08-05 11:12:44 +0200
commitf926cc32c9262b6254e2843276b951cef9da1afe (patch)
tree56f13240abae6ec0f3b13022b011da84948788c0 /src/nvim/api
parent0c2860d9e5ec5417a94db6e3edd237578b76d418 (diff)
downloadrneovim-f926cc32c9262b6254e2843276b951cef9da1afe.tar.gz
rneovim-f926cc32c9262b6254e2843276b951cef9da1afe.tar.bz2
rneovim-f926cc32c9262b6254e2843276b951cef9da1afe.zip
refactor(shada): rework msgpack decoding without msgpack-c
This also makes shada reading slightly faster due to avoiding some copying and allocation. Use keysets to drive decoding of msgpack maps for shada entries.
Diffstat (limited to 'src/nvim/api')
-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
5 files changed, 58 insertions, 12 deletions
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>