C functions and userdata also have environments

This commit is contained in:
Roberto Ierusalimschy
2005-02-18 10:40:02 -02:00
parent 73d7640244
commit 7d45a5f48f
17 changed files with 206 additions and 111 deletions

View File

@@ -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},