Karim Tarabishy
Karim Tarabishy

Reputation: 1253

infinite recursion in __index metamethod

As I understand lua don't call __index unless the key wasn't found in the table so I have that code and it suffers from infinite recursion in the __index part which I don't get as both values used inside the __index function already exist in the table!?

This is basically a test script for trying to save the size of the table in a memory to retreive when # is called

    do
local lenKey,originalKey = {},{}
fastKey = {}
fastKey.__len = function(t) return t[lenKey] end
fastKey.__index = function (t,k)  
                        t[lenKey] = t[lenKey] +1
                        return t[oroginalKey][k] 
                end
fastKey.__newindex = function(t,k,v) t[originalKey][k] = v end
fastKey.__pairs = function ()
                    return  function (t, k)
                                return next(t[oroginalKey], k)
                            end
                end

function fastLen(t)
    local proxy = {}
    local c = 0
    for _ in pairs(t) do
        c=c+1
    end
    proxy[lenKey] = c                               
    proxy[originalKey] = t                                          
    setmetatable(proxy,fastKey)
    return proxy
end
end

n = fastLen{1,2,3,x=5}
--n:insert(1) -- here the __index is called and gets stackoverflow
print(#n)

Upvotes: 3

Views: 785

Answers (1)

Martin Ender
Martin Ender

Reputation: 44289

You've got two typos in there: both the __index and __pairs functions contain oroginalKey instead of originalKey.

Upvotes: 4

Related Questions