mirror of https://github.com/rusefi/lua.git
new metamethods for '__pairs' and '__ipairs'
This commit is contained in:
parent
b7fa64565a
commit
ab09732986
30
lbaselib.c
30
lbaselib.c
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
** $Id: lbaselib.c,v 1.197 2007/02/09 12:40:21 roberto Exp roberto $
|
** $Id: lbaselib.c,v 1.198 2007/06/21 13:48:04 roberto Exp roberto $
|
||||||
** Basic library
|
** Basic library
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
|
@ -223,6 +223,22 @@ static int luaB_type (lua_State *L) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int pairsmeta (lua_State *L, const char *method, int iszero) {
|
||||||
|
if (!luaL_getmetafield(L, 1, method)) { /* no metamethod? */
|
||||||
|
luaL_checktype(L, 1, LUA_TTABLE); /* argument must be a table */
|
||||||
|
lua_pushvalue(L, lua_upvalueindex(1)); /* will return generator, */
|
||||||
|
lua_pushvalue(L, 1); /* state, */
|
||||||
|
if (iszero) lua_pushinteger(L, 0); /* and initial value */
|
||||||
|
else lua_pushnil(L);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
lua_pushvalue(L, 1); /* argument 'self' to metamethod */
|
||||||
|
lua_call(L, 1, 3); /* get 3 values from metamethod */
|
||||||
|
}
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int luaB_next (lua_State *L) {
|
static int luaB_next (lua_State *L) {
|
||||||
luaL_checktype(L, 1, LUA_TTABLE);
|
luaL_checktype(L, 1, LUA_TTABLE);
|
||||||
lua_settop(L, 2); /* create a 2nd argument if there isn't one */
|
lua_settop(L, 2); /* create a 2nd argument if there isn't one */
|
||||||
|
@ -236,11 +252,7 @@ static int luaB_next (lua_State *L) {
|
||||||
|
|
||||||
|
|
||||||
static int luaB_pairs (lua_State *L) {
|
static int luaB_pairs (lua_State *L) {
|
||||||
luaL_checktype(L, 1, LUA_TTABLE);
|
return pairsmeta(L, "__pairs", 0);
|
||||||
lua_pushvalue(L, lua_upvalueindex(1)); /* return generator, */
|
|
||||||
lua_pushvalue(L, 1); /* state, */
|
|
||||||
lua_pushnil(L); /* and initial value */
|
|
||||||
return 3;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -255,11 +267,7 @@ static int ipairsaux (lua_State *L) {
|
||||||
|
|
||||||
|
|
||||||
static int luaB_ipairs (lua_State *L) {
|
static int luaB_ipairs (lua_State *L) {
|
||||||
luaL_checktype(L, 1, LUA_TTABLE);
|
return pairsmeta(L, "__ipairs", 1);
|
||||||
lua_pushvalue(L, lua_upvalueindex(1)); /* return generator, */
|
|
||||||
lua_pushvalue(L, 1); /* state, */
|
|
||||||
lua_pushinteger(L, 0); /* and initial value */
|
|
||||||
return 3;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue