static int auxgetinfo (LuaThread *L, const char *what, LuaDebug *ar, LuaClosure *f, LuaStackFrame *ci) { THREAD_CHECK(L); int status = 1; for (; *what; what++) { switch (*what) { case 'S': { funcinfo(ar, f); break; } case 'l': { //ar->currentline = (ci && ci->isLua()) ? currentline(ci) : -1; ar->currentline = ci ? ci->getCurrentLine() : -1; break; } case 'u': { ar->nups = (f == NULL) ? 0 : f->nupvalues; if (f == NULL || f->isC) { ar->isvararg = true; ar->nparams = 0; } else { ar->isvararg = f->proto_->is_vararg; ar->nparams = f->proto_->numparams; } break; } case 't': { ar->istailcall = (ci) ? (ci->callstatus & CIST_TAIL ? true : false) : false; break; } case 'n': { /* calling function is a known Lua function? */ if (ci && !(ci->callstatus & CIST_TAIL) && ci->previous->isLua()) { const char* temp = getfuncname2(L, ci->previous, ar->name2); if(temp) { ar->namewhat2 = temp; } else { ar->namewhat2.clear(); } } else { ar->namewhat2.clear(); } if (ar->namewhat2.empty()) { ar->name2.clear(); } break; } case 'L': case 'f': /* handled by lua_getinfo */ break; default: status = 0; /* invalid option */ } } return status; }
static int auxgetinfo (lua_State *L, const char *what, lua_Debug *ar, Closure *f, CallInfo *ci) { int status = 1; for (; *what; what++) { switch (*what) { case 'S': { funcinfo(ar, f); break; } case 'l': { ar->currentline = (ci && isLua(ci)) ? currentline(ci) : -1; break; } case 'u': { ar->nups = (f == NULL) ? 0 : f->c.nupvalues; if (noLuaClosure(f)) { ar->isvararg = 1; ar->nparams = 0; } else { ar->isvararg = f->l.p->is_vararg; ar->nparams = f->l.p->numparams; } break; } case 't': { ar->istailcall = (ci) ? ci->callstatus & CIST_TAIL : 0; break; } case 'n': { /* calling function is a known Lua function? */ if (ci && !(ci->callstatus & CIST_TAIL) && isLua(ci->previous)) ar->namewhat = getfuncname(L, ci->previous, &ar->name); else ar->namewhat = NULL; if (ar->namewhat == NULL) { ar->namewhat = ""; /* not found */ ar->name = NULL; } break; } case 'L': case 'f': /* handled by lua_getinfo */ break; default: status = 0; /* invalid option */ } } return status; }
static int auxgetinfo(lua_State* L, const char* what, lua_Debug* ar, Closure* f, CallInfo* ci) { int status = 1; if (f == NULL) { info_tailcall(ar); return status; } for (; *what; what++) { switch (*what) { case 'S': { funcinfo(ar, f); break; } case 'l': { ar->currentline = (ci) ? currentline(L, ci) : -1; break; } case 'u': { ar->nups = f->c.nupvalues; break; } case 'n': { ar->namewhat = (ci) ? getfuncname(L, ci, &ar->name) : NULL; if (ar->namewhat == NULL) { ar->namewhat = ""; /* not found */ ar->name = NULL; } break; } case 'L': case 'f': /* handled by lua_getinfo */ break; default: status = 0; /* invalid option */ } } return status; }
static int auxgetinfo(lua_State * L, const char *what, lua_Debug * ar, StkId f, CallInfo * ci) { int status = 1; for (; *what; what++) { switch (*what) { case 'S': { funcinfo(ar, f); break; } case 'l': { ar->currentline = (ci) ? currentline(ci) : -1; break; } case 'u': { ar->nups = clvalue(f)->c.nupvalues; break; } case 'n': { ar->namewhat = (ci) ? getfuncname(ci, &ar->name) : NULL; if (ar->namewhat == NULL) { /* try to find a global name */ if ((ar->name = travglobals(L, f)) != NULL) ar->namewhat = "global"; else ar->namewhat = ""; /* not found */ } break; } case 'f': { setobj2s(L->top, f); break; } default: status = 0; /* invalid option */ } } return status; }
LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) { StkId func; int isactive = (*what != '>'); if (isactive) func = ar->_func; else { what++; /* skip the '>' */ func = L->top - 1; } for (; *what; what++) { switch (*what) { case 'S': { funcinfo(L, ar, func); break; } case 'l': { ar->currentline = currentline(func); break; } case 'u': { ar->nups = nups(func); break; } case 'n': { ar->namewhat = (isactive) ? getfuncname(L, func, &ar->name) : NULL; if (ar->namewhat == NULL) getname(L, func, ar); break; } case 'f': { setnormalized(L->top, func); incr_top; /* push function */ break; } default: return 0; /* invalid option */ } } if (!isactive) L->top--; /* pop function */ return 1; }