[tarantool-patches] Re: [PATCH v3] json: add options to json.encode()
Vladislav Shpilevoy
v.shpilevoy at tarantool.org
Thu Jul 26 15:33:22 MSK 2018
The diff below again differs from the one on the branch.
Here what I see on the branch: https://github.com/tarantool/tarantool/commit/1476db8c67470f149e31f67255131802a7e02690
Its first diff is removal of a line from src/lua/utils.c. But diff
below firstly adds the line. Looks like you have sent reverted diff.
On 26/07/2018 15:29, roman.habibov1 at yandex.ru wrote:
> Sorry again. I hurried.
>
> diff --git a/src/lua/utils.c b/src/lua/utils.c
> index 3b89719ef..2f0f4dcf8 100644
> --- a/src/lua/utils.c
> +++ b/src/lua/utils.c
> @@ -186,6 +186,7 @@ luaL_setcdatagc(struct lua_State *L, int idx)
> lua_pop(L, 1);
> }
>
> +
> #define OPTION(type, name, defvalue) { #name, \
> offsetof(struct luaL_serializer, name), type, defvalue}
> /**
> @@ -213,44 +214,6 @@ static struct {
> { NULL, 0, 0, 0},
> };
>
> -int *
> -parse_option(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); /* key hasn't changed */
> - return NULL;
> - }
> - /*
> - * Update struct luaL_serializer using pointer to a
> - * configuration value (all values must be `int` for that).
> - */
> - int *pval = (int *) ((char *) cfg + OPTIONS[i].offset);
> - /* Update struct luaL_serializer structure */
> - switch (OPTIONS[i].type) {
> - case LUA_TBOOLEAN:
> - *pval = lua_toboolean(L, -1);
> - break;
> - case LUA_TNUMBER:
> - *pval = lua_tointeger(L, -1);
> - break;
> - default:
> - unreachable();
> - }
> - return pval;
> -}
> -
> -int
> -parse_options(lua_State *L, struct luaL_serializer *cfg) {
> - for (int i = 0; OPTIONS[i].name != NULL; i++) {
> - int *pval = parse_option(L, i, cfg);
> - /* Update struct luaL_serializer structure */
> - if (pval != NULL)
> - lua_pop(L, 1);
> - }
> - lua_pop(L, 1);
> - return 0;
> -}
> -
> /**
> * @brief serializer.cfg{} Lua binding for serializers.
> * serializer.cfg is a table that contains current configuration values from
> @@ -269,22 +232,31 @@ luaL_serializer_cfg(lua_State *L)
> struct luaL_serializer *cfg = luaL_checkserializer(L);
> /* Iterate over all available options and checks keys in passed table */
> for (int i = 0; OPTIONS[i].name != NULL; i++) {
> - int* pval = parse_option(L, i, cfg);
> + lua_getfield(L, 2, OPTIONS[i].name);
> + if (lua_isnil(L, -1)) {
> + lua_pop(L, 1); /* key hasn't changed */
> + continue;
> + }
> + /*
> + * Update struct luaL_serializer using pointer to a
> + * configuration value (all values must be `int` for that).
> + */
> + int *pval = (int *) ((char *) cfg + OPTIONS[i].offset);
> /* Update struct luaL_serializer structure */
> - if (pval != NULL) {
> - switch (OPTIONS[i].type) {
> - case LUA_TBOOLEAN:
> - lua_pushboolean(L, *pval);
> - break;
> - case LUA_TNUMBER:
> - lua_pushinteger(L, *pval);
> - break;
> - default:
> - unreachable();
> - }
> + switch (OPTIONS[i].type) {
> + case LUA_TBOOLEAN:
> + *pval = lua_toboolean(L, -1);
> + lua_pushboolean(L, *pval);
> + break;
> + case LUA_TNUMBER:
> + *pval = lua_tointeger(L, -1);
> + lua_pushinteger(L, *pval);
> + break;
> + default:
> + unreachable();
> + }
> /* Save normalized value to serializer.cfg table */
> lua_setfield(L, 1, OPTIONS[i].name);
> - }
> }
> return 0;
> }
> diff --git a/src/lua/utils.h b/src/lua/utils.h
> index 21eb36856..6b057af3e 100644
> --- a/src/lua/utils.h
> +++ b/src/lua/utils.h
> @@ -240,30 +240,6 @@ luaL_checkserializer(struct lua_State *L) {
> luaL_checkudata(L, lua_upvalueindex(1), LUAL_SERIALIZER);
> }
>
> -/**
> - * parse_option is a function that is used to configure one field
> - * in luaL_serializer struct. Adds one lua table to the top of
> - * Lua stack.
> - * @param L lua stack
> - * @param index of option in OPTIONS[]
> - * @param serializer to inherit configuration
> - * @return ponter to the value of option
> - */
> -int *
> -parse_option(lua_State *l, int i, struct luaL_serializer* cfg);
> -
> -/**
> - * parse_options is a function that is used to serialize lua table
> - * of options to luaL_serializer struct. Removes the lua table from
> - * the top of lua stack.
> - * parse_options.
> - * @param L lua stack
> - * @param serializer to inherit configuration
> - * @return 0
> - */
> -int
> -parse_options(lua_State *l, struct luaL_serializer* cfg);
> -
> /** A single value on the Lua stack. */
> struct luaL_field {
> union {
> diff --git a/test/app-tap/json.test.lua b/test/app-tap/json.test.lua
> index d76297ab5..3884b41e7 100755
> --- a/test/app-tap/json.test.lua
> +++ b/test/app-tap/json.test.lua
> @@ -22,55 +22,7 @@ end
>
> tap.test("json", function(test)
> local serializer = require('json')
> - test:plan(21)
> -
> --- gh-2888: check the possibility of using options in encode()/decode()
> -
> - local sub = {a = 1, { b = {c = 1, d = {e = 1}}}}
> - serializer.cfg({encode_max_depth = 1})
> - test:ok(serializer.encode(sub) == '{"1":null,"a":1}',
> - 'depth of encoding is 1 with .cfg')
> - serializer.cfg({encode_max_depth = 2})
> - test:ok(serializer.encode(sub) == '{"1":{"b":null},"a":1}',
> - 'depth of encoding is 2 with .cfg')
> - serializer.cfg({encode_max_depth = 2})
> - test:ok(serializer.encode(sub, {encode_max_depth = 1}) == '{"1":null,"a":1}',
> - 'depth of encoding is 1 with .encode')
> -
> - local nan = 1/0
> - test:ok(serializer.encode({a = nan}) == '{"a":inf}',
> - 'default "encode_invalid_numbers"')
> - serializer.cfg({encode_invalid_numbers = false})
> - test:ok(pcall(serializer.encode, {a = nan}) == false,
> - 'expected error with NaN ecoding with .cfg')
> - serializer.cfg({encode_invalid_numbers = true})
> - test:ok(pcall(serializer.encode, {a = nan},
> - {encode_invalid_numbers = false}) == false,
> - 'expected error with NaN ecoding with .encode')
> -
> - local number = 0.12345
> - test:ok(serializer.encode({a = number}) == '{"a":0.12345}',
> - 'precision more than 5')
> - serializer.cfg({encode_number_precision = 3})
> - test:ok(serializer.encode({a = number}) == '{"a":0.123}',
> - 'precision is 3')
> - serializer.cfg({encode_number_precision = 14})
> - test:ok(serializer.encode({a = number},
> - {encode_number_precision = 3}) == '{"a":0.123}', 'precision is 3')
> -
> - serializer.cfg({decode_invalid_numbers = false})
> - test:ok(pcall(serializer.decode, '{"a":inf}') == false,
> - 'expected error with NaN decoding with .cfg')
> - serializer.cfg({decode_invalid_numbers = true})
> - test:ok(pcall(serializer.decode, '{"a":inf}',
> - {decode_invalid_numbers = false}) == false,
> - 'expected error with NaN decoding with .decode')
> -
> - test:ok(pcall(serializer.decode, '{"1":{"b":{"c":1,"d":null}},"a":1}',
> - {decode_max_depth = 2}) == false,
> - 'error: too many nested data structures')
> -
> ---
> + test:plan(9)
> test:test("unsigned", common.test_unsigned, serializer)
> test:test("signed", common.test_signed, serializer)
> test:test("double", common.test_double, serializer)
> diff --git a/third_party/lua-cjson/lua_cjson.c b/third_party/lua-cjson/lua_cjson.c
> index 29553fc4d..aa8217dfb 100644
> --- a/third_party/lua-cjson/lua_cjson.c
> +++ b/third_party/lua-cjson/lua_cjson.c
> @@ -417,25 +417,22 @@ static void json_append_data(lua_State *l, struct luaL_serializer *cfg,
> }
> }
>
> -static int json_encode(lua_State *l) {
> - luaL_argcheck(l, (lua_gettop(l) == 2) || (lua_gettop(l) == 1),
> - 1, "expected 1 or 2 arguments");
> +static int json_encode(lua_State *l)
> +{
> + struct luaL_serializer *cfg = luaL_checkserializer(l);
> + char *json;
> + int len;
> +
> + luaL_argcheck(l, lua_gettop(l) == 1, 1, "expected 1 argument");
>
> /* Reuse existing buffer */
> strbuf_reset(&encode_buf);
> - struct luaL_serializer *cfg = luaL_checkserializer(l);
>
> - if (lua_gettop(l) == 2) {
> - struct luaL_serializer user_cfg = *cfg;
> - parse_options(l, &user_cfg);
> - json_append_data(l, &user_cfg, 0, &encode_buf);
> - } else {
> - json_append_data(l, cfg, 0, &encode_buf);
> - }
> + json_append_data(l, cfg, 0, &encode_buf);
> + json = strbuf_string(&encode_buf, &len);
>
> - int len;
> - char *json = strbuf_string(&encode_buf, &len);
> lua_pushlstring(l, json, len);
> +
> return 1;
> }
>
> @@ -980,17 +977,9 @@ static int json_decode(lua_State *l)
> json_token_t token;
> size_t json_len;
>
> - luaL_argcheck(l, (lua_gettop(l) == 2) || (lua_gettop(l) == 1),
> - 1, "expected 1 or 2 arguments");
> -
> - if (lua_gettop(l) == 2) {
> - struct luaL_serializer user_cfg = *luaL_checkserializer(l);
> - parse_options(l, &user_cfg);
> - json.cfg = &user_cfg;
> - } else {
> - json.cfg = luaL_checkserializer(l);
> - }
> + luaL_argcheck(l, lua_gettop(l) == 1, 1, "expected 1 argument");
>
> + json.cfg = luaL_checkserializer(l);
> json.data = luaL_checklstring(l, 1, &json_len);
> json.current_depth = 0;
> json.ptr = json.data;
>
> 26.07.2018, 13:07, "Vladislav Shpilevoy" <v.shpilevoy at tarantool.org>:
>> Hi!
>>
>> 1. Build error.
>>
>> [ 66%] Building C object src/CMakeFiles/server.dir/__/third_party/lua-cjson/lua_cjson.c.o
>> /Users/v.shpilevoy/Work/Repositories/tarantool/src/lua/utils.c:250:13: error: use of undeclared identifier 'l'
>> lua_pop(l, 1);
>> ^
>> 1 error generated.
>>
>> 2. The patch you sent below differs from the one on the
>> branch. For example, first diff lines on the branch:
>>
>> diff --git a/src/lua/utils.c b/src/lua/utils.c
>> index 2f0f4dcf8..012758b7f 100644
>> --- a/src/lua/utils.c
>> +++ b/src/lua/utils.c
>> @@ -186,7 +186,6 @@ luaL_setcdatagc(struct lua_State *L, int idx)
>> lua_pop(L, 1);
>> }
>>
>> -
>> #define OPTION(type, name, defvalue) { #name, \
>> offsetof(struct luaL_serializer, name), type, defvalue}
>> /**
>> @@ -214,6 +213,44 @@ static struct {
>>
>> But below I see another diff.
>>
>> On 26/07/2018 12:40, roman.habibov1 at yandex.ru wrote:
>>> Sorry. https://github.com/tarantool/tarantool/commit/768b875e498a17b3d5e404af79c1119b10a966e3
>>>
>>> diff --git a/src/lua/utils.c b/src/lua/utils.c
>>> index 0626bf76b..012758b7f 100644
>>> --- a/src/lua/utils.c
>>> +++ b/src/lua/utils.c
>>> @@ -186,19 +186,35 @@ luaL_setcdatagc(struct lua_State *L, int idx)
>>> lua_pop(L, 1);
>>> }
>>>
>>> +#define OPTION(type, name, defvalue) { #name, \
>>> + offsetof(struct luaL_serializer, name), type, defvalue}
>>> /**
>>> - * @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
>>> + * Configuration options for serializers
>>> + * @sa struct luaL_serializer
>>> */
>>> -
>>> -/*Serialize one option. Returns ponter to the value of option.*/
>>> -int* parse_option(lua_State *L, int i, struct luaL_serializer* cfg) {
>>> +static struct {
>>> + const char *name;
>>> + size_t offset; /* offset in structure */
>>> + int type;
>>> + int defvalue;
>>> +} OPTIONS[] = {
>>> + OPTION(LUA_TBOOLEAN, encode_sparse_convert, 1),
>>> + OPTION(LUA_TNUMBER, encode_sparse_ratio, 2),
>>> + OPTION(LUA_TNUMBER, encode_sparse_safe, 10),
>>> + OPTION(LUA_TNUMBER, encode_max_depth, 32),
>>> + OPTION(LUA_TBOOLEAN, encode_invalid_numbers, 1),
>>> + OPTION(LUA_TNUMBER, encode_number_precision, 14),
>>> + OPTION(LUA_TBOOLEAN, encode_load_metatables, 1),
>>> + OPTION(LUA_TBOOLEAN, encode_use_tostring, 0),
>>> + OPTION(LUA_TBOOLEAN, encode_invalid_as_nil, 0),
>>> + OPTION(LUA_TBOOLEAN, decode_invalid_numbers, 1),
>>> + OPTION(LUA_TBOOLEAN, decode_save_metatables, 1),
>>> + OPTION(LUA_TNUMBER, decode_max_depth, 32),
>>> + { NULL, 0, 0, 0},
>>> +};
>>> +
>>> +int *
>>> +parse_option(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); /* key hasn't changed */
>>> @@ -223,6 +239,28 @@ int* parse_option(lua_State *L, int i, struct luaL_serializer* cfg) {
>>> return pval;
>>> }
>>>
>>> +int
>>> +parse_options(lua_State *L, struct luaL_serializer *cfg) {
>>> + for (int i = 0; OPTIONS[i].name != NULL; i++) {
>>> + int *pval = parse_option(L, i, cfg);
>>> + /* Update struct luaL_serializer structure */
>>> + if (pval != NULL)
>>> + lua_pop(L, 1);
>>> + }
>>> + lua_pop(l, 1);
>>> + return 0;
>>> +}
>>> +
>>> +/**
>>> + * @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
>>> + */
>>> static int
>>> luaL_serializer_cfg(lua_State *L)
>>> {
>>> @@ -244,8 +282,8 @@ luaL_serializer_cfg(lua_State *L)
>>> default:
>>> unreachable();
>>> }
>>> - /* Save normalized value to serializer.cfg table */
>>> - lua_setfield(L, 1, OPTIONS[i].name);
>>> + /* Save normalized value to serializer.cfg table */
>>> + lua_setfield(L, 1, OPTIONS[i].name);
>>> }
>>> }
>>> return 0;
>>> diff --git a/src/lua/utils.h b/src/lua/utils.h
>>> index 4a2c3eaac..21eb36856 100644
>>> --- a/src/lua/utils.h
>>> +++ b/src/lua/utils.h
>>> @@ -1,6 +1,5 @@
>>> #ifndef TARANTOOL_LUA_UTILS_H_INCLUDED
>>> #define TARANTOOL_LUA_UTILS_H_INCLUDED
>>> -#pragma GCC diagnostic ignored "-Wunused-variable"
>>> /*
>>> * Copyright 2010-2015, Tarantool AUTHORS, please see AUTHORS file.
>>> *
>>> @@ -241,34 +240,29 @@ luaL_checkserializer(struct lua_State *L) {
>>> luaL_checkudata(L, lua_upvalueindex(1), LUAL_SERIALIZER);
>>> }
>>>
>>> -#define OPTION(type, name, defvalue) { #name, \
>>> - offsetof(struct luaL_serializer, name), type, defvalue}
>>> /**
>>> - * Configuration options for serializers
>>> - * @sa struct luaL_serializer
>>> + * parse_option is a function that is used to configure one field
>>> + * in luaL_serializer struct. Adds one lua table to the top of
>>> + * Lua stack.
>>> + * @param L lua stack
>>> + * @param index of option in OPTIONS[]
>>> + * @param serializer to inherit configuration
>>> + * @return ponter to the value of option
>>> */
>>> -static struct {
>>> - const char *name;
>>> - size_t offset; /* offset in structure */
>>> - int type;
>>> - int defvalue;
>>> -} OPTIONS[] = {
>>> - OPTION(LUA_TBOOLEAN, encode_sparse_convert, 1),
>>> - OPTION(LUA_TNUMBER, encode_sparse_ratio, 2),
>>> - OPTION(LUA_TNUMBER, encode_sparse_safe, 10),
>>> - OPTION(LUA_TNUMBER, encode_max_depth, 32),
>>> - OPTION(LUA_TBOOLEAN, encode_invalid_numbers, 1),
>>> - OPTION(LUA_TNUMBER, encode_number_precision, 14),
>>> - OPTION(LUA_TBOOLEAN, encode_load_metatables, 1),
>>> - OPTION(LUA_TBOOLEAN, encode_use_tostring, 0),
>>> - OPTION(LUA_TBOOLEAN, encode_invalid_as_nil, 0),
>>> - OPTION(LUA_TBOOLEAN, decode_invalid_numbers, 1),
>>> - OPTION(LUA_TBOOLEAN, decode_save_metatables, 1),
>>> - OPTION(LUA_TNUMBER, decode_max_depth, 32),
>>> - { NULL, 0, 0, 0},
>>> -};
>>> +int *
>>> +parse_option(lua_State *l, int i, struct luaL_serializer* cfg);
>>>
>>> -int* parse_option(lua_State *l, int i, struct luaL_serializer* cfg);
>>> +/**
>>> + * parse_options is a function that is used to serialize lua table
>>> + * of options to luaL_serializer struct. Removes the lua table from
>>> + * the top of lua stack.
>>> + * parse_options.
>>> + * @param L lua stack
>>> + * @param serializer to inherit configuration
>>> + * @return 0
>>> + */
>>> +int
>>> +parse_options(lua_State *l, struct luaL_serializer* cfg);
>>>
>>> /** A single value on the Lua stack. */
>>> struct luaL_field {
>>> diff --git a/test/app-tap/json.test.lua b/test/app-tap/json.test.lua
>>> index 050d769ea..d76297ab5 100755
>>> --- a/test/app-tap/json.test.lua
>>> +++ b/test/app-tap/json.test.lua
>>> @@ -22,42 +22,55 @@ end
>>>
>>> tap.test("json", function(test)
>>> local serializer = require('json')
>>> - test:plan(18)
>>> + test:plan(21)
>>>
>>> --- gh-2888 Added opions to encode().
>>> +-- gh-2888: check the possibility of using options in encode()/decode()
>>>
>>> local sub = {a = 1, { b = {c = 1, d = {e = 1}}}}
>>> serializer.cfg({encode_max_depth = 1})
>>> test:ok(serializer.encode(sub) == '{"1":null,"a":1}',
>>> - 'sub == {"1":null,"a":1}')
>>> + 'depth of encoding is 1 with .cfg')
>>> serializer.cfg({encode_max_depth = 2})
>>> test:ok(serializer.encode(sub) == '{"1":{"b":null},"a":1}',
>>> - 'sub == {"1":{"b":null},"a":1}')
>>> + 'depth of encoding is 2 with .cfg')
>>> serializer.cfg({encode_max_depth = 2})
>>> - test:ok(serializer.encode(sub,{encode_max_depth = 1})
>>> - == '{"1":null,"a":1}', 'sub == {"1":null,"a":1}')
>>> + test:ok(serializer.encode(sub, {encode_max_depth = 1}) == '{"1":null,"a":1}',
>>> + 'depth of encoding is 1 with .encode')
>>>
>>> local nan = 1/0
>>> test:ok(serializer.encode({a = nan}) == '{"a":inf}',
>>> - 'a = nan == {"a":inf}')
>>> + 'default "encode_invalid_numbers"')
>>> serializer.cfg({encode_invalid_numbers = false})
>>> test:ok(pcall(serializer.encode, {a = nan}) == false,
>>> - 'error when "encode_invalid_numbers = false" with NaN')
>>> + 'expected error with NaN ecoding with .cfg')
>>> serializer.cfg({encode_invalid_numbers = true})
>>> test:ok(pcall(serializer.encode, {a = nan},
>>> - {encode_invalid_numbers = false}) == false,
>>> - 'error when "encode_invalid_numbers = false" with NaN')
>>> + {encode_invalid_numbers = false}) == false,
>>> + 'expected error with NaN ecoding with .encode')
>>>
>>> local number = 0.12345
>>> test:ok(serializer.encode({a = number}) == '{"a":0.12345}',
>>> - 'precision more than 5')
>>> + 'precision more than 5')
>>> serializer.cfg({encode_number_precision = 3})
>>> test:ok(serializer.encode({a = number}) == '{"a":0.123}',
>>> - 'precision is 3')
>>> + 'precision is 3')
>>> serializer.cfg({encode_number_precision = 14})
>>> test:ok(serializer.encode({a = number},
>>> - {encode_number_precision = 3}) == '{"a":0.123}', 'precision is 3')
>>> + {encode_number_precision = 3}) == '{"a":0.123}', 'precision is 3')
>>>
>>> + serializer.cfg({decode_invalid_numbers = false})
>>> + test:ok(pcall(serializer.decode, '{"a":inf}') == false,
>>> + 'expected error with NaN decoding with .cfg')
>>> + serializer.cfg({decode_invalid_numbers = true})
>>> + test:ok(pcall(serializer.decode, '{"a":inf}',
>>> + {decode_invalid_numbers = false}) == false,
>>> + 'expected error with NaN decoding with .decode')
>>> +
>>> + test:ok(pcall(serializer.decode, '{"1":{"b":{"c":1,"d":null}},"a":1}',
>>> + {decode_max_depth = 2}) == false,
>>> + 'error: too many nested data structures')
>>> +
>>> +--
>>> test:test("unsigned", common.test_unsigned, serializer)
>>> test:test("signed", common.test_signed, serializer)
>>> test:test("double", common.test_double, serializer)
>>> diff --git a/third_party/lua-cjson/lua_cjson.c b/third_party/lua-cjson/lua_cjson.c
>>> index 861079f8a..29553fc4d 100644
>>> --- a/third_party/lua-cjson/lua_cjson.c
>>> +++ b/third_party/lua-cjson/lua_cjson.c
>>> @@ -417,21 +417,9 @@ static void json_append_data(lua_State *l, struct luaL_serializer *cfg,
>>> }
>>> }
>>>
>>> -/*Serialize Lua table of options to luaL_serializer struct.*/
>>> -static int parse_options(lua_State *l, struct luaL_serializer* cfg) {
>>> - for (int i = 0; OPTIONS[i].name != NULL; i++) {
>>> - int *pval = parse_option(l, i, cfg);
>>> - /* Update struct luaL_serializer structure */
>>> - if (pval != NULL)
>>> - lua_pop(l, 1);
>>> - }
>>> - lua_pop(l, 1);
>>> - return 0;
>>> -}
>>> -
>>> static int json_encode(lua_State *l) {
>>> luaL_argcheck(l, (lua_gettop(l) == 2) || (lua_gettop(l) == 1),
>>> - 1, "expected 1 or 2 arguments");
>>> + 1, "expected 1 or 2 arguments");
>>>
>>> /* Reuse existing buffer */
>>> strbuf_reset(&encode_buf);
>>> @@ -443,7 +431,7 @@ static int json_encode(lua_State *l) {
>>> json_append_data(l, &user_cfg, 0, &encode_buf);
>>> } else {
>>> json_append_data(l, cfg, 0, &encode_buf);
>>> -}
>>> + }
>>>
>>> int len;
>>> char *json = strbuf_string(&encode_buf, &len);
>>> @@ -993,7 +981,7 @@ static int json_decode(lua_State *l)
>>> size_t json_len;
>>>
>>> luaL_argcheck(l, (lua_gettop(l) == 2) || (lua_gettop(l) == 1),
>>> - 1, "expected 1 or 2 arguments");
>>> + 1, "expected 1 or 2 arguments");
>>>
>>> if (lua_gettop(l) == 2) {
>>> struct luaL_serializer user_cfg = *luaL_checkserializer(l);
>>>
>>> 26.07.2018, 00:35, "Vladislav Shpilevoy" <v.shpilevoy at tarantool.org>:
>>>> Hi! Thanks for the fixes!
>>>>
>>>> 1. Again, as I said on the previous review. Please, put a new
>>>> patch version at the end of letter.
>>>>
>>>> 2. On the branch I still see the old version. So looks like
>>>> you forgot to push. Please, do it and resend the patch.
More information about the Tarantool-patches
mailing list