seqlua
diff seqlualib.c @ 15:a95fbd16473f
Removed unnecessary creation of closures for callable values (through __call)
author | jbe |
---|---|
date | Wed Aug 20 06:33:18 2014 +0200 (2014-08-20) |
parents | 144f0bddee2b |
children | 12a7a8f5a77d |
line diff
1.1 --- a/seqlualib.c Wed Aug 20 06:08:03 2014 +0200 1.2 +++ b/seqlualib.c Wed Aug 20 06:33:18 2014 +0200 1.3 @@ -2,33 +2,25 @@ 1.4 #include <lauxlib.h> 1.5 #include "seqlualib.h" 1.6 1.7 -#define SEQLUA_ITERTYPE_CALL 1 1.8 -#define SEQLUA_ITERTYPE_FUNC 2 1.9 -#define SEQLUA_ITERTYPE_META 3 1.10 -#define SEQLUA_ITERTYPE_RAW 4 1.11 +#define SEQLUA_ITERTYPE_FUNC 1 1.12 +#define SEQLUA_ITERTYPE_META 2 1.13 +#define SEQLUA_ITERTYPE_RAW 3 1.14 1.15 void seqlua_iterinit(lua_State *L, seqlua_Iterator *iter, int idx) { 1.16 luaL_checkany(L, idx); // provides better error message 1.17 iter->L = L; 1.18 - if (luaL_getmetafield(L, idx, "__call")) { 1.19 - if (lua_type(L, -1) != LUA_TFUNCTION) luaL_error(L, "__call is not a function"); 1.20 - iter->idx = lua_gettop(L); 1.21 - iter->callargidx = idx; 1.22 - iter->itertype = SEQLUA_ITERTYPE_CALL; 1.23 - } else if (lua_type(L, idx) == LUA_TFUNCTION) { 1.24 - lua_pushnil(L); // dummy value 1.25 - iter->idx = idx; 1.26 + iter->idx = idx; 1.27 + if (lua_type(L, idx) == LUA_TFUNCTION) { 1.28 iter->itertype = SEQLUA_ITERTYPE_FUNC; 1.29 + } else if (luaL_getmetafield(L, idx, "__call")) { 1.30 + lua_pop(L, 1); 1.31 + iter->itertype = SEQLUA_ITERTYPE_FUNC; 1.32 + } else if (luaL_getmetafield(L, idx, "__index")) { 1.33 + lua_pop(L, 1); 1.34 + iter->itertype = SEQLUA_ITERTYPE_META; 1.35 } else { 1.36 - iter->idx = idx; 1.37 - if (luaL_getmetafield(L, idx, "__index")) { 1.38 - iter->itertype = SEQLUA_ITERTYPE_META; 1.39 - // leave __index as dummy value 1.40 - } else { 1.41 - lua_pushnil(L); // dummy value 1.42 - luaL_checktype(L, idx, LUA_TTABLE); 1.43 - iter->itertype = SEQLUA_ITERTYPE_RAW; 1.44 - } 1.45 + luaL_checktype(L, idx, LUA_TTABLE); 1.46 + iter->itertype = SEQLUA_ITERTYPE_RAW; 1.47 } 1.48 iter->i = 0; 1.49 } 1.50 @@ -37,11 +29,6 @@ 1.51 lua_State *L = iter->L; 1.52 lua_Integer i = ++iter->i; 1.53 switch (iter->itertype) { 1.54 - case SEQLUA_ITERTYPE_CALL: 1.55 - lua_pushvalue(L, iter->idx); 1.56 - lua_pushvalue(L, iter->callargidx); 1.57 - lua_call(L, 1, 1); 1.58 - break; 1.59 case SEQLUA_ITERTYPE_FUNC: 1.60 lua_pushvalue(L, iter->idx); 1.61 lua_call(L, 0, 1); 1.62 @@ -55,7 +42,7 @@ 1.63 break; 1.64 } 1.65 if (lua_isnil(L, -1)) { 1.66 - lua_pop(L, 2); // remove nil and dummy value 1.67 + lua_pop(L, 1); 1.68 return 0; 1.69 } 1.70 return 1; 1.71 @@ -80,22 +67,12 @@ 1.72 return 1; 1.73 } 1.74 1.75 -static int seqlua_iterclosureaux_call(lua_State *L) { 1.76 - lua_pushvalue(L, lua_upvalueindex(1)); 1.77 - lua_pushvalue(L, lua_upvalueindex(2)); 1.78 - lua_call(L, 1, 1); 1.79 - return 1; 1.80 -} 1.81 - 1.82 void seqlua_iterclosure(lua_State *L, int idx) { 1.83 luaL_checkany(L, idx); // provides better error message 1.84 if (lua_type(L, idx) == LUA_TFUNCTION) { 1.85 // do nothing 1.86 } else if (luaL_getmetafield(L, idx, "__call")) { 1.87 - if (lua_type(L, -1) != LUA_TFUNCTION) luaL_error(L, "__call is not a function"); 1.88 - lua_pushvalue(L, idx); 1.89 - lua_pushcclosure(L, seqlua_iterclosureaux_call, 2); 1.90 - lua_replace(L, idx); 1.91 + lua_pop(L, 1); 1.92 } else if (luaL_getmetafield(L, idx, "__index")) { 1.93 lua_pop(L, 1); 1.94 lua_pushvalue(L, idx);