Content deleted Content added
add a comment to warn future coders about the pairs problem |
memoize nils to a separate nilArgs table |
||
Line 7:
local arguments = {}
-- Generate four different tidyVal functions, so that we don't have to check the
Line 76 ⟶ 74:
luaArgs = frame
end
-- Set
--
--
local
argTables[#argTables + 1] = pargs▼
setmetatable(args, metatable)▼
argTables[#argTables + 1] = luaArgs▼
--[[
Line 113 ⟶ 112:
end
end
--[[
-- Set up the args, metaArgs and nilArgs tables. args will be the one
-- accessed from functions, and metaArgs will hold the actual arguments. Nil
-- arguments are memoized in nilArgs, and the metatable connects all of them
-- together.
local args, metaArgs, nilArgs, metatable = {}, {}, {}, {}
▲ setmetatable(args, metatable)
local function mergeArgs(iterator, tables)
Line 124 ⟶ 132:
for _, t in ipairs(tables) do
for key, val in iterator(t) do
local tidiedVal = tidyVal(key, val)
if tidiedVal == nil then
else
metaArgs[key] = tidiedVal
Line 136 ⟶ 143:
end
end
▲ argTables[#argTables + 1] = pargs
▲ argTables[#argTables + 1] = luaArgs
--[[
-- Define metatable behaviour. Arguments are memoized in the metaArgs table,
-- and are only fetched from the argument tables once. Nil arguments are
-- also memoized using the
-- Also, we keep a record in the metatable of when pairs and ipairs have
-- been called, so we do not run pairs and ipairs on fargs and pargs more
Line 157:
metatable.__index = function (t, key)
local val = metaArgs[key]
if
▲ --]]
▲ return nil
end
for _, argTable in ipairs(argTables) do
local argTableVal = tidyVal(key, argTable[key])
if argTableVal == nil then
else
metaArgs[key] = argTableVal
Line 201 ⟶ 190:
)
elseif val == nil then
else
metaArgs[key] = val
Line 213 ⟶ 202:
metatable.doneIpairs = true
end
return
end
Line 227 ⟶ 210:
metatable.doneIpairs = true
end
return
▲ elseif val == nilArg then
end
|