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
http://metalua.luaforge.net/src/lib/strict.lua.html

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.

Roberto,

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.

Greetings,
Bernd

--
-- 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)
end

mt.__declared = {}

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

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)
     end
     mt.__declared[n] = true
   end
   rawset(t, n, v)
end

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




--
http://sudrala.de