| 97 | |
| 98 | |
| 99 | static int db_getinfo (lua_State *L) { |
| 100 | lua_Debug ar; |
| 101 | int arg; |
| 102 | lua_State *L1 = getthread(L, &arg); |
| 103 | const char *options = luaL_optstring(L, arg+2, "flnSu"); |
| 104 | if (lua_isnumber(L, arg+1)) { |
| 105 | if (!lua_getstack(L1, (int)lua_tointeger(L, arg+1), &ar)) { |
| 106 | lua_pushnil(L); /* level out of range */ |
| 107 | return 1; |
| 108 | } |
| 109 | } |
| 110 | else if (lua_isfunction(L, arg+1)) { |
| 111 | lua_pushfstring(L, ">%s", options); |
| 112 | options = lua_tostring(L, -1); |
| 113 | lua_pushvalue(L, arg+1); |
| 114 | lua_xmove(L, L1, 1); |
| 115 | } |
| 116 | else |
| 117 | return luaL_argerror(L, arg+1, "function or level expected"); |
| 118 | if (!lua_getinfo(L1, options, &ar)) |
| 119 | return luaL_argerror(L, arg+2, "invalid option"); |
| 120 | lua_createtable(L, 0, 2); |
| 121 | if (strchr(options, 'S')) { |
| 122 | settabss(L, "source", ar.source); |
| 123 | settabss(L, "short_src", ar.short_src); |
| 124 | settabsi(L, "linedefined", ar.linedefined); |
| 125 | settabsi(L, "lastlinedefined", ar.lastlinedefined); |
| 126 | settabss(L, "what", ar.what); |
| 127 | } |
| 128 | if (strchr(options, 'l')) |
| 129 | settabsi(L, "currentline", ar.currentline); |
| 130 | if (strchr(options, 'u')) |
| 131 | settabsi(L, "nups", ar.nups); |
| 132 | if (strchr(options, 'n')) { |
| 133 | settabss(L, "name", ar.name); |
| 134 | settabss(L, "namewhat", ar.namewhat); |
| 135 | } |
| 136 | if (strchr(options, 'L')) |
| 137 | treatstackoption(L, L1, "activelines"); |
| 138 | if (strchr(options, 'f')) |
| 139 | treatstackoption(L, L1, "func"); |
| 140 | return 1; /* return table */ |
| 141 | } |
| 142 | |
| 143 | |
| 144 | static int db_getlocal (lua_State *L) { |
nothing calls this directly
no test coverage detected