Tarantool development patches archive
 help / color / mirror / Atom feed
From: Konstantin Osipov <kostja@tarantool.org>
To: tarantool-patches@freelists.org
Cc: vdavydov.dev@gmail.com
Subject: Re: [tarantool-patches] [PATCH v2 02/10] yaml: introduce yaml.encode_tagged
Date: Thu, 10 May 2018 21:22:10 +0300	[thread overview]
Message-ID: <20180510182210.GB30593@atlas> (raw)
In-Reply-To: <7c30b9483a38bd36425d7e0c87b4d15e8893446e.1524228894.git.v.shpilevoy@tarantool.org>

* Vladislav Shpilevoy <v.shpilevoy@tarantool.org> [18/04/20 16:25]:
> index 430f4be2c..8329f84e9 100644
> --- a/third_party/lua-yaml/lyaml.cc
> +++ b/third_party/lua-yaml/lyaml.cc
> @@ -78,6 +78,8 @@ struct lua_yaml_dumper {
>     unsigned int anchor_number;
>     yaml_emitter_t emitter;
>     char error;
> +   yaml_tag_directive_t begin_tag;
> +   yaml_tag_directive_t *end_tag;

Please add comments for the new members.

>  
> +/**
> + * Encode a Lua object or objects into YAML documents onto Lua
> + * stack.

Encode an object or objects on Lua stack into YAML stream.

> + * @param L Lua stack to get arguments and push result.
> + * @param serializer Lua YAML serializer.
> + * @param tag_handle NULL, or a global tag handle. Handle becomes
> + *        a synonym for prefix.

The handle becomes a synonym for prefix. 


I don't understand what this means.

> + * @param tag_prefix NULL, or a global tag prefix, to which @a
> + *        handle is expanded.

Perhaps you could say a few words here about handles, prefixes and
expansions, or, better yet, quote the relevant parts of YAML
standard.

> + * @retval nil, error Error.
> + * @retval not nil Lua string with dumped object.

The return value is integer. What did you mean to say?
For Lua functions it's better to write something like -2, +1 
(pops two, pushes 1).

> + */
> +static int
> +lua_yaml_encode_impl(lua_State *L, struct luaL_serializer *serializer,
> +                     const char *tag_handle, const char *tag_prefix)
> +{
>     struct lua_yaml_dumper dumper;
>     int i, argcount = lua_gettop(L);
>     yaml_event_t ev;
>  
>     dumper.L = L;
> -   dumper.cfg = luaL_checkserializer(L);
> +   dumper.begin_tag.handle = (yaml_char_t *) tag_handle;
> +   dumper.begin_tag.prefix = (yaml_char_t *) tag_prefix;
> +   /*
> +    * If a tag is specified, then tag list is not empty and
> +    * consists of a single tag.
> +    */
> +   if (tag_handle != NULL && tag_prefix != NULL)

Why do you need to check both?

dumper.end_tag = &dumper.begin_tag + (tag_handle != NULL && tag_prefix != NULL);
> +      dumper.end_tag = &dumper.begin_tag + 1;
> +   else
> +      dumper.end_tag = &dumper.begin_tag;
> +   dumper.cfg = serializer;
>     dumper.error = 0;
>     /* create thread to use for YAML buffer */
>     dumper.outputL = lua_newthread(L);
> @@ -684,11 +712,46 @@ error:
>     }
>  }
>  
> +static int l_dump(lua_State *L) {

Missing newline.

The function needs a formal comment, even though it's trivial.

> +   return lua_yaml_encode_impl(L, luaL_checkserializer(L), NULL, NULL);
> +}
> +
> +/**
> + * Dump a Lua object into YAML string with a global TAG specified.

Serialize a Lua object as YAML string, taking into account a
global tag, if it's supplied in the arguments.

> + * @param options First argument on a stack, consists of two
> + *        options: tag prefix and tag handle.
> + * @param object Lua object to dump under the global tag.
> + * @retval Lua string with dumped object.

Why do you take options first, object second? AFAICS we usually
take object first, options second. Let's be consistent?

Which begs the question, why do you need a new function rather
than extend an existing one with options?

> + */
> +static int l_dump_tagged(lua_State *L)
> +{
> +   struct luaL_serializer *serializer = luaL_checkserializer(L);
> +   int argcount = lua_gettop(L);
> +   if (argcount != 2 || !lua_istable(L, 1)) {
> +usage_error:
> +      return luaL_error(L, "Usage: encode_tagged({prefix = <string>, "\
> +                           "handle = <string>}, object)");
> +   }
> +   lua_getfield(L, 1, "prefix");
> +   if (! lua_isstring(L, -1))
> +      goto usage_error;
> +   const char *prefix = lua_tostring(L, -1);
> +   lua_getfield(L, 1, "handle");
> +   if (! lua_isstring(L, -1))
> +      goto usage_error;
> +   const char *handle = lua_tostring(L, -1);
> +   lua_pop(L, 2);
> +   lua_replace(L, 1);
> +   lua_settop(L, 1);

AFAIR you invalidate handle and prefix pointers as soon as you pop
and replace things on the stack. 

> +   return lua_yaml_encode_impl(L, serializer, handle, prefix);
> +}
> +
>  static int
>  l_new(lua_State *L);

