mirror of
https://github.com/neovim/neovim.git
synced 2025-09-27 21:48:35 +00:00
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.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
@@ -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);
|
||||
|
@@ -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;
|
||||
|
@@ -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 {
|
||||
|
@@ -1,6 +1,5 @@
|
||||
#include <assert.h>
|
||||
#include <inttypes.h>
|
||||
#include <msgpack/pack.h>
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
Reference in New Issue
Block a user