Merge pull request #26 from andreashofer123/process

fix problem with recursive tables when using the 'process' option
This commit is contained in:
Enrique García 2016-04-04 01:41:02 +02:00
commit 833b0bc183
2 changed files with 28 additions and 18 deletions

View File

@ -164,22 +164,25 @@ local function makePath(path, ...)
return newPath return newPath
end end
local function processRecursive(process, item, path) local function processRecursive(process, item, path, visited)
if item == nil then return nil end if item == nil then return nil end
if visited[item] then return visited[item] end
local processed = process(item, path) local processed = process(item, path)
if type(processed) == 'table' then if type(processed) == 'table' then
local processedCopy = {} local processedCopy = {}
visited[item] = processedCopy
local processedKey local processedKey
for k,v in pairs(processed) do for k,v in pairs(processed) do
processedKey = processRecursive(process, k, makePath(path, k, inspect.KEY)) processedKey = processRecursive(process, k, makePath(path, k, inspect.KEY), visited)
if processedKey ~= nil then if processedKey ~= nil then
processedCopy[processedKey] = processRecursive(process, v, makePath(path, processedKey)) processedCopy[processedKey] = processRecursive(process, v, makePath(path, processedKey), visited)
end end
end end
local mt = processRecursive(process, getmetatable(processed), makePath(path, inspect.METATABLE)) local mt = processRecursive(process, getmetatable(processed), makePath(path, inspect.METATABLE), visited)
setmetatable(processedCopy, mt) setmetatable(processedCopy, mt)
processed = processedCopy processed = processedCopy
end end
@ -187,6 +190,7 @@ local function processRecursive(process, item, path)
end end
------------------------------------------------------------------- -------------------------------------------------------------------
local Inspector = {} local Inspector = {}
@ -315,7 +319,7 @@ function inspect.inspect(root, options)
local process = options.process local process = options.process
if process then if process then
root = processRecursive(process, root, {}) root = processRecursive(process, root, {}, {})
end end
local inspector = setmetatable({ local inspector = setmetatable({

View File

@ -315,6 +315,12 @@ describe( 'inspect', function()
}, items) }, items)
end) end)
it('handles recursive tables correctly', function()
local tbl = { 1,2,3}
tbl.loop = tbl
inspect(tbl, { process=function(x) return x end})
end)
end) end)
describe('metatables', function() describe('metatables', function()