aboutsummaryrefslogtreecommitdiff
path: root/ldebug.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2010-04-14 12:13:48 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2010-04-14 12:13:48 -0300
commit7dfa4cd655118faf164427356609fec31906dac2 (patch)
treed39fac9afba1dc0ab01dd5d174824120650c9eab /ldebug.c
parentfc6203ee4308173283f9ad9de6694d47f0908c4d (diff)
downloadlua-7dfa4cd655118faf164427356609fec31906dac2.tar.gz
lua-7dfa4cd655118faf164427356609fec31906dac2.tar.bz2
lua-7dfa4cd655118faf164427356609fec31906dac2.zip
first implementation of light C functions
Diffstat (limited to 'ldebug.c')
-rw-r--r--ldebug.c32
1 files changed, 17 insertions, 15 deletions
diff --git a/ldebug.c b/ldebug.c
index 03c86762..9b3e2d1c 100644
--- a/ldebug.c
+++ b/ldebug.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ldebug.c,v 2.68 2010/04/05 16:26:37 roberto Exp roberto $ 2** $Id: ldebug.c,v 2.69 2010/04/08 17:06:33 roberto Exp roberto $
3** Debug Interface 3** Debug Interface
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -144,7 +144,7 @@ LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n) {
144 144
145 145
146static void funcinfo (lua_Debug *ar, Closure *cl) { 146static void funcinfo (lua_Debug *ar, Closure *cl) {
147 if (cl->c.isC) { 147 if (cl == NULL || cl->c.isC) {
148 ar->source = "=[C]"; 148 ar->source = "=[C]";
149 ar->linedefined = -1; 149 ar->linedefined = -1;
150 ar->lastlinedefined = -1; 150 ar->lastlinedefined = -1;
@@ -191,8 +191,8 @@ static int auxgetinfo (lua_State *L, const char *what, lua_Debug *ar,
191 break; 191 break;
192 } 192 }
193 case 'u': { 193 case 'u': {
194 ar->nups = f->c.nupvalues; 194 ar->nups = (f == NULL) ? 0 : f->c.nupvalues;
195 if (f->c.isC) { 195 if (f == NULL || f->c.isC) {
196 ar->isvararg = 1; 196 ar->isvararg = 1;
197 ar->nparams = 0; 197 ar->nparams = 0;
198 } 198 }
@@ -226,28 +226,30 @@ static int auxgetinfo (lua_State *L, const char *what, lua_Debug *ar,
226 226
227LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) { 227LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) {
228 int status; 228 int status;
229 Closure *f = NULL; 229 Closure *cl;
230 CallInfo *ci = NULL; 230 CallInfo *ci;
231 StkId func;
231 lua_lock(L); 232 lua_lock(L);
232 if (*what == '>') { 233 if (*what == '>') {
233 StkId func = L->top - 1; 234 ci = NULL;
235 func = L->top - 1;
234 luai_apicheck(L, ttisfunction(func)); 236 luai_apicheck(L, ttisfunction(func));
235 what++; /* skip the '>' */ 237 what++; /* skip the '>' */
236 f = clvalue(func);
237 L->top--; /* pop function */ 238 L->top--; /* pop function */
238 } 239 }
239 else { 240 else {
240 ci = ar->i_ci; 241 ci = ar->i_ci;
242 func = ci->func;
241 lua_assert(ttisfunction(ci->func)); 243 lua_assert(ttisfunction(ci->func));
242 f = clvalue(ci->func);
243 } 244 }
244 status = auxgetinfo(L, what, ar, f, ci); 245 cl = ttisclosure(func) ? clvalue(func) : NULL;
246 status = auxgetinfo(L, what, ar, cl, ci);
245 if (strchr(what, 'f')) { 247 if (strchr(what, 'f')) {
246 setclvalue(L, L->top, f); 248 setobjs2s(L, L->top, func);
247 incr_top(L); 249 incr_top(L);
248 } 250 }
249 if (strchr(what, 'L')) 251 if (strchr(what, 'L'))
250 collectvalidlines(L, f); 252 collectvalidlines(L, cl);
251 lua_unlock(L); 253 lua_unlock(L);
252 return status; 254 return status;
253} 255}
@@ -439,7 +441,7 @@ static const char *getupvalname (CallInfo *ci, const TValue *o,
439void luaG_typeerror (lua_State *L, const TValue *o, const char *op) { 441void luaG_typeerror (lua_State *L, const TValue *o, const char *op) {
440 CallInfo *ci = L->ci; 442 CallInfo *ci = L->ci;
441 const char *name = NULL; 443 const char *name = NULL;
442 const char *t = typename(ttype(o)); 444 const char *t = objtypename(o);
443 const char *kind = NULL; 445 const char *kind = NULL;
444 if (isLua(ci)) { 446 if (isLua(ci)) {
445 kind = getupvalname(ci, o, &name); /* check whether 'o' is an upvalue */ 447 kind = getupvalname(ci, o, &name); /* check whether 'o' is an upvalue */
@@ -470,8 +472,8 @@ void luaG_aritherror (lua_State *L, const TValue *p1, const TValue *p2) {
470 472
471 473
472int luaG_ordererror (lua_State *L, const TValue *p1, const TValue *p2) { 474int luaG_ordererror (lua_State *L, const TValue *p1, const TValue *p2) {
473 const char *t1 = typename(ttype(p1)); 475 const char *t1 = objtypename(p1);
474 const char *t2 = typename(ttype(p2)); 476 const char *t2 = objtypename(p2);
475 if (t1 == t2) 477 if (t1 == t2)
476 luaG_runerror(L, "attempt to compare two %s values", t1); 478 luaG_runerror(L, "attempt to compare two %s values", t1);
477 else 479 else