[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Sandboxing a module that clutters the global environment
- From: alloyed@...
- Date: Wed, 05 Oct 2016 17:38:52 -0700
On 10/5/2016 6:31 AM, tyrondis wrote:
Hi *,
I have a 3rd party module that operates and maintains its state in the
global environment.
Is there anyway I can load this module into a custom context table, so
that it uses that table as its _G? I want to be able to have multiple
instances of that module, which is currently not possible because of
its “Singleton” nature.
I could also refactor the 3rd part module but I want to have it
untouched to make it easier to apply potential patches to it.
Thanks
Tyr
I've done something like this to run multiple luarocks commands from a
single lua state.
Relevant functions:
https://git.io/vPcIG
https://git.io/vPcIW
This was a high-touch process: I actually stuck a breakpoint in the
middle of luarocks so I could inspect the environment to see exactly
what exactly I needed to shim and what I didn't.
Once I knew that (in my case _G and package.loaded) I used a simple
shim:
t = setmetatable({}, {__index=old_t})
Table reads should behave the same, but every time a table gets written
to, the write goes into the shim instead of the old table. This is
shallow, so something like `t.a.b` would leak back into the original
t.a, but this is fine for me since luarocks doesn't do anything
particularly silly.
I use Lua 5.1's setfenv to apply the new environment, but _ENV can be
used to similar effect on 5.2/5.3:
http://leafo.net/guides/setfenv-in-lua52-and-above.html