aboutsummaryrefslogtreecommitdiff
path: root/lua.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2005-01-10 15:21:10 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2005-01-10 15:21:10 -0200
commit0480ea088629122334df0e8d5557cb27c9232aa9 (patch)
treec4706db4923b45ca783b5e422aeb708fa11c432d /lua.c
parent162b66624d6868e71010ef3988b482fc811def34 (diff)
downloadlua-0480ea088629122334df0e8d5557cb27c9232aa9.tar.gz
lua-0480ea088629122334df0e8d5557cb27c9232aa9.tar.bz2
lua-0480ea088629122334df0e8d5557cb27c9232aa9.zip
gets `debug.traceback' current when error occurs
Diffstat (limited to 'lua.c')
-rw-r--r--lua.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/lua.c b/lua.c
index e316e9c4..2f88abfc 100644
--- a/lua.c
+++ b/lua.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lua.c,v 1.133 2004/11/18 19:53:49 roberto Exp roberto $ 2** $Id: lua.c,v 1.134 2005/01/10 16:30:59 roberto Exp roberto $
3** Lua stand-alone interpreter 3** Lua stand-alone interpreter
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -79,10 +79,23 @@ static int report (lua_State *L, int status) {
79} 79}
80 80
81 81
82static int traceback (lua_State *L) {
83 luaL_getfield(L, LUA_GLOBALSINDEX, "debug.traceback");
84 if (!lua_isfunction(L, -1))
85 lua_pop(L, 1);
86 else {
87 lua_pushvalue(L, 1); /* pass error message */
88 lua_pushinteger(L, 2); /* skip this function and traceback */
89 lua_call(L, 2, 1); /* call debug.traceback */
90 }
91 return 1;
92}
93
94
82static int docall (lua_State *L, int narg, int clear) { 95static int docall (lua_State *L, int narg, int clear) {
83 int status; 96 int status;
84 int base = lua_gettop(L) - narg; /* function index */ 97 int base = lua_gettop(L) - narg; /* function index */
85 luaL_getfield(L, LUA_GLOBALSINDEX, "debug.traceback"); 98 lua_pushcfunction(L, traceback); /* push traceback function */
86 lua_insert(L, base); /* put it under chunk and args */ 99 lua_insert(L, base); /* put it under chunk and args */
87 signal(SIGINT, laction); 100 signal(SIGINT, laction);
88 status = lua_pcall(L, narg, (clear ? 0 : LUA_MULTRET), base); 101 status = lua_pcall(L, narg, (clear ? 0 : LUA_MULTRET), base);