[tarantool-patches] [PATCH 1/4] app: serializers update now is reflected in Lua
Vladislav Shpilevoy
v.shpilevoy at tarantool.org
Thu Sep 5 00:44:44 MSK 2019
There are some objects called serializers - msgpack, cjson, yaml,
maybe more. They are global objects affecting both Lua and C
modules.
A serializer have settings which can be updated. But before the
patch an update changed only C structure of the serializer. It
made impossible to use settings of the serializers from Lua.
Now any update of any serializer is reflected both in its C and
Lua structures.
Part of #4434
---
src/lua/utils.c | 34 +++++++++++++++-------------
test/app-tap/json.test.lua | 3 ++-
test/app-tap/lua/serializer_test.lua | 13 +++++++++++
test/app-tap/msgpack.test.lua | 3 ++-
4 files changed, 35 insertions(+), 18 deletions(-)
diff --git a/src/lua/utils.c b/src/lua/utils.c
index 75efe0ed2..a082a2e5b 100644
--- a/src/lua/utils.c
+++ b/src/lua/utils.c
@@ -270,10 +270,8 @@ luaL_serializer_parse_option(struct lua_State *L, int i,
struct luaL_serializer *cfg)
{
lua_getfield(L, 2, OPTIONS[i].name);
- if (lua_isnil(L, -1)) {
- lua_pop(L, 1);
+ if (lua_isnil(L, -1))
return NULL;
- }
/*
* Update struct luaL_serializer using pointer to a
* configuration value (all values must be `int` for that).
@@ -289,7 +287,6 @@ luaL_serializer_parse_option(struct lua_State *L, int i,
default:
unreachable();
}
- lua_pop(L, 1);
return pval;
}
@@ -297,26 +294,31 @@ void
luaL_serializer_parse_options(struct lua_State *L,
struct luaL_serializer *cfg)
{
- for (int i = 0; OPTIONS[i].name != NULL; i++)
+ for (int i = 0; OPTIONS[i].name != NULL; ++i) {
luaL_serializer_parse_option(L, i, cfg);
+ lua_pop(L, 1);
+ }
}
/**
- * @brief serializer.cfg{} Lua binding for serializers.
- * serializer.cfg is a table that contains current configuration values from
- * luaL_serializer structure. serializer.cfg has overriden __call() method
- * to change configuration keys in internal userdata (like box.cfg{}).
- * Please note that direct change in serializer.cfg.key will not affect
- * internal state of userdata.
- * @param L lua stack
- * @return 0
+ * Serializer.cfg.__call implementation. Merge new parameters into
+ * both C structure of the serializer, and into its Lua table
+ * representation: serializer.cfg.
*/
static int
luaL_serializer_cfg(struct lua_State *L)
{
- luaL_checktype(L, 1, LUA_TTABLE); /* serializer */
- luaL_checktype(L, 2, LUA_TTABLE); /* serializer.cfg */
- luaL_serializer_parse_options(L, luaL_checkserializer(L));
+ /* Serializer.cfg */
+ luaL_checktype(L, 1, LUA_TTABLE);
+ /* Updated parameters. */
+ luaL_checktype(L, 2, LUA_TTABLE);
+ struct luaL_serializer *cfg = luaL_checkserializer(L);
+ for (int i = 0; OPTIONS[i].name != NULL; ++i) {
+ if (luaL_serializer_parse_option(L, i, cfg) == NULL)
+ lua_pop(L, 1);
+ else
+ lua_setfield(L, 1, OPTIONS[i].name);
+ }
return 0;
}
diff --git a/test/app-tap/json.test.lua b/test/app-tap/json.test.lua
index 10f6f4ab2..0a8966866 100755
--- a/test/app-tap/json.test.lua
+++ b/test/app-tap/json.test.lua
@@ -22,7 +22,7 @@ end
tap.test("json", function(test)
local serializer = require('json')
- test:plan(32)
+ test:plan(33)
test:test("unsigned", common.test_unsigned, serializer)
test:test("signed", common.test_signed, serializer)
@@ -32,6 +32,7 @@ tap.test("json", function(test)
test:test("nil", common.test_nil, serializer)
test:test("table", common.test_table, serializer, is_array, is_map)
test:test("ucdata", common.test_ucdata, serializer)
+ test:test("depth", common.test_depth, serializer)
test:test("misc", test_misc, serializer)
--
diff --git a/test/app-tap/lua/serializer_test.lua b/test/app-tap/lua/serializer_test.lua
index e7048da4d..a44247d70 100644
--- a/test/app-tap/lua/serializer_test.lua
+++ b/test/app-tap/lua/serializer_test.lua
@@ -402,6 +402,18 @@ local function test_ucdata(test, s)
ss = nil
end
+local function test_depth(test, s)
+ test:plan(1)
+ --
+ -- gh-4434: serializer update should be reflected in Lua.
+ --
+ local max_depth = s.cfg.encode_max_depth
+ s.cfg({encode_max_depth = max_depth + 5})
+ test:is(s.cfg.encode_max_depth, max_depth + 5,
+ "cfg({<name> = value}) is reflected in cfg.<name>")
+ s.cfg({encode_max_depth = max_depth})
+end
+
return {
test_unsigned = test_unsigned;
test_signed = test_signed;
@@ -412,4 +424,5 @@ return {
test_table = test_table;
test_ucdata = test_ucdata;
test_decimal = test_decimal;
+ test_depth = test_depth;
}
diff --git a/test/app-tap/msgpack.test.lua b/test/app-tap/msgpack.test.lua
index bd095e5ae..752f107a8 100755
--- a/test/app-tap/msgpack.test.lua
+++ b/test/app-tap/msgpack.test.lua
@@ -231,7 +231,7 @@ end
tap.test("msgpack", function(test)
local serializer = require('msgpack')
- test:plan(11)
+ test:plan(12)
test:test("unsigned", common.test_unsigned, serializer)
test:test("signed", common.test_signed, serializer)
test:test("double", common.test_double, serializer)
@@ -240,6 +240,7 @@ tap.test("msgpack", function(test)
test:test("nil", common.test_nil, serializer)
test:test("table", common.test_table, serializer, is_array, is_map)
test:test("ucdata", common.test_ucdata, serializer)
+ test:test("depth", common.test_depth, serializer)
test:test("offsets", test_offsets, serializer)
test:test("misc", test_misc, serializer)
test:test("decode_array_map", test_decode_array_map_header, serializer)
--
2.20.1 (Apple Git-117)
More information about the Tarantool-patches
mailing list