[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Bytecode hacks
- From: Luiz Henrique de Figueiredo <lhf@...>
- Date: Wed, 21 May 2014 08:13:29 -0300
> So I wanna do a t:[var]() operator (which's pretty much t:name() but it
> takes a var instead of a name) and I have no idea of how to do it...
The SELF instruction already supports this, but the parser does not.
Consider this code:
local t={}
t.f=print
local v="f"
t:x(1)
The bytecode is
1 [1] NEWTABLE 0 0 0
2 [2] GETTABUP 1 0 -2 ; _ENV "print"
3 [2] SETTABLE 0 -1 1 ; "f" -
4 [3] LOADK 1 -1 ; "f"
5 [4] SELF 2 0 -3 ; "x"
6 [4] LOADK 4 -4 ; 1
7 [4] CALL 2 3 1
8 [4] RETURN 0 1
Changing the SELF instruction to
5 [4] SELF 2 0 1
gives the right result, that is, calls t:[v](1). The third operand in SELF
is the location of the key. In the original code, it's the constant #3, "x".
In the modified code, it's the register #1, which is the local variable v,
and that contains "f".
I think there are patchs around for the t:[var]() syntax.