From b953b99a6607535a860269d835b8447ea9497508 Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Sun, 31 May 2020 03:39:49 +0200 Subject: [PATCH] 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. --- src/scripts/elua/core/util.lua | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/scripts/elua/core/util.lua b/src/scripts/elua/core/util.lua index 019a424e61..b184921b33 100644 --- a/src/scripts/elua/core/util.lua +++ b/src/scripts/elua/core/util.lua @@ -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