--- ltm.h.old 2004-07-11 19:38:40.000000000 +0100 +++ ltm.h 2004-07-11 19:32:59.000000000 +0100 @@ -18,6 +18,7 @@ typedef enum { TM_INDEX, TM_NEWINDEX, + TM_METHINDEX, TM_GC, TM_MODE, TM_EQ, /* last tag method with `fast' access */ --- ltm.c.old 2004-07-11 19:38:37.000000000 +0100 +++ ltm.c 2004-07-11 19:33:08.000000000 +0100 @@ -27,7 +27,7 @@ void luaT_init (lua_State *L) { static const char *const luaT_eventname[] = { /* ORDER TM */ - "__index", "__newindex", + "__index", "__newindex", "__methindex", "__gc", "__mode", "__eq", "__add", "__sub", "__mul", "__div", "__pow", "__unm", "__lt", "__le", --- lvm.c.old 2004-07-11 19:38:32.000000000 +0100 +++ lvm.c 2004-07-11 19:35:01.000000000 +0100 @@ -131,6 +131,18 @@ else return luaV_gettable(L, tm, key, loop); } +static const TObject *luaV_methindex (lua_State *L, const TObject *t, + TObject *key, int loop) { + const TObject *tm = fasttm(L, hvalue(t)->metatable, TM_METHINDEX); + if (tm == NULL) tm = fasttm(L, hvalue(t)->metatable, TM_INDEX); + if (tm == NULL) return &luaO_nilobject; /* no TM */ + if (ttisfunction(tm)) { + callTMres(L, tm, t, key); + return L->top; + } + else return luaV_gettable(L, tm, key, loop); +} + static const TObject *luaV_getnotable (lua_State *L, const TObject *t, TObject *key, int loop) { const TObject *tm = luaT_gettmbyobj(L, t, TM_INDEX); @@ -512,7 +524,7 @@ const TObject *v = luaH_getstr(hvalue(rb), tsvalue(rc)); if (!ttisnil(v)) { setobj2s(ra, v); } else - setobj2s(XRA(i), luaV_index(L, rb, rc, 0)); + setobj2s(XRA(i), luaV_methindex(L, rb, rc, 0)); } else setobj2s(XRA(i), luaV_getnotable(L, rb, rc, 0));