[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: How can I avoid changing the _ENV of a whole file when changing the _ENV of a lua function?
- From: John Tan <johnmave126@...>
- Date: Sat, 18 Feb 2012 21:16:23 +0800
On Sat, Feb 18, 2012 at 9:19 AM, Tom N Harris <telliamed@whoopdedo.org> wrote:
> On 02/17/2012 03:53 AM, John Tan wrote:
>>
>>
>> After trying such code I found that if I change the _ENV of a lua
>> function, it will change the _ENV of whole file.
>> I wonder if there is any way I can only change the _ENV of a certain
>> lua function without affecting the other part of the script.
>> THX in advance.
>>
>
> I believe what you want is lua_upvaluejoin. If you just change the value,
> then all other functions that share that upvalue will also be changed.
> lua_upvaluejoin changes the upvalue reference. The tricky part is that the
> new reference must also be the upvalue of another function.
>
> [1] http://www.lua.org/manual/5.2/manual.html#lua_upvaluejoin
>
> --
> - tom
> telliamed@whoopdedo.org
>
Thanks!
After inspecting the code of lua_upvaluejoin()
I decide to write an API myself...
here is the api i write
LUA_API void lua_upvalueref (lua_State *L, int fidx, int n) {
LClosure *f1;
UpVal **up1 = getupvalref(L, fidx, n, &f1);
UpVal *uv = &luaC_newobj(L, LUA_TUPVAL, sizeof(UpVal), NULL, 0)->uv;
api_checknelems(L, 1);
uv->v = &uv->u.value;
L->top--;
setobj(L, uv->v, L->top);
*up1 = uv;
luaC_objbarrier(L, f1, uv);
}