static lua_Object getfuncinfo (lua_Object func) { lua_Object result = lua_createtable(); char *str; int line; lua_funcinfo(func, &str, &line); if (line == -1) /* C function? */ settabss(result, "kind", "C"); else if (line == 0) { /* "main"? */ settabss(result, "kind", "chunk"); settabss(result, "source", str); } else { /* Lua function */ settabss(result, "kind", "Lua"); settabsi(result, "def_line", line); settabss(result, "source", str); } if (line != 0) { /* is it not a "main"? */ char *kind = lua_getobjname(func, &str); if (*kind) { settabss(result, "name", str); settabss(result, "where", kind); } } return result; }
static void lua_printstack (FILE *f) { int level = 1; /* skip level 0 (it's this function) */ lua_Object func; while ((func = lua_stackedfunction(level++)) != LUA_NOOBJECT) { char *name; int currentline; char *filename; int linedefined; lua_funcinfo(func, &filename, &linedefined); fprintf(f, (level==2) ? "Active Stack:\n\t" : "\t"); switch (*lua_getobjname(func, &name)) { case 'g': fprintf(f, "function %s", name); break; case 't': fprintf(f, "`%s' tag method", name); break; default: { if (linedefined == 0) fprintf(f, "main of %s", filename); else if (linedefined < 0) fprintf(f, "%s", filename); else fprintf(f, "function (%s:%d)", filename, linedefined); filename = NULL; } } if ((currentline = lua_currentline(func)) > 0) fprintf(f, " at line %d", currentline); if (filename) fprintf(f, " [in file %s]", filename); fprintf(f, "\n"); } }
static void lua_printstack() { int32 level = 1; // skip level 0 (it's this function) lua_Object func; char buf[256]; while ((func = lua_stackedfunction(level++)) != LUA_NOOBJECT) { const char *name; int32 currentline; const char *filename; int32 linedefined; lua_funcinfo(func, &filename, &linedefined); sprintf(buf, (level == 2) ? "Active Stack:\n\t" : "\t"); g_stderr->write(buf, strlen(buf)); switch (*lua_getobjname(func, &name)) { case 'g': sprintf(buf, "function %s", name); break; case 't': sprintf(buf, "`%s' tag method", name); break; default: { if (linedefined == 0) sprintf(buf, "main of %s", filename); else if (linedefined < 0) sprintf(buf, "%s", filename); else sprintf(buf, "function (%s:%d)", filename, (int)linedefined); filename = NULL; } } g_stderr->write(buf, strlen(buf)); if ((currentline = lua_currentline(func)) > 0) { sprintf(buf, " at line %d", (int)currentline); g_stderr->write(buf, strlen(buf)); } if (filename) { sprintf(buf, " [in file %s]", filename); g_stderr->write(buf, strlen(buf)); } sprintf(buf, "\n"); g_stderr->write(buf, strlen(buf)); } }
void L1_FunctionName() { const char *name; char buf[256]; const char *filename = 0; int32 line; lua_Object param1 = lua_getparam(1); if (!lua_isfunction(param1)) { sprintf(buf, "function InvalidArgsToFunctionName"); lua_pushstring(buf); return; } lua_funcinfo(param1, &filename, &line); switch (*lua_getobjname(param1, &name)) { case 'g': sprintf(buf, "function %.100s", name); break; case 't': sprintf(buf, "`%.100s' tag method", name); break; default: { // cout<<(void*)filename<<endl; if (line == 0) sprintf(buf, "main of %.100s", filename); else if (line < 0) sprintf(buf, "%.100s", filename); else { sprintf(buf, "function (%.100s:%d)", filename, (int)line); filename = NULL; } } } int curr_line = lua_currentline(param1); if (curr_line > 0) sprintf(buf + strlen(buf), " at line %d", curr_line); if (filename) sprintf(buf + strlen(buf), " [in file %.100s]", filename); lua_pushstring(buf); }
void lua_printstack (FILE *f) { int level = 0; lua_Object func; fprintf(f, "Active Stack:\n"); while ((func = lua_stackedfunction(level++)) != LUA_NOOBJECT) { char *name; int currentline; fprintf(f, "\t"); switch (*getobjname(func, &name)) { case 'g': fprintf(f, "function %s", name); break; case 'f': fprintf(f, "fallback %s", name); break; default: { char *filename; int linedefined; lua_funcinfo(func, &filename, &linedefined); if (linedefined == 0) fprintf(f, "main of %s", filename); else if (linedefined < 0) fprintf(f, "%s", filename); else fprintf(f, "function (%s:%d)", filename, linedefined); } } if ((currentline = lua_currentline(func)) > 0) fprintf(f, " at line %d", currentline); fprintf(f, "\n"); } }