Hi folks,
there is a bug introduced in lua5.2.0-alpha. I found it while
inspecting the Lua source code to see how bytecode compilation is
realized. The following Lua-script
explains the affected routine in the source code, the reason of the bug
and an example for demonstration purpose:
-- "bug_in_luaK_self.lua"
-- Found by Michael Rose on 19.04.2011.
--
-- This Lua script is not working anymore in Lua 5.2 alpha if
-- the last comment below in 'many_constants' is removed.
-- This is due to an erroneous change in the routine 'luaK_self':
--
-- [01] void luaK_self (FuncState *fs, expdesc *e, expdesc *key) {
-- [02] int func;
-- [03] luaK_exp2anyreg(fs, e);
-- [04] freeexp(fs, e);
-- [05] func = fs->freereg;
-- [06] luaK_codeABC(fs, OP_SELF, func, e->u.info, luaK_exp2RK(fs,
key));
-- [07] freeexp(fs, key);
-- [08] luaK_reserveregs(fs, 2);
-- [09] e->u.info = func;
-- [10] e->k = VNONRELOC;
-- [11] }
--
-- The register for _expression_ 'e' is freed in line [04].
-- This works as long as the 'luaK_exp2RK(fs,key)' call in line [06]
-- doesn't require a register due to large constant indices for 'key'.
-- In the latter case, a freed register for 'e' might be uses the same
-- time for 'key' and the 'OP_SELF' command uses erroneously the same
-- register for 'e' and 'key'. The error will only occur on functions
-- having more constants than addressable by the RK coding.
-- This exactly happens if the comment in 'many_constants' is removed.
function method(self,x)
print(self.msg,x)
end
many_constants = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
100,101,102,103,104,105,106,107,108,109,
110,111,112,113,114,115,116,117,118,119,
120,121,122,123,124,125,126,127,128,129,
130,131,132,133,134,135,136,137,138,139,
140,141,142,143,144,145,146,147,148,149,
150,151,152,153,154,155,156,157,158,159,
160,161,162,163,164,165,166,167,168,169,
170,171,172,173,174,175,176,177,178,179,
180,181,182,183,184,185,186,187,188,189,
190,191,192,193,194,195,196,197,198,199,
200,201,202,203,204,205,206,207,208,209,
210,211,212,213,214,215,216,217,218,219,
220,221,222,223,224,225,226,227,228,229,
230,231,232,233,234,235,236,237,238,239,
240,241,242,243,244,245,246,247,248,249,
-- 250,251,252,253,254,255,256,257,258,259,
}
object = {f=method,msg="value of x is"}
object:f(25)
Regards,
Michael Rose
|