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"); } }
lua_Object lua_getlocal (lua_Function func, int local_number, char **name) { Object *f = luaI_Address(func); *name = luaI_getlocalname(f->value.tf, local_number, lua_currentline(func)); if (*name) { /* if "*name", there must be a LUA_T_LINE */ /* therefore, f+2 points to function base */ return Ref((f+2)+(local_number-1)); } else return LUA_NOOBJECT; }
static void getstack (void) { lua_Object func = lua_stackedfunction(luaL_check_int(1)); if (func == LUA_NOOBJECT) /* level out of range? */ return; else { lua_Object result = getfuncinfo(func); int currline = lua_currentline(func); if (currline > 0) settabsi(result, "current", currline); lua_pushobject(result); lua_pushstring("func"); lua_pushobject(func); lua_settable(); /* result.func = func */ lua_pushobject(result); } }
int lua_setlocal (lua_Function func, int local_number) { Object *f = Address(func); char *name = luaI_getlocalname(f->value.tf, local_number, lua_currentline(func)); adjustC(1); --top; if (name) { /* if "name", there must be a LUA_T_LINE */ /* therefore, f+2 points to function base */ *((f+2)+(local_number-1)) = *top; return 1; } else return 0; }
lua_Object lua_getlocal(lua_Function func, int32 local_number, char **name) { // check whether func is a Lua function if (lua_tag(func) != LUA_T_PROTO) return LUA_NOOBJECT; else { TObject *f = Address(func); TProtoFunc *fp = luaA_protovalue(f)->value.tf; *name = luaF_getlocalname(fp, local_number, lua_currentline(func)); if (*name) { // if "*name", there must be a LUA_T_LINE // therefore, f + 2 points to function base return Ref((f + 2) + (local_number - 1)); } else return LUA_NOOBJECT; } }
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)); } }
int32 lua_setlocal(lua_Function func, int32 local_number) { // check whether func is a Lua function if (lua_tag(func) != LUA_T_PROTO) return 0; else { TObject *f = Address(func); TProtoFunc *fp = luaA_protovalue(f)->value.tf; char *name = luaF_getlocalname(fp, local_number, lua_currentline(func)); checkCparams(1); --lua_state->stack.top; if (name) { // if "name", there must be a LUA_T_LINE // therefore, f+2 points to function base *((f + 2) + (local_number - 1)) = *lua_state->stack.top; return 1; } else return 0; } }
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"); } }