lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


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