lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


Because it's a metatable of a different table, each __index is isolated from each other 
On Aug 26, 2023 at 11:14 +0300, temp 213 qwe <temp213@gorodok.net>, wrote:
It is a more general question why in this __indexing chain
when finally found __index metamethod is a function, it is
called with last table in chain as argument, but not the first
one who actually triggered indexing.

Yes, i could store a link to initial table somewhere, and then
track back who actually triggered initial indexing, but this
would require "parent" table be aware of inherited "children".


lvm.c:

void luaV_finishget (lua_State *L, const TValue *t, TValue
*key, StkId val, const TValue *slot) {
int loop; /* counter to avoid infinite loops */
const TValue *tm; /* metamethod */
const TValue *t0 = t;
...
// luaT_callTMres(L, tm, t, key, val); /* call it */
luaT_callTMres(L, tm, t0, key, val); /* call it */




On Fri, 25 Aug 2023 21:51:56 -0400
David Favro <lua@meta-dynamic.com> wrote:


On August 25, 2023 12:58:40 PM EDT, temp 213 qwe
<temp213@gorodok.net> wrote:

"child" table could store a link to "parent" (in __index
actually), but
if at
the end of nested __indexing process we got last "parent" as
self,
there is no
way to get a child who actually triggered it, or?

If I understand correctly what you are asking, this is a
common request.

You have two options, either use functions for __index all
the way down and choose a technique to carry a reference to
the original table into successive calls, or modify the Lua
runtime to pass in the originating table to the final __index
function as a third parameter.

I use a personal fork of Lua with this modification amongst
others, and I imagine that I am not the only one.

See for instance:
http://lua-users.org/lists/lua-l/2016-02/msg00287.html

-- David