| To: vim_dev@googlegroups.com |
| Subject: Patch 7.3.317 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.3.317 |
| Problem: Calling debug.debug() in Lua may cause Vim to hang. |
| Solution: Add a better debug method. (Rob Hoelz, Luis Carvalho) |
| Files: src/if_lua.c |
| |
| |
| |
| |
| |
| *** 100,105 **** |
| --- 100,106 ---- |
| #define lua_setfield dll_lua_setfield |
| #define lua_rawset dll_lua_rawset |
| #define lua_rawseti dll_lua_rawseti |
| + #define lua_remove dll_lua_remove |
| #define lua_setmetatable dll_lua_setmetatable |
| #define lua_call dll_lua_call |
| #define lua_pcall dll_lua_pcall |
| |
| *** 161,166 **** |
| --- 162,168 ---- |
| void (*dll_lua_setfield) (lua_State *L, int idx, const char *k); |
| void (*dll_lua_rawset) (lua_State *L, int idx); |
| void (*dll_lua_rawseti) (lua_State *L, int idx, int n); |
| + void (*dll_lua_remove) (lua_State *L, int idx); |
| int (*dll_lua_setmetatable) (lua_State *L, int objindex); |
| void (*dll_lua_call) (lua_State *L, int nargs, int nresults); |
| int (*dll_lua_pcall) (lua_State *L, int nargs, int nresults, int errfunc); |
| |
| *** 229,234 **** |
| --- 231,237 ---- |
| {"lua_setfield", (luaV_function) &dll_lua_setfield}, |
| {"lua_rawset", (luaV_function) &dll_lua_rawset}, |
| {"lua_rawseti", (luaV_function) &dll_lua_rawseti}, |
| + {"lua_remove", (luaV_function) &dll_lua_remove}, |
| {"lua_setmetatable", (luaV_function) &dll_lua_setmetatable}, |
| {"lua_call", (luaV_function) &dll_lua_call}, |
| {"lua_pcall", (luaV_function) &dll_lua_pcall}, |
| |
| *** 924,929 **** |
| --- 927,957 ---- |
| } |
| |
| static int |
| + luaV_debug(lua_State *L) |
| + { |
| + lua_settop(L, 0); |
| + lua_getglobal(L, "vim"); |
| + lua_getfield(L, -1, "eval"); |
| + lua_remove(L, -2); /* vim.eval at position 1 */ |
| + for (;;) |
| + { |
| + const char *input; |
| + size_t l; |
| + lua_pushvalue(L, 1); /* vim.eval */ |
| + lua_pushliteral(L, "input('lua_debug> ')"); |
| + lua_call(L, 1, 1); /* return string */ |
| + input = lua_tolstring(L, -1, &l); |
| + if (l == 0 || strcmp(input, "cont") == 0) |
| + return 0; |
| + msg_putchar('\n'); /* avoid outputting on input line */ |
| + if (luaL_loadbuffer(L, input, l, "=(debug command)") |
| + || lua_pcall(L, 0, 0, 0)) |
| + luaV_emsg(L); |
| + lua_settop(L, 1); /* remove eventual returns, but keep vim.eval */ |
| + } |
| + } |
| + |
| + static int |
| luaV_command(lua_State *L) |
| { |
| do_cmdline_cmd((char_u *) luaL_checkstring(L, 1)); |
| |
| *** 1082,1087 **** |
| --- 1110,1120 ---- |
| /* print */ |
| lua_pushcfunction(L, luaV_print); |
| lua_setglobal(L, "print"); |
| + /* debug.debug */ |
| + lua_getglobal(L, "debug"); |
| + lua_pushcfunction(L, luaV_debug); |
| + lua_setfield(L, -2, "debug"); |
| + lua_pop(L, 1); |
| /* free */ |
| lua_pushlightuserdata(L, (void *) LUAVIM_FREE); |
| lua_pushcfunction(L, luaV_free); |
| |
| |
| |
| *** 711,712 **** |
| --- 711,714 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 317, |
| /**/ |
| |
| -- |
| Q: What is the difference betwee open-source and commercial software? |
| A: If you have a problem with commercial software you can call a phone |
| number and they will tell you it might be solved in a future version. |
| For open-source software there isn't a phone number to call, but you |
| get the solution within a day. |
| |
| /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ |
| /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ |
| \\\ an exciting new programming language -- http://www.Zimbu.org /// |
| \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |