From: Vladislav Shpilevoy <v.shpilevoy@tarantool.org> To: tarantool-patches@freelists.org Cc: alexander.turenko@tarantool.org Subject: [tarantool-patches] [PATCH v2 1/4] app: serializers update now is reflected in Lua Date: Mon, 9 Sep 2019 21:00:07 +0200 [thread overview] Message-ID: <da8e9e6e8bebe39ef5710e9ddc71cbc13c576c13.1568055477.git.v.shpilevoy@tarantool.org> (raw) In-Reply-To: <cover.1568055477.git.v.shpilevoy@tarantool.org> 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)
next prev parent reply other threads:[~2019-09-09 18:56 UTC|newest] Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-09-10 20:24 [tarantool-patches] [PATCH v2 0/4] Serializer bugs Vladislav Shpilevoy 2019-09-09 19:00 ` Vladislav Shpilevoy [this message] 2019-09-12 23:22 ` [tarantool-patches] Re: [PATCH v2 1/4] app: serializers update now is reflected in Lua Alexander Turenko 2019-09-13 22:32 ` Vladislav Shpilevoy 2019-09-09 19:00 ` [tarantool-patches] [PATCH v2 2/4] msgpack: make msgpackffi use encode_max_depth option Vladislav Shpilevoy 2019-09-12 23:24 ` [tarantool-patches] " Alexander Turenko 2019-09-13 22:32 ` Vladislav Shpilevoy 2019-09-09 19:00 ` [tarantool-patches] [PATCH v2 3/4] tuple: use global msgpack serializer in Lua tuple Vladislav Shpilevoy 2019-09-12 23:27 ` [tarantool-patches] " Alexander Turenko 2019-09-13 22:32 ` Vladislav Shpilevoy 2019-09-09 19:00 ` [tarantool-patches] [PATCH v2 4/4] app: allow to raise an error on too nested tables Vladislav Shpilevoy 2019-09-12 23:32 ` [tarantool-patches] " Alexander Turenko 2019-09-13 22:32 ` Vladislav Shpilevoy 2019-09-10 20:25 ` [tarantool-patches] Re: [PATCH v2 0/4] Serializer bugs Vladislav Shpilevoy 2019-09-12 23:44 ` Alexander Turenko 2019-09-13 22:32 ` Vladislav Shpilevoy
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=da8e9e6e8bebe39ef5710e9ddc71cbc13c576c13.1568055477.git.v.shpilevoy@tarantool.org \ --to=v.shpilevoy@tarantool.org \ --cc=alexander.turenko@tarantool.org \ --cc=tarantool-patches@freelists.org \ --subject='Re: [tarantool-patches] [PATCH v2 1/4] app: serializers update now is reflected in Lua' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox