diff options
author | bfredl <bjorn.linse@gmail.com> | 2023-02-10 20:51:36 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-02-10 20:51:36 +0100 |
commit | b8ad1bfe8bc23ed5ffbfe43df5fda3501f1d2802 (patch) | |
tree | ea341bee19c2202cbe94ccefb2afeba953af713e /src | |
parent | 4c64cbe99f2616a1d1126257da8d40773f4adba1 (diff) | |
parent | 0837980db4958baca96449869d31120f349f3500 (diff) | |
download | rneovim-b8ad1bfe8bc23ed5ffbfe43df5fda3501f1d2802.tar.gz rneovim-b8ad1bfe8bc23ed5ffbfe43df5fda3501f1d2802.tar.bz2 rneovim-b8ad1bfe8bc23ed5ffbfe43df5fda3501f1d2802.zip |
Merge pull request #22077 from bfredl/neolua_client
refactor(tests): integrate lua-client into core and use core for functionaltests
Diffstat (limited to 'src')
-rw-r--r-- | src/mpack/lmpack.c | 16 | ||||
-rw-r--r-- | src/mpack/object.c | 11 |
2 files changed, 16 insertions, 11 deletions
diff --git a/src/mpack/lmpack.c b/src/mpack/lmpack.c index 53d7092a0c..957bac37cc 100644 --- a/src/mpack/lmpack.c +++ b/src/mpack/lmpack.c @@ -644,7 +644,13 @@ static void lmpack_unparse_enter(mpack_parser_t *parser, mpack_node_t *node) mpack_node_t *n; int has_meta = lua_getmetatable(L, -1); - if (packer->ext != LUA_NOREF && has_meta) { + int has_mtdict = false; + if (has_meta && packer->mtdict != LUA_NOREF) { + lmpack_geti(L, packer->reg, packer->mtdict); // [table, metatable, mtdict] + has_mtdict = lua_rawequal(L, -1, -2); + lua_pop(L, 1); // [table, metatable]; + } + if (packer->ext != LUA_NOREF && has_meta && !has_mtdict) { /* check if there's a handler for this metatable */ lmpack_geti(L, packer->reg, packer->ext); lua_pushvalue(L, -2); @@ -701,14 +707,7 @@ static void lmpack_unparse_enter(mpack_parser_t *parser, mpack_node_t *node) } } - int is_array = 1; if (has_meta) { - // stack: [table, metatable] - if (packer->mtdict != LUA_NOREF) { - lmpack_geti(L, packer->reg, packer->mtdict); // [table, metatable, mtdict] - is_array = !lua_rawequal(L, -1, -2); - lua_pop(L, 1); // [table, metatable]; - } lua_pop(L, 1); // [table] } @@ -726,6 +725,7 @@ static void lmpack_unparse_enter(mpack_parser_t *parser, mpack_node_t *node) lua_pop(L, 1); } + int is_array = !has_mtdict; len = lmpack_objlen(L, &is_array); if (is_array) { node->tok = mpack_pack_array(len); diff --git a/src/mpack/object.c b/src/mpack/object.c index e2d893bc88..60f49f73aa 100644 --- a/src/mpack/object.c +++ b/src/mpack/object.c @@ -128,8 +128,11 @@ MPACK_API int mpack_unparse(mpack_parser_t *parser, char **buf, size_t *buflen, return status; } -MPACK_API void mpack_parser_copy(mpack_parser_t *dst, mpack_parser_t *src) +MPACK_API void mpack_parser_copy(mpack_parser_t *d, mpack_parser_t *s) { + // workaround UBSAN being NOT happy with a flexible array member with arr[N>1] initial size + mpack_one_parser_t *dst = (mpack_one_parser_t *)d; + mpack_one_parser_t *src = (mpack_one_parser_t *)s; mpack_uint32_t i; mpack_uint32_t dst_capacity = dst->capacity; assert(src->capacity <= dst_capacity); @@ -148,8 +151,9 @@ static int mpack_parser_full(mpack_parser_t *parser) return parser->size == parser->capacity; } -static mpack_node_t *mpack_parser_push(mpack_parser_t *parser) +static mpack_node_t *mpack_parser_push(mpack_parser_t *p) { + mpack_one_parser_t *parser = (mpack_one_parser_t *)p; mpack_node_t *top; assert(parser->size < parser->capacity); top = parser->items + parser->size + 1; @@ -162,8 +166,9 @@ static mpack_node_t *mpack_parser_push(mpack_parser_t *parser) return top; } -static mpack_node_t *mpack_parser_pop(mpack_parser_t *parser) +static mpack_node_t *mpack_parser_pop(mpack_parser_t *p) { + mpack_one_parser_t *parser = (mpack_one_parser_t *)p; mpack_node_t *top, *parent; assert(parser->size); top = parser->items + parser->size; |