[Date Prev][Date Next][Thread Prev][Thread Next]
- Subject: Re: Looking for some help - add fenv and other 5.1 features to ravi-distro
- From: Sean Conner <sean@...>
- Date: Tue, 27 Nov 2018 18:04:36 -0500
It was thus said that the Great Dibyendu Majumdar once stated:
> I was wondering if anyone would be able to help me add some Lua 5.1
> compatibility features to Lua 5.3 in my Ravi-Distro package.
> I include Lua 5.3.5 in the distro with these enhancements:
> * The LuaJIT bit library is included
> * All available 5.1 and 5.2 compatibility options are enabled,
> including LUA_COMPAT_FLOATSTRING .
> These compatibility options enable Lua 5.3 to run LuaJIT's dynasm tool
> for instance.
> However I would like to improve backwards compatibility with Lua 5.1
> even further; in particular would like to add support for fenv(). But
> I have never used Lua 5.1, and despite good intentions, haven't been
> able to work on this aspect. I would very much appreciate any help.
It may be possible. setfenv() is used to set an environment table to
either a function or userdata. If it's a function, this table become the
global environment for the function; for a userdata, it's similar to
setuservalue(). Given that Lua 5.3, section 3.3.2 states:
As such, chunks can define local variables, receive arguments, and
return values. Moreover, such anonymous function is compiled as in
the scope of an external local variable called _ENV (see §2.2). The
resulting function always has _ENV as its only upvalue, even if it
does not use that variable.
So any code loaded via load() (or similar) will hvae _ENV as the first
upvalue, you can use setupvalue() to switch out the _ENV value currently
set. Arbitrary functions might be a bit harder to locate the proper _ENV to
swap (if not outright impossible in some cases).
setfenv() at least, the Lua function, not the C function, can also modify
a function in the call stack. Per the description:
Sets the environment to be used by the given function. f can be a
Lua function or a number that specifies the function at that stack
level: Level 1 is the function calling setfenv. setfenv returns the
As a special case, when f is 0 setfenv changes the environment of
the running thread. In this case, setfenv returns no values.
-spc (As always, the devil is in the details ... )