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:
bfredl
2024-07-02 13:45:50 +02:00
parent 0c2860d9e5
commit f926cc32c9
42 changed files with 1025 additions and 1165 deletions

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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;

View File

@@ -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 {

View File

@@ -1,6 +1,5 @@
#include <assert.h>
#include <inttypes.h>
#include <msgpack/pack.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>