Commit e6eb6ead authored by antirez's avatar antirez
Browse files

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.
parent 1f8fdafe
...@@ -1992,14 +1992,23 @@ void ldbBreak(sds *argv, int argc) { ...@@ -1992,14 +1992,23 @@ void ldbBreak(sds *argv, int argc) {
void ldbEval(lua_State *lua, sds *argv, int argc) { void ldbEval(lua_State *lua, sds *argv, int argc) {
/* Glue the script together if it is composed of multiple arguments. */ /* Glue the script together if it is composed of multiple arguments. */
sds code = sdsjoinsds(argv+1,argc-1," ",1); sds code = sdsjoinsds(argv+1,argc-1," ",1);
sds expr = sdscatsds(sdsnew("return "),code);
/* Try to compile it as an expression, prepending "return ". */
if (luaL_loadbuffer(lua,expr,sdslen(expr),"@ldb_eval")) {
lua_pop(lua,1);
/* Failed? Try as a statement. */
if (luaL_loadbuffer(lua,code,sdslen(code),"@ldb_eval")) { if (luaL_loadbuffer(lua,code,sdslen(code),"@ldb_eval")) {
ldbLog(sdscatfmt(sdsempty(),"<error> %s",lua_tostring(lua,-1))); ldbLog(sdscatfmt(sdsempty(),"<error> %s",lua_tostring(lua,-1)));
lua_pop(lua,1); lua_pop(lua,1);
sdsfree(code); sdsfree(code);
return; return;
} }
}
/* Call it. */
sdsfree(code); sdsfree(code);
sdsfree(expr);
if (lua_pcall(lua,0,1,0)) { if (lua_pcall(lua,0,1,0)) {
ldbLog(sdscatfmt(sdsempty(),"<error> %s",lua_tostring(lua,-1))); ldbLog(sdscatfmt(sdsempty(),"<error> %s",lua_tostring(lua,-1)));
lua_pop(lua,1); lua_pop(lua,1);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment