From bc9b2093dde95053ce1d500ce754d2792fc99116 Mon Sep 17 00:00:00 2001 From: antirez Date: Wed, 11 Nov 2015 22:29:56 +0100 Subject: [PATCH] Lua debugger: try to eval as expression first. It's handly to just eval "5+5" without the return and see it printed on the screen as result. However prepending "return" does not always result into valid Lua code. So what we do is to exploit a common Lua community trick of trying to compile with return prepended, and if compilation fails then it's not an expression that can be returned, so we try again without prepending "return". Works great apparently. --- src/scripting.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/scripting.c b/src/scripting.c index 85a86f6cde..078f147a3b 100644 --- a/src/scripting.c +++ b/src/scripting.c @@ -1992,14 +1992,23 @@ void ldbBreak(sds *argv, int argc) { void ldbEval(lua_State *lua, sds *argv, int argc) { /* Glue the script together if it is composed of multiple arguments. */ sds code = sdsjoinsds(argv+1,argc-1," ",1); + sds expr = sdscatsds(sdsnew("return "),code); - if (luaL_loadbuffer(lua,code,sdslen(code),"@ldb_eval")) { - ldbLog(sdscatfmt(sdsempty()," %s",lua_tostring(lua,-1))); + /* Try to compile it as an expression, prepending "return ". */ + if (luaL_loadbuffer(lua,expr,sdslen(expr),"@ldb_eval")) { lua_pop(lua,1); - sdsfree(code); - return; + /* Failed? Try as a statement. */ + if (luaL_loadbuffer(lua,code,sdslen(code),"@ldb_eval")) { + ldbLog(sdscatfmt(sdsempty()," %s",lua_tostring(lua,-1))); + lua_pop(lua,1); + sdsfree(code); + return; + } } + + /* Call it. */ sdsfree(code); + sdsfree(expr); if (lua_pcall(lua,0,1,0)) { ldbLog(sdscatfmt(sdsempty()," %s",lua_tostring(lua,-1))); lua_pop(lua,1);