elua: fix object system on lua 5.2 onwards
authorDaniel Kolesa <d.kolesa@samsung.com>
Sun, 31 May 2020 01:39:49 +0000 (03:39 +0200)
committerJongmin Lee <jm105.lee@samsung.com>
Sun, 31 May 2020 21:37:04 +0000 (06:37 +0900)
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

index 019a424..b184921 100644 (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