lua-users home
lua-l archive

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

On 10.05.2013 18:12, Roberto Ierusalimschy wrote:
[...] I use the module from

Again, I do not know whether this matters, but that code is not the
most recent code for strict.lua (the one that comes with Lua 5.1.4).
The code below is.


thanks for the code. Unfortunately, the problem still exists.

It may be of interest that calling debug.traceback() also causes a loop, wheras simply printing an error message plus the result of debug.getinfo(2) works perfectly.


-- strict.lua
-- checks uses of undeclared global variables
-- All global variables must be 'declared' through a regular assignment
-- (even assigning nil will do) in a main chunk before being used
-- anywhere or assigned to inside a function.

local getinfo, error, rawset, rawget = debug.getinfo, error, rawset, rawget

local mt = getmetatable(_G)
if mt == nil then
   mt = {}
   setmetatable(_G, mt)

mt.__declared = {}

local function what ()
   local d = getinfo(3, "S")
   return d and d.what or "C"

mt.__newindex = function (t, n, v)
   if not mt.__declared[n] then
     local w = what()
     if w ~= "main" and w ~= "C" then
       error("assign to undeclared variable '"..n.."'", 2)
     mt.__declared[n] = true
   rawset(t, n, v)

mt.__index = function (t, n)
   if not mt.__declared[n] and what() ~= "C" then
     error("variable '"..n.."' is not declared", 2)
   return rawget(t, n)