aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2007-10-17 15:26:39 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2007-10-17 15:26:39 -0200
commitab09732986d551efea3f44367ec1221afea72c7d (patch)
tree1c47b0a0e964cad4c13fc124c11004336601c63b
parentb7fa64565af859776ca805ea5d1ee4a94a44c6b8 (diff)
downloadlua-ab09732986d551efea3f44367ec1221afea72c7d.tar.gz
lua-ab09732986d551efea3f44367ec1221afea72c7d.tar.bz2
lua-ab09732986d551efea3f44367ec1221afea72c7d.zip
new metamethods for '__pairs' and '__ipairs'
-rw-r--r--lbaselib.c30
1 files changed, 19 insertions, 11 deletions
diff --git a/lbaselib.c b/lbaselib.c
index c48487da..f9c0f5e7 100644
--- a/lbaselib.c
+++ b/lbaselib.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lbaselib.c,v 1.197 2007/02/09 12:40:21 roberto Exp roberto $ 2** $Id: lbaselib.c,v 1.198 2007/06/21 13:48:04 roberto Exp roberto $
3** Basic library 3** Basic library
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -223,6 +223,22 @@ static int luaB_type (lua_State *L) {
223} 223}
224 224
225 225
226static int pairsmeta (lua_State *L, const char *method, int iszero) {
227 if (!luaL_getmetafield(L, 1, method)) { /* no metamethod? */
228 luaL_checktype(L, 1, LUA_TTABLE); /* argument must be a table */
229 lua_pushvalue(L, lua_upvalueindex(1)); /* will return generator, */
230 lua_pushvalue(L, 1); /* state, */
231 if (iszero) lua_pushinteger(L, 0); /* and initial value */
232 else lua_pushnil(L);
233 }
234 else {
235 lua_pushvalue(L, 1); /* argument 'self' to metamethod */
236 lua_call(L, 1, 3); /* get 3 values from metamethod */
237 }
238 return 3;
239}
240
241
226static int luaB_next (lua_State *L) { 242static int luaB_next (lua_State *L) {
227 luaL_checktype(L, 1, LUA_TTABLE); 243 luaL_checktype(L, 1, LUA_TTABLE);
228 lua_settop(L, 2); /* create a 2nd argument if there isn't one */ 244 lua_settop(L, 2); /* create a 2nd argument if there isn't one */
@@ -236,11 +252,7 @@ static int luaB_next (lua_State *L) {
236 252
237 253
238static int luaB_pairs (lua_State *L) { 254static int luaB_pairs (lua_State *L) {
239 luaL_checktype(L, 1, LUA_TTABLE); 255 return pairsmeta(L, "__pairs", 0);
240 lua_pushvalue(L, lua_upvalueindex(1)); /* return generator, */
241 lua_pushvalue(L, 1); /* state, */
242 lua_pushnil(L); /* and initial value */
243 return 3;
244} 256}
245 257
246 258
@@ -255,11 +267,7 @@ static int ipairsaux (lua_State *L) {
255 267
256 268
257static int luaB_ipairs (lua_State *L) { 269static int luaB_ipairs (lua_State *L) {
258 luaL_checktype(L, 1, LUA_TTABLE); 270 return pairsmeta(L, "__ipairs", 1);
259 lua_pushvalue(L, lua_upvalueindex(1)); /* return generator, */
260 lua_pushvalue(L, 1); /* state, */
261 lua_pushinteger(L, 0); /* and initial value */
262 return 3;
263} 271}
264 272
265 273