diff options
Diffstat (limited to 'src/script/common/c_internal.cpp')
-rw-r--r-- | src/script/common/c_internal.cpp | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/src/script/common/c_internal.cpp b/src/script/common/c_internal.cpp index ddd2d184c..79063141d 100644 --- a/src/script/common/c_internal.cpp +++ b/src/script/common/c_internal.cpp @@ -27,10 +27,11 @@ with this program; if not, write to the Free Software Foundation, Inc., std::string script_get_backtrace(lua_State *L) { - lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_BACKTRACE); + lua_getglobal(L, "debug"); + lua_getfield(L, -1, "traceback"); lua_call(L, 0, 1); std::string result = luaL_checkstring(L, -1); - lua_pop(L, 1); + lua_pop(L, 2); return result; } @@ -46,6 +47,25 @@ int script_exception_wrapper(lua_State *L, lua_CFunction f) return lua_error(L); // Rethrow as a Lua error. } +int script_error_handler(lua_State *L) +{ + lua_getglobal(L, "core"); + lua_getfield(L, -1, "error_handler"); + if (!lua_isnil(L, -1)) { + lua_pushvalue(L, 1); + } else { + // No Lua error handler available. Call debug.traceback(tostring(#1), level). + lua_getglobal(L, "debug"); + lua_getfield(L, -1, "traceback"); + lua_getglobal(L, "tostring"); + lua_pushvalue(L, 1); + lua_call(L, 1, 1); + } + lua_pushinteger(L, 2); // Stack level + lua_call(L, 2, 1); + return 1; +} + /* * Note that we can't get tracebacks for LUA_ERRMEM or LUA_ERRERR (without * hacking Lua internals). For LUA_ERRMEM, this is because memory errors will |