<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><br class=""><div><br class=""><blockquote type="cite" class=""><div class="">20 марта 2018 г., в 20:51, Vladimir Davydov <<a href="mailto:vdavydov.dev@gmail.com" class="">vdavydov.dev@gmail.com</a>> написал(а):</div><br class="Apple-interchange-newline"><div class=""><span style="font-family: PTMono-Regular; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">On Mon, Mar 19, 2018 at 04:34:49PM +0300, Vladislav Shpilevoy wrote:</span><br style="font-family: PTMono-Regular; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" style="font-family: PTMono-Regular; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">Box.session.push() will be implemented in C lbox_session_push()<br class="">function, which will use port to encapsulate different session<br class="">types (binary, text) push() logic. And push() must be able to<br class="">either encode an argument into message pack, or format it as a<br class="">string using yaml. This formatting can not be done in Lua before<br class="">push() call, since it breaks push() virtualization.<br class=""><br class="">Needed for #2677<br class=""><br class="">Signed-off-by: Vladislav Shpilevoy <<a href="mailto:v.shpilevoy@tarantool.org" class="">v.shpilevoy@tarantool.org</a>><br class="">---<br class="">src/box/lua/console.c         | 42 ++++++++++++++++++++++++++++++++++++++++++<br class="">src/box/lua/console.lua       | 34 ++++++++--------------------------<br class="">third_party/lua-yaml/<a href="http://lyaml.cc" class="">lyaml.cc</a> |  9 +++------<br class="">third_party/lua-yaml/lyaml.h  |  3 +++<br class="">4 files changed, 56 insertions(+), 32 deletions(-)<br class=""><br class="">diff --git a/src/box/lua/console.c b/src/box/lua/console.c<br class=""></blockquote><br style="font-family: PTMono-Regular; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" style="font-family: PTMono-Regular; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">@@ -328,6 +329,32 @@ lbox_console_add_history(struct lua_State *L)<br class=""><span class="Apple-tab-span" style="white-space: pre;">    </span>return 0;<br class="">}<br class=""><br class="">+static int<br class="">+lbox_console_format(struct lua_State *L)<br class="">+{<br class="">+<span class="Apple-tab-span" style="white-space: pre;">   </span>int arg_count = lua_gettop(L);<br class="">+<span class="Apple-tab-span" style="white-space: pre;">      </span>if (arg_count == 0) {<br class="">+<span class="Apple-tab-span" style="white-space: pre;">       </span><span class="Apple-tab-span" style="white-space: pre;">  </span>lua_pushstring(L, "---\n...\n");<br class="">+<span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>return 1;<br class="">+<span class="Apple-tab-span" style="white-space: pre;">   </span>}<br class="">+<span class="Apple-tab-span" style="white-space: pre;">   </span>lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED");<br class="">+<span class="Apple-tab-span" style="white-space: pre;">    </span>lua_getfield(L, -1, "console");<br class="">+<span class="Apple-tab-span" style="white-space: pre;">   </span>lua_getfield(L, -1, "formatter");<br class="">+<span class="Apple-tab-span" style="white-space: pre;"> </span>lua_getfield(L, -1, "encode");<br class="">+<span class="Apple-tab-span" style="white-space: pre;">    </span>lua_createtable(L, arg_count, 0);<br class="">+<span class="Apple-tab-span" style="white-space: pre;">   </span>for (int i = 0; i < arg_count; ++i) {<br class="">+<span class="Apple-tab-span" style="white-space: pre;">    </span><span class="Apple-tab-span" style="white-space: pre;">  </span>if (lua_isnil(L, i + 1))<br class="">+<span class="Apple-tab-span" style="white-space: pre;">    </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>lua_getfield(L, -3, "NULL");<br class="">+<span class="Apple-tab-span" style="white-space: pre;">      </span><span class="Apple-tab-span" style="white-space: pre;">  </span>else<br class="">+<span class="Apple-tab-span" style="white-space: pre;">        </span><span class="Apple-tab-span" style="white-space: pre;">  </span><span class="Apple-tab-span" style="white-space: pre;">  </span>lua_pushvalue(L, i + 1);<br class="">+<span class="Apple-tab-span" style="white-space: pre;">    </span><span class="Apple-tab-span" style="white-space: pre;">  </span>lua_rawseti(L, -2, i + 1);<br class="">+<span class="Apple-tab-span" style="white-space: pre;">  </span>}<br class="">+<span class="Apple-tab-span" style="white-space: pre;">   </span>lua_call(L, 1, 1);<br class="">+<span class="Apple-tab-span" style="white-space: pre;">  </span>lua_insert(L, -4);<br class="">+<span class="Apple-tab-span" style="white-space: pre;">  </span>lua_pop(L, 3);<br class="">+<span class="Apple-tab-span" style="white-space: pre;">      </span>return 1;<br class="">+}<br class="">+<br class="">void<br class="">tarantool_lua_console_init(struct lua_State *L)<br class="">{<br class=""></blockquote><br style="font-family: PTMono-Regular; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" style="font-family: PTMono-Regular; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">@@ -344,6 +372,20 @@ tarantool_lua_console_init(struct lua_State *L)<br class=""><span class="Apple-tab-span" style="white-space: pre;">     </span>lua_getfield(L, -1, "completion_handler");<br class=""><span class="Apple-tab-span" style="white-space: pre;"> </span>lua_pushcclosure(L, lbox_console_readline, 1);<br class=""><span class="Apple-tab-span" style="white-space: pre;">       </span>lua_setfield(L, -2, "readline");<br class="">+<br class="">+<span class="Apple-tab-span" style="white-space: pre;">    </span>lua_yaml_new_formatter(L);<br class="">+<span class="Apple-tab-span" style="white-space: pre;">  </span>lua_getfield(L, -1, "cfg");<br class="">+<span class="Apple-tab-span" style="white-space: pre;">       </span>lua_createtable(L, 0, 4);<br class="">+<span class="Apple-tab-span" style="white-space: pre;">   </span>lua_pushboolean(L, true);<br class="">+<span class="Apple-tab-span" style="white-space: pre;">   </span>lua_setfield(L, -2, "encode_invalid_numbers");<br class="">+<span class="Apple-tab-span" style="white-space: pre;">    </span>lua_pushboolean(L, true);<br class="">+<span class="Apple-tab-span" style="white-space: pre;">   </span>lua_setfield(L, -2, "encode_load_metatables");<br class="">+<span class="Apple-tab-span" style="white-space: pre;">    </span>lua_pushboolean(L, true);<br class="">+<span class="Apple-tab-span" style="white-space: pre;">   </span>lua_setfield(L, -2, "encode_use_tostring");<br class="">+<span class="Apple-tab-span" style="white-space: pre;">       </span>lua_pushboolean(L, true);<br class="">+<span class="Apple-tab-span" style="white-space: pre;">   </span>lua_setfield(L, -2, "encode_invalid_as_nil");<br class="">+<span class="Apple-tab-span" style="white-space: pre;">     </span>lua_call(L, 1, 0);<br class="">+<span class="Apple-tab-span" style="white-space: pre;">  </span>lua_setfield(L, -2, "formatter");<br class=""></blockquote><br style="font-family: PTMono-Regular; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" style="font-family: PTMono-Regular; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">diff --git a/src/box/lua/console.lua b/src/box/lua/console.lua<br class="">@@ -395,4 +375,6 @@ package.loaded['console'] = {<br class="">    on_start = on_start;<br class="">    on_client_disconnect = on_client_disconnect;<br class="">    completion_handler = internal.completion_handler;<br class="">+    formatter = internal.formatter;<br class=""></blockquote><br style="font-family: PTMono-Regular; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: PTMono-Regular; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">I don't like that we export the serializer to Lua, but never use it in</span><br style="font-family: PTMono-Regular; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: PTMono-Regular; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">Lua code, only in C. Can't we create a serializer in C and pass it to</span><br style="font-family: PTMono-Regular; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: PTMono-Regular; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">the encoder function explicitly?</span></div></blockquote><br class=""></div><div>The problem of Lua formatter is that it is Lua table, not cdata. And to fully port it on C it is necessary to rewrite luaL_serializer and l_dump in <a href="http://lyaml.cc" class="">lyaml.cc</a>, that seems to be too complicated for a single propose - format push message. But if you insist, I can do full port.</div><div><br class=""></div><br class=""></body></html>