|
|
Line 1: |
Line 1: |
| -- <pre>
| |
| --------------------------------------------------------------------------------
| |
| --- No globals prevents nil global variables from being written to or read.
| |
| -- This module greatly reduces the chance of errors from overriding globals.
| |
| --
| |
| -- To use the module, add the following code below your module table
| |
| -- definition:
| |
| --
| |
| -- {{#tag:pre|require('Module:No globals')}}

| |
| --
| |
| -- The @{require} function sets the `arg` global in the package library when
| |
| -- loading a module - see the [source code](https://git.io/JfKu8) in Scribunto
| |
| -- core. To ensure Scribunto can load modules, the `arg` global is whitelisted.
| |
| --
| |
| -- @script getmetatable(_G)
| |
| -- @alias mt
| |
| -- @release stable
| |
| -- @author [[wikipedia:User:Jackmcbarn|Jackmcbarn]] (Wikipedia)
| |
| -- @author [[User:Dessamator|Dessamator]]
| |
| -- @attribution [[wikipedia:Module:No globals|Wikipedia]]
| |
| -- @todo Remove `name` exception in all metamethods. On Fandom,
| |
| -- legacy Scribunto has a typo in the package library
| |
| -- where `name` is accessed instead of `modname` - see
| |
| -- the [source code](https://git.io/JfKzh). This bug was
| |
| -- fixed in MediaWiki 1.23
| |
| -- (see [this commit](https://git.io/JUilh)).
| |
| local mt = getmetatable(_G) or {} | | local mt = getmetatable(_G) or {} |
| | | function mt.__index (t, k) |
| -- begin dev wikia change
| | if k ~= 'arg' then |
| local siteVersion = mw.site.currentVersion
| | error('Tried to read nil global ' .. tostring(k), 2) |
| local isNameDisallowed = tonumber(siteVersion:match('^%d%.%d+')) >= 1.23
| | end |
| -- end dev wikia change
| | return nil |
| | |
| --- Read access restriction on @{_G} global table.
| |
| -- @function mt.__index
| |
| -- @param {table} t Global table - @{_G}.
| |
| -- @param k Indexed key.
| |
| -- @error[opt,28] {string} 'tried to read nil global $k'
| |
| function mt.__index(t, k) | |
| -- begin dev wikia change
| |
| if k ~= 'arg' and (isNameDisallowed or k ~= 'name') then
| |
| -- end dev wikia change
| |
| error('Tried to read nil global ' .. tostring(k), 2)
| |
| end
| |
| return nil
| |
| end | | end |
|
| |
| --- Write access restriction on @{_G} global table.
| |
| -- @function mt.__newindex
| |
| -- @param {table} t Global table - @{_G}.
| |
| -- @param k Indexed key.
| |
| -- @param v Value to be assigned.
| |
| -- @error[opt,42] {string} 'tried to write global $k'
| |
| function mt.__newindex(t, k, v) | | function mt.__newindex(t, k, v) |
| -- begin dev wikia change
| | if k ~= 'arg' then |
| if k ~= 'arg' and (isNameDisallowed or k ~= 'name') then
| | error('Tried to write global ' .. tostring(k), 2) |
| -- end dev wikia change
| | end |
| error('Tried to write global ' .. tostring(k), 2)
| | rawset(t, k, v) |
| end
| |
| rawset(t, k, v)
| |
| end | | end |
|
| |
| setmetatable(_G, mt) | | setmetatable(_G, mt) |
Documentation for this module may be created at Module:No globals/doc
local mt = getmetatable(_G) or {}
function mt.__index (t, k)
if k ~= 'arg' then
error('Tried to read nil global ' .. tostring(k), 2)
end
return nil
end
function mt.__newindex(t, k, v)
if k ~= 'arg' then
error('Tried to write global ' .. tostring(k), 2)
end
rawset(t, k, v)
end
setmetatable(_G, mt)