diff --git a/src/bin/elua/core/util.lua b/src/bin/elua/core/util.lua index 93c2152e4a..6f02fdf5e1 100644 --- a/src/bin/elua/core/util.lua +++ b/src/bin/elua/core/util.lua @@ -4,6 +4,8 @@ local ffi = require("ffi") local M = {} +local getmetatable, setmetatable = getmetatable, setmetatable + M.Object = { __call = function(self, ...) local r = { @@ -41,6 +43,20 @@ M.Object = { end } +local newproxy = newproxy + +M.Readonly_Object = Object:clone { + __call = function(self, ...) + local r = newproxy(true) + local rmt = getmetatable(r) + rmt.__index = self + rmt.__tostring = self.__tostring + rmt.__metatable = false + if self.__ctor then self.__ctor(r, rmt, ...) end + return r + end +} + local loaded_libs = {} local loaded_libc = {} diff --git a/src/bindings/luajit/eina/list.lua b/src/bindings/luajit/eina/list.lua index a21d11e005..2ed279b2ca 100644 --- a/src/bindings/luajit/eina/list.lua +++ b/src/bindings/luajit/eina/list.lua @@ -168,65 +168,76 @@ local List = ffi.metatype("Eina_List", { } }) -local List_Base = util.Object:clone { - __ctor = function(self, list, freefunc) +local dgetmt = debug.getmetatable + +local List_Base = util.Readonly_Object:clone { + __ctor = function(self, selfmt, list, freefunc) if list and freefunc then list = ffi.gc(list, freefunc) - self.__free = freefunc + selfmt.__free = freefunc end if list == nil then return end - self.__list = list + selfmt.__list = list end, free = function(self) + self = dgetmt(self) local ffunc, l = self.__free, self.__list if not ffunc or l == nil then return end ffunc(ffi.gc(self.__list, nil)) end, count = function(self) + self = dgetmt(self) local l = self.__list if l == nil then return 0 end return #l end, nth = function(self, n) + self = dgetmt(self) local l = self.__list if l == nil then return nil end return l:nth() end, nth_list = function(self, n) + self = dgetmt(self) local l = self.__list if l == nil then return nil end return self.__index(l:nth_list()) end, last = function(self, n) + self = dgetmt(self) local l = self.__list if l == nil then return nil end return self.__index(l:last()) end, next = function(self, n) + self = dgetmt(self) local l = self.__list if l == nil then return nil end return self.__index(l:next()) end, prev = function(self, n) + self = dgetmt(self) local l = self.__list if l == nil then return nil end return self.__index(l:prev()) end, data_get = function(self, ptr) + self = dgetmt(self) local l = self.__list if l == nil then return nil end return l:data_get(ptr) end, to_array = function(self) + self = dgetmt(self) local l = self.__list if l == nil then return {}, 0 end local n = 0 @@ -246,7 +257,7 @@ M.List_Base = List_Base M.String_List = List_Base:clone { data_get = function(self, ptr) - ptr = List_Base:data_get(ptr) + ptr = List_Base.data_get(self, ptr) return ffi.string(ptr) end } diff --git a/src/bindings/luajit/eolian.lua b/src/bindings/luajit/eolian.lua index 45f2528483..d6438a48ce 100644 --- a/src/bindings/luajit/eolian.lua +++ b/src/bindings/luajit/eolian.lua @@ -183,7 +183,7 @@ local List_Base = list.List_Base local Eolian_Functions_List = List_Base:clone { data_get = function(self, ptr) - ptr = List_Base:data_get(ptr) + ptr = List_Base.data_get(self, ptr) return ffi.cast("Eolian_Function", ptr) end } @@ -224,7 +224,7 @@ end local Eolian_Parameters_List = List_Base:clone { data_get = function(self, ptr) - ptr = List_Base:data_get(ptr) + ptr = List_Base.data_get(self, ptr) return ffi.cast("Eolian_Function_Parameter", ptr) end } @@ -367,7 +367,7 @@ ffi.metatype("Eolian_Function_Parameter", { local Eolian_Implements_List = List_Base:clone { data_get = function(self, ptr) - ptr = List_Base:data_get(ptr) + ptr = List_Base.data_get(self, ptr) return ffi.cast("Eolian_Implement", ptr) end } @@ -393,7 +393,7 @@ end local Eolian_Events_List = List_Base:clone { data_get = function(self, ptr) - ptr = List_Base:data_get(ptr) + ptr = List_Base.data_get(self, ptr) return ffi.cast("Eolian_Event", ptr) end }