From 553c30c6d1599fe97fe943cc0b78b7b3c05cdbc2 Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Fri, 1 Sep 2017 11:28:22 +0800 Subject: [PATCH] sproto.default returns array type --- lualib-src/sproto/lsproto.c | 50 +++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/lualib-src/sproto/lsproto.c b/lualib-src/sproto/lsproto.c index 9cb61a4a..027dc5fa 100644 --- a/lualib-src/sproto/lsproto.c +++ b/lualib-src/sproto/lsproto.c @@ -621,31 +621,49 @@ lloadproto(lua_State *L) { return 1; } +static void +push_default(const struct sproto_arg *args, int array) { + lua_State *L = args->ud; + switch(args->type) { + case SPROTO_TINTEGER: + if (args->extra) + lua_pushnumber(L, 0.0); + else + lua_pushinteger(L, 0); + break; + case SPROTO_TBOOLEAN: + lua_pushboolean(L, 0); + break; + case SPROTO_TSTRING: + lua_pushliteral(L, ""); + break; + case SPROTO_TSTRUCT: + if (array) { + lua_pushstring(L, sproto_name(args->subtype)); + } else { + lua_createtable(L, 0, 1); + lua_pushstring(L, sproto_name(args->subtype)); + lua_setfield(L, -2, "__type"); + } + break; + default: + luaL_error(L, "Invalid type %d", args->type); + break; + } +} + static int encode_default(const struct sproto_arg *args) { lua_State *L = args->ud; lua_pushstring(L, args->tagname); if (args->index > 0) { lua_newtable(L); + push_default(args, 1); + lua_setfield(L, -2, "__array"); lua_rawset(L, -3); return SPROTO_CB_NOARRAY; } else { - switch(args->type) { - case SPROTO_TINTEGER: - lua_pushinteger(L, 0); - break; - case SPROTO_TBOOLEAN: - lua_pushboolean(L, 0); - break; - case SPROTO_TSTRING: - lua_pushliteral(L, ""); - break; - case SPROTO_TSTRUCT: - lua_createtable(L, 0, 1); - lua_pushstring(L, sproto_name(args->subtype)); - lua_setfield(L, -2, "__type"); - break; - } + push_default(args, 0); lua_rawset(L, -3); return SPROTO_CB_NIL; }