|
@@ -1,5 +1,5 @@
|
|
|
/*
|
|
|
-** $Id: lauxlib.c,v 1.181 2009/02/17 14:31:16 roberto Exp roberto $
|
|
|
+** $Id: lauxlib.c,v 1.182 2009/02/18 17:20:56 roberto Exp roberto $
|
|
|
** Auxiliary functions for building Lua libraries
|
|
|
** See Copyright Notice in lua.h
|
|
|
*/
|
|
@@ -29,6 +29,66 @@
|
|
|
lua_gettop(L) + (i) + 1)
|
|
|
|
|
|
|
|
|
+/*
|
|
|
+** {======================================================
|
|
|
+** Traceback
|
|
|
+** =======================================================
|
|
|
+*/
|
|
|
+
|
|
|
+
|
|
|
+#define LEVELS1 12 /* size of the first part of the stack */
|
|
|
+#define LEVELS2 10 /* size of the second part of the stack */
|
|
|
+
|
|
|
+
|
|
|
+static void pushfuncname (lua_State *L, lua_Debug *ar) {
|
|
|
+ if (*ar->namewhat != '\0') /* is there a name? */
|
|
|
+ lua_pushfstring(L, "function " LUA_QS, ar->name);
|
|
|
+ else if (*ar->what == 'm') /* main? */
|
|
|
+ lua_pushfstring(L, "main chunk");
|
|
|
+ else if (*ar->what == 'C' || *ar->what == 't')
|
|
|
+ lua_pushliteral(L, "?"); /* C function or tail call */
|
|
|
+ else
|
|
|
+ lua_pushfstring(L, "function <%s:%d>", ar->short_src, ar->linedefined);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+static int countlevels (lua_State *L) {
|
|
|
+ lua_Debug ar;
|
|
|
+ int level = 1;
|
|
|
+ while (lua_getstack(L, level, &ar)) level++;
|
|
|
+ return level;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+LUALIB_API void luaL_traceback (lua_State *L, lua_State *L1,
|
|
|
+ const char *msg, int level) {
|
|
|
+ lua_Debug ar;
|
|
|
+ int top = lua_gettop(L);
|
|
|
+ int numlevels = countlevels(L1);
|
|
|
+ int mark = (numlevels > LEVELS1 + LEVELS2) ? LEVELS1 : 0;
|
|
|
+ if (msg) lua_pushfstring(L, "%s\n", msg);
|
|
|
+ lua_pushliteral(L, "stack traceback:");
|
|
|
+ while (lua_getstack(L1, level++, &ar)) {
|
|
|
+ if (level == mark) { /* too many levels? */
|
|
|
+ lua_pushliteral(L, "\n\t..."); /* add a '...' */
|
|
|
+ level = numlevels - LEVELS2; /* and skip to last ones */
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ lua_getinfo(L1, "Sln", &ar);
|
|
|
+ lua_pushfstring(L, "\n\t%s:", ar.short_src);
|
|
|
+ if (ar.currentline > 0)
|
|
|
+ lua_pushfstring(L, "%d:", ar.currentline);
|
|
|
+ lua_pushliteral(L, " in ");
|
|
|
+ pushfuncname(L, &ar);
|
|
|
+ lua_concat(L, lua_gettop(L) - top);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ lua_concat(L, lua_gettop(L) - top);
|
|
|
+}
|
|
|
+
|
|
|
+/* }====================================================== */
|
|
|
+
|
|
|
+
|
|
|
/*
|
|
|
** {======================================================
|
|
|
** Error-report functions
|
|
@@ -87,57 +147,6 @@ LUALIB_API int luaL_error (lua_State *L, const char *fmt, ...) {
|
|
|
return lua_error(L);
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-#define LEVELS1 12 /* size of the first part of the stack */
|
|
|
-#define LEVELS2 10 /* size of the second part of the stack */
|
|
|
-
|
|
|
-
|
|
|
-static void pushfuncname (lua_State *L, lua_Debug *ar) {
|
|
|
- if (*ar->namewhat != '\0') /* is there a name? */
|
|
|
- lua_pushfstring(L, "function " LUA_QS, ar->name);
|
|
|
- else if (*ar->what == 'm') /* main? */
|
|
|
- lua_pushfstring(L, "main chunk");
|
|
|
- else if (*ar->what == 'C' || *ar->what == 't')
|
|
|
- lua_pushliteral(L, "?"); /* C function or tail call */
|
|
|
- else
|
|
|
- lua_pushfstring(L, "function <%s:%d>", ar->short_src, ar->linedefined);
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-static int countlevels (lua_State *L) {
|
|
|
- lua_Debug ar;
|
|
|
- int level = 1;
|
|
|
- while (lua_getstack(L, level, &ar)) level++;
|
|
|
- return level;
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-LUALIB_API void luaL_traceback (lua_State *L, lua_State *L1,
|
|
|
- const char *msg, int level) {
|
|
|
- lua_Debug ar;
|
|
|
- int top = lua_gettop(L);
|
|
|
- int numlevels = countlevels(L1);
|
|
|
- int mark = (numlevels > LEVELS1 + LEVELS2) ? LEVELS1 : 0;
|
|
|
- if (msg) lua_pushfstring(L, "%s\n", msg);
|
|
|
- lua_pushliteral(L, "stack traceback:");
|
|
|
- while (lua_getstack(L1, level++, &ar)) {
|
|
|
- if (level == mark) { /* too many levels? */
|
|
|
- lua_pushliteral(L, "\n\t..."); /* add a '...' */
|
|
|
- level = numlevels - LEVELS2; /* and skip to last ones */
|
|
|
- }
|
|
|
- else {
|
|
|
- lua_getinfo(L1, "Sln", &ar);
|
|
|
- lua_pushfstring(L, "\n\t%s:", ar.short_src);
|
|
|
- if (ar.currentline > 0)
|
|
|
- lua_pushfstring(L, "%d:", ar.currentline);
|
|
|
- lua_pushliteral(L, " in ");
|
|
|
- pushfuncname(L, &ar);
|
|
|
- lua_concat(L, lua_gettop(L) - top);
|
|
|
- }
|
|
|
- }
|
|
|
- lua_concat(L, lua_gettop(L) - top);
|
|
|
-}
|
|
|
-
|
|
|
/* }====================================================== */
|
|
|
|
|
|
|