From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp45.i.mail.ru (smtp45.i.mail.ru [94.100.177.105]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id B70B4469719 for ; Mon, 12 Oct 2020 13:35:41 +0300 (MSK) Date: Mon, 12 Oct 2020 13:35:59 +0300 From: Alexander Turenko Message-ID: <20201012103559.4glsqdtqmftelyea@tkn_work_nb> References: <6b107979-103c-52b7-9102-9b55bc11d733@tarantool.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <6b107979-103c-52b7-9102-9b55bc11d733@tarantool.org> Subject: Re: [Tarantool-patches] [PATCH v2 06/15] WIP: module api/lua: add luaT_tuple_encode() List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Vladislav Shpilevoy Cc: tarantool-patches@dev.tarantool.org > > /** > > * Encode a Lua values on a Lua stack as an MsgPack array. > > * > > * Raise a Lua error when encoding fails. > > + * > > + * Helper for (). > > 1. Should be a part of the previous patch? Sure. Sorry for the mess. > > > */ > > static int > > luaT_tuple_encode_values(struct lua_State *L) > > @@ -122,6 +143,22 @@ luaT_tuple_encode_values(struct lua_State *L) > > return 0; > > } > > > > +typedef void luaT_mpstream_init_f(struct mpstream *stream, struct lua_State *L); > > + > > +static void > > +luaT_mpstream_init_lua_ibuf(struct mpstream *stream, struct lua_State *L) > > +{ > > + mpstream_init(stream, tarantool_lua_ibuf, ibuf_reserve_cb, > > + ibuf_alloc_cb, luamp_error, L); > > +} > > + > > +static void > > +luaT_mpstream_init_box_region(struct mpstream *stream, struct lua_State *L) > > +{ > > + mpstream_init(stream, &fiber()->gc, region_reserve_cb, region_alloc_cb, > > + luamp_error, L); > > 2. If you throw after some allocations are done, will the region leak? I don't > see a truncate in case luaT_tuple_encode_helper fails. Good point. Added truncate in luaT_tuple_encode(). > > +/** > > + * Encode a Lua table / tuple to given mpstream. > > + */ > > +static int > > +luaT_tuple_encode_helper(struct lua_State *L, int idx, > > + luaT_mpstream_init_f *luaT_mpstream_init_f) > > 3. Function name is usually a verb. Here I can propose > luaT_tuple_encode_on_mpstream. Nice proposal! I'll apply. > > @@ -163,18 +201,53 @@ luaT_tuple_encode_on_lua_ibuf(struct lua_State *L, int idx, > > lua_rawgeti(L, LUA_REGISTRYINDEX, luaT_tuple_encode_table_ref); > > assert(lua_isfunction(L, -1)); > > > > + lua_pushlightuserdata(L, luaT_mpstream_init_f); > > lua_pushvalue(L, idx); > > > > - int rc = luaT_call(L, 1, 0); > > + int rc = luaT_call(L, 2, 0); > > lua_settop(L, top); > > - if (rc != 0) > > + return rc == 0 ? 0 : -1; > > 4. Why not simply 'return rc;'? Some mess occurs. Thanks for the catch!