Showing with 52 additions and 0 deletions.
  1. +26 −0 ldblib.c
  2. +25 −0 ldebug.c
  3. +1 −0 lua.h
@@ -190,6 +190,31 @@ static int db_getinfo (lua_State *L) {
}


static int db_getconstant (lua_State *L) {
int arg;
lua_State *L1 = getthread(L, &arg);
lua_Debug ar;
int nvar = (int)luaL_checkinteger(L, arg + 2); /* local-variable index */
if (lua_isfunction(L, arg + 1)) { /* function argument? */
lua_pushvalue(L, arg + 1); /* push function */
return lua_getconstant(L, NULL, nvar);
}
else { /* stack-level argument */
int level = (int)luaL_checkinteger(L, arg + 1);
if (!lua_getstack(L1, level, &ar)) /* out of range? */
return luaL_argerror(L, arg+1, "level out of range");
checkstack(L, L1, 1);
if (lua_getconstant(L1, &ar, nvar)) {
lua_xmove(L1, L, 1); /* move value */
return 1;
}
else {
return 0;
}
}
}


static int db_getlocal (lua_State *L) {
int arg;
lua_State *L1 = getthread(L, &arg);
@@ -433,6 +458,7 @@ static const luaL_Reg dblib[] = {
{"getuservalue", db_getuservalue},
{"gethook", db_gethook},
{"getinfo", db_getinfo},
{"getconstant", db_getconstant},
{"getlocal", db_getlocal},
{"getregistry", db_getregistry},
{"getmetatable", db_getmetatable},
@@ -130,6 +130,31 @@ static const char *upvalname (Proto *p, int uv) {
}


LUA_API int lua_getconstant (lua_State *L, const lua_Debug *ar, int n) {
int ret = 0;
Proto *p = NULL;
lua_lock(L);
if (ar == NULL) {
if (isLfunction(L->top - 1))
p = clLvalue(L->top - 1)->p;
}
else {
StkId func = ar->i_ci->func;
if (ttisclosure(func))
p = clvalue(func)->l.p;
}
if (p && n > 0 && n <= p->sizek) {
TValue *v;
v = &p->k[n-1];
setobj2s(L, L->top, v);
api_incr_top(L);
ret = 1;
}
lua_unlock(L);
return ret;
}


static const char *findvararg (CallInfo *ci, int n, StkId *pos) {
int nparams = clLvalue(ci->func)->p->numparams;
if (n >= cast_int(ci->u.l.base - ci->func) - nparams)
1 lua.h
@@ -423,6 +423,7 @@ typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar);

LUA_API int (lua_getstack) (lua_State *L, int level, lua_Debug *ar);
LUA_API int (lua_getinfo) (lua_State *L, const char *what, lua_Debug *ar);
LUA_API int (lua_getconstant) (lua_State *L, const lua_Debug *ar, int n);
LUA_API const char *(lua_getlocal) (lua_State *L, const lua_Debug *ar, int n);
LUA_API const char *(lua_setlocal) (lua_State *L, const lua_Debug *ar, int n);
LUA_API const char *(lua_getupvalue) (lua_State *L, int funcindex, int n);