-- 
Konstantin Osipov, Moscow, Russia, +7 903 626 22 32
http://tarantool.io - www.twitter.com/kostja_osipov

  reply	other threads:[~2018-05-10 18:22 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-20 13:24 [PATCH v2 00/10] session: introduce box.session.push Vladislav Shpilevoy
2018-04-20 13:24 ` [PATCH v2 01/10] yaml: don't throw OOM on any error in yaml encoding Vladislav Shpilevoy
2018-05-10 18:10   ` [tarantool-patches] " Konstantin Osipov
2018-04-20 13:24 ` [tarantool-patches] [PATCH v2 10/10] session: introduce binary box.session.push Vladislav Shpilevoy
2018-05-10 19:50   ` Konstantin Osipov
2018-05-24 20:50     ` [tarantool-patches] " Vladislav Shpilevoy
2018-04-20 13:24 ` [PATCH v2 02/10] yaml: introduce yaml.encode_tagged Vladislav Shpilevoy
2018-05-10 18:22   ` Konstantin Osipov [this message]
2018-05-24 20:50     ` [tarantool-patches] " Vladislav Shpilevoy
2018-05-30 19:15       ` Konstantin Osipov
2018-05-30 20:49         ` Vladislav Shpilevoy
2018-05-31 10:46           ` Konstantin Osipov
2018-04-20 13:24 ` [PATCH v2 03/10] yaml: introduce yaml.decode_tag Vladislav Shpilevoy
2018-05-10 18:41   ` [tarantool-patches] " Konstantin Osipov
2018-05-24 20:50     ` [tarantool-patches] " Vladislav Shpilevoy
2018-05-31 10:54       ` Konstantin Osipov
2018-05-31 11:36       ` Konstantin Osipov
2018-04-20 13:24 ` [PATCH v2 04/10] console: use Lua C API to do formatting for console Vladislav Shpilevoy
2018-05-10 18:46   ` [tarantool-patches] " Konstantin Osipov
2018-05-24 20:50     ` [tarantool-patches] " Vladislav Shpilevoy
2018-04-20 13:24 ` [PATCH v2 05/10] session: move salt into iproto connection Vladislav Shpilevoy
2018-05-10 18:47   ` [tarantool-patches] " Konstantin Osipov
2018-04-20 13:24 ` [PATCH v2 06/10] session: introduce session vtab and meta Vladislav Shpilevoy
2018-05-10 19:20   ` [tarantool-patches] " Konstantin Osipov
2018-05-24 20:50     ` [tarantool-patches] " Vladislav Shpilevoy
2018-04-20 13:24 ` [PATCH v2 07/10] port: rename dump() into dump_msgpack() Vladislav Shpilevoy
2018-05-10 19:21   ` [tarantool-patches] " Konstantin Osipov
2018-04-20 13:24 ` [PATCH v2 08/10] session: introduce text box.session.push Vladislav Shpilevoy
2018-05-10 19:27   ` [tarantool-patches] " Konstantin Osipov
2018-05-24 20:50     ` [tarantool-patches] " Vladislav Shpilevoy
2018-04-20 13:24 ` [PATCH v2 09/10] session: enable box.session.push in local console Vladislav Shpilevoy
2018-05-10 19:28   ` [tarantool-patches] " Konstantin Osipov
2018-05-24 20:50 ` [tarantool-patches] [PATCH 1/1] netbox: introduce iterable future objects Vladislav Shpilevoy
2018-06-04 22:17   ` [tarantool-patches] " 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=20180510182210.GB30593@atlas \
    --to=kostja@tarantool.org \
    --cc=tarantool-patches@freelists.org \
    --cc=vdavydov.dev@gmail.com \
    --subject='Re: [tarantool-patches] [PATCH v2 02/10] yaml: introduce yaml.encode_tagged' \
    /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