]>
Commit | Line | Data |
---|---|---|
1 | -- | |
2 | -- strict.lua | |
3 | -- checks uses of undeclared global variables | |
4 | -- All global variables must be 'declared' through a regular assignment | |
5 | -- (even assigning nil will do) in a main chunk before being used | |
6 | -- anywhere or assigned to inside a function. | |
7 | -- | |
8 | ||
9 | local getinfo, error, rawset, rawget = debug.getinfo, error, rawset, rawget | |
10 | ||
11 | local mt = getmetatable(_G) | |
12 | if mt == nil then | |
13 | mt = {} | |
14 | setmetatable(_G, mt) | |
15 | end | |
16 | ||
17 | mt.__declared = {} | |
18 | ||
19 | local function what () | |
20 | local d = getinfo(3, "S") | |
21 | return d and d.what or "C" | |
22 | end | |
23 | ||
24 | mt.__newindex = function (t, n, v) | |
25 | if not mt.__declared[n] then | |
26 | local w = what() | |
27 | if w ~= "main" and w ~= "C" then | |
28 | error("assign to undeclared variable '"..n.."'", 2) | |
29 | end | |
30 | mt.__declared[n] = true | |
31 | end | |
32 | rawset(t, n, v) | |
33 | end | |
34 | ||
35 | mt.__index = function (t, n) | |
36 | if not mt.__declared[n] and what() ~= "C" then | |
37 | error("variable '"..n.."' is not declared", 2) | |
38 | end | |
39 | return rawget(t, n) | |
40 | end | |
41 |