static void getlocal (void) { lua_Object func = lua_stackedfunction(luaL_check_int(1)); lua_Object val; char *name; if (func == LUA_NOOBJECT) /* level out of range? */ return; /* return nil */ else if (lua_getparam(2) != LUA_NOOBJECT) { /* 2nd argument? */ if ((val = lua_getlocal(func, findlocal(func, 2), &name)) != LUA_NOOBJECT) { lua_pushobject(val); lua_pushstring(name); } /* else return nil */ } else { /* collect all locals in a table */ lua_Object result = lua_createtable(); int i; for (i=1; ;i++) { if ((val = lua_getlocal(func, i, &name)) == LUA_NOOBJECT) break; lua_pushobject(result); lua_pushstring(name); lua_pushobject(val); lua_settable(); /* result[name] = value */ } lua_pushobject(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 setlocal (void) { lua_Object func = lua_stackedfunction(luaL_check_int(1)); int numvar; luaL_arg_check(func != LUA_NOOBJECT, 1, "level out of range"); numvar = findlocal(func, 2); lua_pushobject(luaL_nonnullarg(3)); if (!lua_setlocal(func, numvar)) lua_error("no such local variable"); }
void luaL_argerror(int32 numarg, const char *extramsg) { const char *funcname; lua_getobjname(lua_stackedfunction(0), &funcname); if (!funcname) funcname = "???"; if (!extramsg) luaL_verror("bad argument #%d to function `%.50s'", numarg, funcname); else luaL_verror("bad argument #%d to function `%.50s' (%.100s)", numarg, funcname, extramsg); }
void luaL_argerror (int numarg, char *extramsg) { lua_Function f = lua_stackedfunction(0); char *funcname; lua_getobjname(f, &funcname); numarg -= lua_nups(f); if (funcname == NULL) funcname = "?"; if (extramsg == NULL) luaL_verror("bad argument #%d to function `%.50s'", numarg, funcname); else luaL_verror("bad argument #%d to function `%.50s' (%.100s)", numarg, funcname, extramsg); }
void luaL_arg_check(int cond, int numarg, char *extramsg) { if (!cond) { char *funcname; lua_getobjname(lua_stackedfunction(0), &funcname); if (funcname == NULL) funcname = "???"; if (extramsg == NULL) luaL_verror("bad argument #%d to function `%s'", numarg, funcname); else luaL_verror("bad argument #%d to function `%s' (%s)", numarg, funcname, extramsg); } }
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); } }
void luaD_checkstack (int n) { struct Stack *S = &L->stack; if (S->last-S->top <= n) { StkId top = S->top-S->stack; int stacksize = (S->last-S->stack)+STACK_UNIT+n; luaM_reallocvector(S->stack, stacksize, TObject); S->last = S->stack+(stacksize-1); S->top = S->stack + top; if (stacksize >= STACK_LIMIT) { /* stack overflow? */ if (lua_stackedfunction(100) == LUA_NOOBJECT) /* 100 funcs on stack? */ lua_error("Lua2C - C2Lua overflow"); /* doesn't look like a rec. loop */ else lua_error("stack size overflow"); } } }
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 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"); } }