lua-users home
lua-l archive

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


> The problem then, is determining which functions have _ENV as an upvalue and which do not. I’m unable to find a deterministic way to do this. I can’t look at the type of the first upvalue, since some of our upvalues are also tables. I can’t look at the name of the first upvalue, since this can be stripped out with debug information. I *can* look to see if the first upvalue is the same table as the distinguished environment, but (argh) some functions have custom environments and hence a different environment. I can look to see if the table has _G (and if it is a self-reference to the table), but while this is a good hint it is of course not deterministic as a regular table could have this (though it would be odd).

I guess you could check whether the first (or actually, any) upvalue
has the same table as the distinguished environment. If so, you send
some special code that says "use your distinguished environment here".
It is true that some functions have custom environments; but, in that
case, it seems useless to know that it is the _ENV, since you cannot
use the receiver's _ENV there anyway. 

In other words, you should worry about the value, not the name. If an
upvalue carries the distinguished environment (despite its name), you
probably want to use the receive's distinguished environment. If an
upvalue carries any other value (despite its name), you need some
other solution.

-- Roberto