diff U5 lua-5.1.4/src/ltm.c lua-5.1.4jh/src/ltm.c --- lua-5.1.4/src/ltm.c Thu Dec 27 13:02:24 2007 +++ lua-5.1.4jh/src/ltm.c Thu Jan 14 17:56:22 2010 @@ -32,10 +32,13 @@ "__index", "__newindex", "__gc", "__mode", "__eq", "__add", "__sub", "__mul", "__div", "__mod", "__pow", "__unm", "__len", "__lt", "__le", "__concat", "__call" +#if defined(JH_LUA_ITER) + , "__iter" +#endif }; int i; for (i=0; itmname[i] = luaS_new(L, luaT_eventname[i]); luaS_fix(G(L)->tmname[i]); /* never collect these names */ diff U5 lua-5.1.4/src/ltm.h lua-5.1.4jh/src/ltm.h --- lua-5.1.4/src/ltm.h Thu Dec 27 13:02:24 2007 +++ lua-5.1.4jh/src/ltm.h Thu Jan 14 17:59:21 2010 @@ -31,10 +31,13 @@ TM_LEN, TM_LT, TM_LE, TM_CONCAT, TM_CALL, +#if defined(JH_LUA_ITER) + TM_ITER, +#endif TM_N /* number of elements in the enum */ } TMS; diff U5 lua-5.1.4/src/lvm.c lua-5.1.4jh/src/lvm.c --- lua-5.1.4/src/lvm.c Fri Dec 28 15:32:22 2007 +++ lua-5.1.4jh/src/lvm.c Thu Jan 14 17:58:15 2010 @@ -674,11 +674,31 @@ dojump(L, pc, GETARG_sBx(i)); continue; } case OP_TFORLOOP: { StkId cb = ra + 3; /* call base */ + +#if defined(JH_LUA_ITER) + if (!ttisfunction(ra)) + { + const TValue *tm = luaT_gettmbyobj(L, ra, TM_ITER); + if (ttisfunction(tm)) + { + setobjs2s(L, cb, tm); + } + else + { + L->top = cb; + lua_getglobal(L, "pairs"); + if (!ttisfunction(cb)) luaG_typeerror(L, ra, "iterate"); + } + setobjs2s(L, cb+1, ra); + L->top = cb + 2; // tag func + the object parameter. + Protect(luaD_call(L, cb, 3)); + L->top = L->ci->top; + ra = RA(i); // + cb = ra + 3; // previous call may change the stack + setobj2s(L, ra+2, cb+2); // + setobj2s(L, ra+1, cb+1); // + setobj2s(L, ra, cb); // replace parameters with return from tag method + L->top = ra + 3; + } +#endif + setobjs2s(L, cb+2, ra+2); setobjs2s(L, cb+1, ra+1); setobjs2s(L, cb, ra); L->top = cb+3; /* func. + 2 args (state and index) */ Protect(luaD_call(L, cb, GETARG_C(i))); L->top = L->ci->top;

AltStyle によって変換されたページ (->オリジナル) /