elua: fix object system on lua 5.2 onwards

This is a quick hacky fix, but it enables elua to work well with
lua 5.2+. Notably Eolian bindings work now.

Later this will be rewritten to use __gc directly on object
instances, with a fallback for newproxy for 5.1/luajit.
This commit is contained in:
Daniel Kolesa 2020-05-31 03:39:49 +02:00
parent 38bf0be7d0
commit b953b99a66
1 changed files with 12 additions and 3 deletions

View File

@ -13,6 +13,17 @@ local M = {}
local getmetatable, setmetatable = getmetatable, setmetatable
local dgetmt = debug.getmetatable
local newproxy = newproxy
if not newproxy then
-- tables can have __gc from 5.2
newproxy = function(b)
if b then
return setmetatable({}, {})
end
return {}
end
end
-- multiple inheritance index with depth-first search
local proto_lookup = function(protos, name)
@ -98,8 +109,6 @@ M.Object = {
end
}
local newproxy = newproxy
local robj_gc = function(px)
local dtor = px.__dtor
if dtor then dtor(px) end
@ -108,7 +117,7 @@ end
M.Readonly_Object = M.Object:clone {}
M.Readonly_Object.__call = function(self, ...)
local r = newproxy(true)
local rmt = getmetatable(r)
local rmt = dgetmt(r)
rmt.__index = self
rmt.__tostring = Object_MT.__tostring
rmt.__metatable = false