seqlua

annotate seqlualib.c @ 32:3ff7cec8d3ce

Do not respect __len metamethods
author jbe
date Sun Aug 24 00:00:43 2014 +0200 (2014-08-24)
parents 4fc9090ada1d
children 332216604f83
rev   line source
jbe@0 1 #include <lua.h>
jbe@0 2 #include <lauxlib.h>
jbe@0 3 #include "seqlualib.h"
jbe@0 4
jbe@30 5 #define SEQLUA_ITERTYPE_IPAIRS 1
jbe@30 6 #define SEQLUA_ITERTYPE_CALL 2
jbe@30 7 #define SEQLUA_ITERTYPE_INDEX 3
jbe@30 8 #define SEQLUA_ITERTYPE_RAW 4
jbe@0 9
jbe@0 10 void seqlua_iterinit(lua_State *L, seqlua_Iterator *iter, int idx) {
jbe@30 11 if (luaL_getmetafield(L, idx, "__ipairs")) {
jbe@30 12 lua_pushvalue(L, idx);
jbe@30 13 lua_call(L, 1, 3);
jbe@30 14 iter->itertype = SEQLUA_ITERTYPE_IPAIRS;
jbe@30 15 } else {
jbe@30 16 if (lua_type(L, idx) == LUA_TFUNCTION) {
jbe@30 17 iter->itertype = SEQLUA_ITERTYPE_CALL;
jbe@32 18 } else if (luaL_getmetafield(L, idx, "__index")) {
jbe@30 19 lua_pop(L, 1);
jbe@30 20 iter->itertype = SEQLUA_ITERTYPE_INDEX;
jbe@30 21 } else {
jbe@30 22 luaL_checktype(L, idx, LUA_TTABLE);
jbe@30 23 iter->itertype = SEQLUA_ITERTYPE_RAW;
jbe@30 24 }
jbe@30 25 // always occupy 3 stack indicies
jbe@30 26 lua_pushnil(L);
jbe@30 27 lua_pushnil(L);
jbe@30 28 lua_pushnil(L);
jbe@30 29 iter->idx = idx;
jbe@30 30 }
jbe@0 31 iter->L = L;
jbe@0 32 iter->i = 0;
jbe@0 33 }
jbe@0 34
jbe@0 35 int seqlua_iternext(seqlua_Iterator *iter) {
jbe@0 36 lua_State *L = iter->L;
jbe@0 37 lua_Integer i = ++iter->i;
jbe@0 38 switch (iter->itertype) {
jbe@30 39 case SEQLUA_ITERTYPE_IPAIRS:
jbe@30 40 lua_pushvalue(L, -3);
jbe@30 41 lua_pushvalue(L, -3);
jbe@30 42 lua_pushvalue(L, -3);
jbe@30 43 lua_call(L, 2, 2);
jbe@30 44 if (lua_isnil(L, -2)) {
jbe@30 45 lua_pop(L, 5);
jbe@30 46 return 0;
jbe@30 47 }
jbe@30 48 lua_remove(L, -3);
jbe@30 49 return 1;
jbe@30 50 case SEQLUA_ITERTYPE_CALL:
jbe@8 51 lua_pushvalue(L, iter->idx);
jbe@0 52 lua_call(L, 0, 1);
jbe@0 53 break;
jbe@30 54 case SEQLUA_ITERTYPE_INDEX:
jbe@0 55 lua_pushinteger(L, i);
jbe@8 56 lua_gettable(L, iter->idx);
jbe@32 57 break;
jbe@0 58 case SEQLUA_ITERTYPE_RAW:
jbe@8 59 lua_rawgeti(L, iter->idx, i);
jbe@8 60 break;
jbe@0 61 }
jbe@0 62 if (lua_isnil(L, -1)) {
jbe@30 63 lua_pop(L, 4);
jbe@0 64 return 0;
jbe@0 65 }
jbe@0 66 return 1;
jbe@0 67 }
jbe@0 68

Impressum / About Us