aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2009-02-27 15:17:13 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2009-02-27 15:17:13 -0300
commit9bf05e7364295cc6322f2ebb413994a2f42c4a80 (patch)
treed90fe89914e5b3a20af948a27fa91b43befd8be8
parente39e758a73c08953d477c8e024ffbd1e2edfe6a5 (diff)
downloadlua-9bf05e7364295cc6322f2ebb413994a2f42c4a80.tar.gz
lua-9bf05e7364295cc6322f2ebb413994a2f42c4a80.tar.bz2
lua-9bf05e7364295cc6322f2ebb413994a2f42c4a80.zip
code section 'Traceback' moved to the beginning of the file
-rw-r--r--lauxlib.c113
1 files changed, 61 insertions, 52 deletions
diff --git a/lauxlib.c b/lauxlib.c
index 469553ae..532ce052 100644
--- a/lauxlib.c
+++ b/lauxlib.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lauxlib.c,v 1.181 2009/02/17 14:31:16 roberto Exp roberto $ 2** $Id: lauxlib.c,v 1.182 2009/02/18 17:20:56 roberto Exp roberto $
3** Auxiliary functions for building Lua libraries 3** Auxiliary functions for building Lua libraries
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -31,6 +31,66 @@
31 31
32/* 32/*
33** {====================================================== 33** {======================================================
34** Traceback
35** =======================================================
36*/
37
38
39#define LEVELS1 12 /* size of the first part of the stack */
40#define LEVELS2 10 /* size of the second part of the stack */
41
42
43static void pushfuncname (lua_State *L, lua_Debug *ar) {
44 if (*ar->namewhat != '\0') /* is there a name? */
45 lua_pushfstring(L, "function " LUA_QS, ar->name);
46 else if (*ar->what == 'm') /* main? */
47 lua_pushfstring(L, "main chunk");
48 else if (*ar->what == 'C' || *ar->what == 't')
49 lua_pushliteral(L, "?"); /* C function or tail call */
50 else
51 lua_pushfstring(L, "function <%s:%d>", ar->short_src, ar->linedefined);
52}
53
54
55static int countlevels (lua_State *L) {
56 lua_Debug ar;
57 int level = 1;
58 while (lua_getstack(L, level, &ar)) level++;
59 return level;
60}
61
62
63LUALIB_API void luaL_traceback (lua_State *L, lua_State *L1,
64 const char *msg, int level) {
65 lua_Debug ar;
66 int top = lua_gettop(L);
67 int numlevels = countlevels(L1);
68 int mark = (numlevels > LEVELS1 + LEVELS2) ? LEVELS1 : 0;
69 if (msg) lua_pushfstring(L, "%s\n", msg);
70 lua_pushliteral(L, "stack traceback:");
71 while (lua_getstack(L1, level++, &ar)) {
72 if (level == mark) { /* too many levels? */
73 lua_pushliteral(L, "\n\t..."); /* add a '...' */
74 level = numlevels - LEVELS2; /* and skip to last ones */
75 }
76 else {
77 lua_getinfo(L1, "Sln", &ar);
78 lua_pushfstring(L, "\n\t%s:", ar.short_src);
79 if (ar.currentline > 0)
80 lua_pushfstring(L, "%d:", ar.currentline);
81 lua_pushliteral(L, " in ");
82 pushfuncname(L, &ar);
83 lua_concat(L, lua_gettop(L) - top);
84 }
85 }
86 lua_concat(L, lua_gettop(L) - top);
87}
88
89/* }====================================================== */
90
91
92/*
93** {======================================================
34** Error-report functions 94** Error-report functions
35** ======================================================= 95** =======================================================
36*/ 96*/
@@ -87,57 +147,6 @@ LUALIB_API int luaL_error (lua_State *L, const char *fmt, ...) {
87 return lua_error(L); 147 return lua_error(L);
88} 148}
89 149
90
91#define LEVELS1 12 /* size of the first part of the stack */
92#define LEVELS2 10 /* size of the second part of the stack */
93
94
95static void pushfuncname (lua_State *L, lua_Debug *ar) {
96 if (*ar->namewhat != '\0') /* is there a name? */
97 lua_pushfstring(L, "function " LUA_QS, ar->name);
98 else if (*ar->what == 'm') /* main? */
99 lua_pushfstring(L, "main chunk");
100 else if (*ar->what == 'C' || *ar->what == 't')
101 lua_pushliteral(L, "?"); /* C function or tail call */
102 else
103 lua_pushfstring(L, "function <%s:%d>", ar->short_src, ar->linedefined);
104}
105
106
107static int countlevels (lua_State *L) {
108 lua_Debug ar;
109 int level = 1;
110 while (lua_getstack(L, level, &ar)) level++;
111 return level;
112}
113
114
115LUALIB_API void luaL_traceback (lua_State *L, lua_State *L1,
116 const char *msg, int level) {
117 lua_Debug ar;
118 int top = lua_gettop(L);
119 int numlevels = countlevels(L1);
120 int mark = (numlevels > LEVELS1 + LEVELS2) ? LEVELS1 : 0;
121 if (msg) lua_pushfstring(L, "%s\n", msg);
122 lua_pushliteral(L, "stack traceback:");
123 while (lua_getstack(L1, level++, &ar)) {
124 if (level == mark) { /* too many levels? */
125 lua_pushliteral(L, "\n\t..."); /* add a '...' */
126 level = numlevels - LEVELS2; /* and skip to last ones */
127 }
128 else {
129 lua_getinfo(L1, "Sln", &ar);
130 lua_pushfstring(L, "\n\t%s:", ar.short_src);
131 if (ar.currentline > 0)
132 lua_pushfstring(L, "%d:", ar.currentline);
133 lua_pushliteral(L, " in ");
134 pushfuncname(L, &ar);
135 lua_concat(L, lua_gettop(L) - top);
136 }
137 }
138 lua_concat(L, lua_gettop(L) - top);
139}
140
141/* }====================================================== */ 150/* }====================================================== */
142 151
143 152