aboutsummaryrefslogtreecommitdiff
path: root/src/mpack/lmpack.c
diff options
context:
space:
mode:
authorJosh Rahm <joshuarahm@gmail.com>2023-11-29 22:39:54 +0000
committerJosh Rahm <joshuarahm@gmail.com>2023-11-29 22:39:54 +0000
commit21cb7d04c387e4198ca8098a884c78b56ffcf4c2 (patch)
tree84fe5690df1551f0bb2bdfe1a13aacd29ebc1de7 /src/mpack/lmpack.c
parentd9c904f85a23a496df4eb6be42aa43f007b22d50 (diff)
parent4a8bf24ac690004aedf5540fa440e788459e5e34 (diff)
downloadrneovim-colorcolchar.tar.gz
rneovim-colorcolchar.tar.bz2
rneovim-colorcolchar.zip
Merge remote-tracking branch 'upstream/master' into colorcolcharcolorcolchar
Diffstat (limited to 'src/mpack/lmpack.c')
-rw-r--r--src/mpack/lmpack.c25
1 files changed, 11 insertions, 14 deletions
diff --git a/src/mpack/lmpack.c b/src/mpack/lmpack.c
index 53d7092a0c..ff21e29789 100644
--- a/src/mpack/lmpack.c
+++ b/src/mpack/lmpack.c
@@ -1,6 +1,3 @@
-// This is an open source non-commercial project. Dear PVS-Studio, please check
-// it. PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
-
/*
* This module exports three classes, and each instance of those classes has its
* own private registry for temporary reference storage(keeping state between
@@ -27,7 +24,7 @@
#include <lua.h>
#include <luaconf.h>
-#include "nvim/macros.h"
+#include "nvim/macros_defs.h"
#include "lmpack.h"
@@ -233,7 +230,7 @@ static mpack_uint32_t lmpack_objlen(lua_State *L, int *is_array)
while (lua_next(L, -2)) {
lua_pop(L, 1); /* pop value */
isarr = isarr
- && lua_isnumber(L, -1) /* lua number */
+ && lua_type(L, -1) == LUA_TNUMBER /* lua number */
&& (n = lua_tonumber(L, -1)) > 0 /* greater than 0 */
&& (size_t)n == n; /* and integer */
max = isarr && (size_t)n > max ? (size_t)n : max;
@@ -246,7 +243,7 @@ static mpack_uint32_t lmpack_objlen(lua_State *L, int *is_array)
}
end:
- if ((size_t)-1 > (mpack_uint32_t)-1 && len > (mpack_uint32_t)-1) // -V560
+ if ((size_t)-1 > (mpack_uint32_t)-1 && len > (mpack_uint32_t)-1)
/* msgpack spec doesn't allow lengths > 32 bits */
len = (mpack_uint32_t)-1;
assert(top == lua_gettop(L));
@@ -644,7 +641,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 +704,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 +722,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);