C functions and userdata also have environments
This commit is contained in:
86
ltests.c
86
ltests.c
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
** $Id: ltests.c,v 2.17 2005/01/14 14:19:42 roberto Exp $
|
||||
** $Id: ltests.c,v 2.19 2005/01/19 15:54:26 roberto Exp roberto $
|
||||
** Internal Module for Debugging of the Lua Implementation
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
@@ -249,6 +249,7 @@ static void checkproto (global_State *g, Proto *f) {
|
||||
|
||||
static void checkclosure (global_State *g, Closure *cl) {
|
||||
GCObject *clgc = obj2gco(cl);
|
||||
checkobjref(g, clgc, cl->l.env);
|
||||
if (cl->c.isC) {
|
||||
int i;
|
||||
for (i=0; i<cl->c.nupvalues; i++)
|
||||
@@ -257,7 +258,6 @@ static void checkclosure (global_State *g, Closure *cl) {
|
||||
else {
|
||||
int i;
|
||||
lua_assert(cl->l.nupvalues == cl->l.p->nups);
|
||||
checkobjref(g, clgc, hvalue(&cl->l.g));
|
||||
checkobjref(g, clgc, cl->l.p);
|
||||
for (i=0; i<cl->l.nupvalues; i++) {
|
||||
if (cl->l.upvals[i]) {
|
||||
@@ -622,20 +622,6 @@ static int unref (lua_State *L) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int metatable (lua_State *L) {
|
||||
luaL_checkany(L, 1);
|
||||
if (lua_isnone(L, 2)) {
|
||||
if (lua_getmetatable(L, 1) == 0)
|
||||
lua_pushnil(L);
|
||||
}
|
||||
else {
|
||||
lua_settop(L, 2);
|
||||
luaL_checktype(L, 2, LUA_TTABLE);
|
||||
lua_setmetatable(L, 1);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int upvalue (lua_State *L) {
|
||||
int n = luaL_checkint(L, 2);
|
||||
@@ -814,10 +800,22 @@ static const char *getname_aux (char *buff, const char **pc) {
|
||||
}
|
||||
|
||||
|
||||
static int getindex_aux (lua_State *L, const char **pc) {
|
||||
skip(pc);
|
||||
switch (*(*pc)++) {
|
||||
case 'R': return LUA_REGISTRYINDEX;
|
||||
case 'G': return LUA_GLOBALSINDEX;
|
||||
case 'E': return LUA_ENVIRONINDEX;
|
||||
case 'U': return lua_upvalueindex(getnum_aux(L, pc));
|
||||
default: (*pc)--; return getnum_aux(L, pc);
|
||||
}
|
||||
}
|
||||
|
||||
#define EQ(s1) (strcmp(s1, inst) == 0)
|
||||
|
||||
#define getnum (getnum_aux(L, &pc))
|
||||
#define getname (getname_aux(buff, &pc))
|
||||
#define getindex (getindex_aux(L, &pc))
|
||||
|
||||
|
||||
static int testC (lua_State *L) {
|
||||
@@ -836,44 +834,44 @@ static int testC (lua_State *L) {
|
||||
const char *inst = getname;
|
||||
if EQ("") return 0;
|
||||
else if EQ("isnumber") {
|
||||
lua_pushinteger(L1, lua_isnumber(L1, getnum));
|
||||
lua_pushinteger(L1, lua_isnumber(L1, getindex));
|
||||
}
|
||||
else if EQ("isstring") {
|
||||
lua_pushinteger(L1, lua_isstring(L1, getnum));
|
||||
lua_pushinteger(L1, lua_isstring(L1, getindex));
|
||||
}
|
||||
else if EQ("istable") {
|
||||
lua_pushinteger(L1, lua_istable(L1, getnum));
|
||||
lua_pushinteger(L1, lua_istable(L1, getindex));
|
||||
}
|
||||
else if EQ("iscfunction") {
|
||||
lua_pushinteger(L1, lua_iscfunction(L1, getnum));
|
||||
lua_pushinteger(L1, lua_iscfunction(L1, getindex));
|
||||
}
|
||||
else if EQ("isfunction") {
|
||||
lua_pushinteger(L1, lua_isfunction(L1, getnum));
|
||||
lua_pushinteger(L1, lua_isfunction(L1, getindex));
|
||||
}
|
||||
else if EQ("isuserdata") {
|
||||
lua_pushinteger(L1, lua_isuserdata(L1, getnum));
|
||||
lua_pushinteger(L1, lua_isuserdata(L1, getindex));
|
||||
}
|
||||
else if EQ("isudataval") {
|
||||
lua_pushinteger(L1, lua_islightuserdata(L1, getnum));
|
||||
lua_pushinteger(L1, lua_islightuserdata(L1, getindex));
|
||||
}
|
||||
else if EQ("isnil") {
|
||||
lua_pushinteger(L1, lua_isnil(L1, getnum));
|
||||
lua_pushinteger(L1, lua_isnil(L1, getindex));
|
||||
}
|
||||
else if EQ("isnull") {
|
||||
lua_pushinteger(L1, lua_isnone(L1, getnum));
|
||||
lua_pushinteger(L1, lua_isnone(L1, getindex));
|
||||
}
|
||||
else if EQ("tonumber") {
|
||||
lua_pushnumber(L1, lua_tonumber(L1, getnum));
|
||||
lua_pushnumber(L1, lua_tonumber(L1, getindex));
|
||||
}
|
||||
else if EQ("tostring") {
|
||||
const char *s = lua_tostring(L1, getnum);
|
||||
const char *s = lua_tostring(L1, getindex);
|
||||
lua_pushstring(L1, s);
|
||||
}
|
||||
else if EQ("objsize") {
|
||||
lua_pushinteger(L1, lua_objsize(L1, getnum));
|
||||
lua_pushinteger(L1, lua_objsize(L1, getindex));
|
||||
}
|
||||
else if EQ("tocfunction") {
|
||||
lua_pushcfunction(L1, lua_tocfunction(L1, getnum));
|
||||
lua_pushcfunction(L1, lua_tocfunction(L1, getindex));
|
||||
}
|
||||
else if EQ("return") {
|
||||
return getnum;
|
||||
@@ -899,11 +897,14 @@ static int testC (lua_State *L) {
|
||||
else if EQ("pushbool") {
|
||||
lua_pushboolean(L1, getnum);
|
||||
}
|
||||
else if EQ("newuserdata") {
|
||||
lua_newuserdata(L1, getnum);
|
||||
}
|
||||
else if EQ("tobool") {
|
||||
lua_pushinteger(L1, lua_toboolean(L1, getnum));
|
||||
lua_pushinteger(L1, lua_toboolean(L1, getindex));
|
||||
}
|
||||
else if EQ("pushvalue") {
|
||||
lua_pushvalue(L1, getnum);
|
||||
lua_pushvalue(L1, getindex);
|
||||
}
|
||||
else if EQ("pushcclosure") {
|
||||
lua_pushcclosure(L1, testC, getnum);
|
||||
@@ -915,13 +916,13 @@ static int testC (lua_State *L) {
|
||||
lua_insert(L1, getnum);
|
||||
}
|
||||
else if EQ("replace") {
|
||||
lua_replace(L1, getnum);
|
||||
lua_replace(L1, getindex);
|
||||
}
|
||||
else if EQ("gettable") {
|
||||
lua_gettable(L1, getnum);
|
||||
lua_gettable(L1, getindex);
|
||||
}
|
||||
else if EQ("settable") {
|
||||
lua_settable(L1, getnum);
|
||||
lua_settable(L1, getindex);
|
||||
}
|
||||
else if EQ("next") {
|
||||
lua_next(L1, -2);
|
||||
@@ -930,12 +931,12 @@ static int testC (lua_State *L) {
|
||||
lua_concat(L1, getnum);
|
||||
}
|
||||
else if EQ("lessthan") {
|
||||
int a = getnum;
|
||||
lua_pushboolean(L1, lua_lessthan(L1, a, getnum));
|
||||
int a = getindex;
|
||||
lua_pushboolean(L1, lua_lessthan(L1, a, getindex));
|
||||
}
|
||||
else if EQ("equal") {
|
||||
int a = getnum;
|
||||
lua_pushboolean(L1, lua_equal(L1, a, getnum));
|
||||
int a = getindex;
|
||||
lua_pushboolean(L1, lua_equal(L1, a, getindex));
|
||||
}
|
||||
else if EQ("rawcall") {
|
||||
int narg = getnum;
|
||||
@@ -956,21 +957,21 @@ static int testC (lua_State *L) {
|
||||
luaL_loadfile(L1, luaL_checkstring(L1, getnum));
|
||||
}
|
||||
else if EQ("setmetatable") {
|
||||
lua_setmetatable(L1, getnum);
|
||||
lua_setmetatable(L1, getindex);
|
||||
}
|
||||
else if EQ("getmetatable") {
|
||||
if (lua_getmetatable(L1, getnum) == 0)
|
||||
if (lua_getmetatable(L1, getindex) == 0)
|
||||
lua_pushnil(L1);
|
||||
}
|
||||
else if EQ("type") {
|
||||
lua_pushstring(L1, luaL_typename(L1, getnum));
|
||||
}
|
||||
else if EQ("getn") {
|
||||
int i = getnum;
|
||||
int i = getindex;
|
||||
lua_pushinteger(L1, luaL_getn(L1, i));
|
||||
}
|
||||
else if EQ("setn") {
|
||||
int i = getnum;
|
||||
int i = getindex;
|
||||
int n = cast(int, lua_tonumber(L1, -1));
|
||||
luaL_setn(L1, i, n);
|
||||
lua_pop(L1, 1);
|
||||
@@ -1095,7 +1096,6 @@ static const struct luaL_reg tests_funcs[] = {
|
||||
{"unref", unref},
|
||||
{"d2s", d2s},
|
||||
{"s2d", s2d},
|
||||
{"metatable", metatable},
|
||||
{"upvalue", upvalue},
|
||||
{"newuserdata", newuserdata},
|
||||
{"pushuserdata", pushuserdata},
|
||||
|
||||
Reference in New Issue
Block a user