fixed metatable-related loop when a table is its own index. References #4

This commit is contained in:
kikito 2013-01-21 00:49:22 +01:00
parent 1514d86828
commit 2b502e1a81
2 changed files with 18 additions and 6 deletions

View File

@ -64,7 +64,7 @@ local function getDictionaryKeys(t)
end end
local function getToStringResultSafely(t, mt) local function getToStringResultSafely(t, mt)
local __tostring = type(mt) == 'table' and mt.__tostring local __tostring = type(mt) == 'table' and rawget(mt, '__tostring')
local string, status local string, status
if type(__tostring) == 'function' then if type(__tostring) == 'function' then
status, string = pcall(__tostring, t) status, string = pcall(__tostring, t)

View File

@ -192,6 +192,7 @@ describe( 'inspect', function()
}]]) }]])
end) end)
describe('When a table is its own metatable', function()
it('accepts a table that is its own metatable without stack overflowing', function() it('accepts a table that is its own metatable without stack overflowing', function()
local x = {} local x = {}
setmetatable(x,x) setmetatable(x,x)
@ -200,6 +201,17 @@ describe( 'inspect', function()
}]]) }]])
end) end)
it('can invoke the __tostring method without stack overflowing', function()
local t = {}
t.__index = t
setmetatable(t,t)
assert.equals(inspect(t), [[<1>{
__index = <table 1>,
<metatable> = <table 1>
}]])
end)
end)
end) end)
end) end)
end) end)