elua: safe iterators
authorDaniel Kolesa <quaker66@gmail.com>
Mon, 14 Apr 2014 08:47:24 +0000 (09:47 +0100)
committerDaniel Kolesa <d.kolesa@samsung.com>
Tue, 10 Jun 2014 14:48:47 +0000 (15:48 +0100)
src/bindings/luajit/eina/file.lua
src/bindings/luajit/eina/iterator.lua
src/bindings/luajit/eina/list.lua
src/bindings/luajit/eina/tiler.lua
src/bindings/luajit/eina/xattr.lua

index 335714e..3130ae6 100644 (file)
@@ -155,8 +155,8 @@ end
 local Iterator = iterator.Iterator
 
 M.Ls_Iterator = Iterator:clone {
-    __ctor = function(self, dir)
-        return Iterator.__ctor(self, eina.eina_file_ls(dir))
+    __ctor = function(self, selfmt, dir)
+        return Iterator.__ctor(self, selfmt, eina.eina_file_ls(dir))
     end,
 
     next = function(self)
@@ -215,8 +215,8 @@ local direct_info_iterator_next = function(self)
 end
 
 M.Stat_Ls_Iterator = Iterator:clone {
-    __ctor = function(self, dir)
-        return Iterator.__ctor(self, eina.eina_file_stat_ls(dir))
+    __ctor = function(self, selfmt, dir)
+        return Iterator.__ctor(self, selfmt, eina.eina_file_stat_ls(dir))
     end,
     next = direct_info_iterator_next
 }
@@ -224,8 +224,8 @@ M.Stat_Ls_Iterator = Iterator:clone {
 M.stat_ls = M.Stat_Ls_Iterator
 
 M.Direct_Ls_Iterator = Iterator:clone {
-    __ctor = function(self, dir)
-        return Iterator.__ctor(self, eina.eina_file_direct_ls(dir))
+    __ctor = function(self, selfmt, dir)
+        return Iterator.__ctor(self, selfmt, eina.eina_file_direct_ls(dir))
     end,
     next = direct_info_iterator_next
 }
@@ -259,8 +259,8 @@ M.copy = function(source, destination, flags, cb)
 end
 
 M.Xattr_Iterator = Iterator:clone {
-    __ctor = function(self, file)
-        return Iterator.__ctor(self, eina.eina_file_xattr_get(file))
+    __ctor = function(self, selfmt, file)
+        return Iterator.__ctor(self, selfmt, eina.eina_file_xattr_get(file))
     end,
     next = function(self)
         local  v = Iterator.next(self)
@@ -270,8 +270,9 @@ M.Xattr_Iterator = Iterator:clone {
 }
 
 M.Xattr_Value_Iterator = Iterator:clone {
-    __ctor = function(self, file)
-        return Iterator.__ctor(self, eina.eina_file_xattr_value_get(file))
+    __ctor = function(self, selfmt, file)
+        return Iterator.__ctor(self, selfmt,
+            eina.eina_file_xattr_value_get(file))
     end,
     next = function(self)
         local  v = Iterator.next(self)
@@ -291,8 +292,8 @@ M.populate     = {
 }
 
 M.Line_Iterator = Iterator:clone {
-    __ctor = function(self, file)
-        return Iterator.__ctor(self, eina.eina_file_map_lines(file))
+    __ctor = function(self, selfmt, file)
+        return Iterator.__ctor(self, selfmt, eina.eina_file_map_lines(file))
     end,
     next = function(self)
         local  v = Iterator.next(self)
index 11b81da..4f42530 100644 (file)
@@ -51,53 +51,49 @@ ffi.metatype("Eina_Iterator", {
 
 cutil.init_module(init, shutdown)
 
-M.Iterator = util.Object:clone {
-    __ctor = function(self, iter)
+local dgetmt = debug.getmetatable
+
+M.Iterator = util.Readonly_Object:clone {
+    __ctor = function(self, selfmt, iter)
         -- prevent null stuff
         if iter == nil then iter = nil end
         if iter then ffi.gc(iter, iter.free) end
-        self.__eq = function(self, other)
-            return self.__iterator == other.__iterator
+        selfmt.__eq = function(self, other)
+            return selfmt.__iterator == dgetmt(other).__iterator
         end
-        self.__call = function(self)
+        selfmt.__call = function(self)
             return self:next()
         end
-        self.__iterator = iter
+        selfmt.__iterator = iter
     end,
 
     free = function(self)
+        self = dgetmt(self)
         if not self.__iterator then return end
         self.__iterator:free()
         self.__iterator = nil
     end,
 
-    disown = function(self)
-        local iter = self.__iterator
-        self.__iterator = nil
-        return ier
-    end,
-
-    rebase = function(self, iter)
-        self:free()
-        self.__iterator = iter:disown()
-    end,
-
     next = function(self)
+        self = dgetmt(self)
         if not self.__iterator then return nil end
         return self.__iterator:next()
     end,
 
     lock = function(self)
+        self = dgetmt(self)
         if not self.__iterator then return false end
         return self.__iterator:lock()
     end,
 
     unlock = function(self)
+        self = dgetmt(self)
         if not self.__iterator then return false end
         return self.__iterator:unlock()
     end,
 
     container_get = function(self)
+        self = dgetmt(self)
         if not self.__iterator then return nil end
         return self.__iterator:container_get()
     end
index ef2d39b..e6586d2 100644 (file)
@@ -77,10 +77,14 @@ cutil.init_module(init, shutdown)
 
 local Iterator = iterator.Iterator
 
+local dgetmt = debug.getmetatable
+
 M.Iterator = Iterator:clone {
-    __ctor = function(self, list)
-        self.__list = list
-        return Iterator.__ctor(self, eina.eina_list_iterator_new(list.__list))
+    __ctor = function(self, selfmt, list)
+        if list == nil then return Iterator.__ctor(self, selfmt, nil) end
+        selfmt.__list = list
+        return Iterator.__ctor(self, selfmt,
+            eina.eina_list_iterator_new(dgetmt(list).__list))
     end,
 
     next = function(self)
@@ -91,10 +95,11 @@ M.Iterator = Iterator:clone {
 }
 
 M.Reverse_Iterator = Iterator:clone {
-    __ctor = function(self, list)
-        self.__list = list
-        return Iterator.__ctor(self, eina.eina_list_iterator_reversed_new(
-            list.__list))
+    __ctor = function(self, selfmt, list)
+        if list == nil then return Iterator.__ctor(self, selfmt, nil) end
+        selfmt.__list = list
+        return Iterator.__ctor(self, selfmt,
+            eina.eina_list_iterator_reversed_new(dgetmt(list).__list))
     end,
 
     next = function(self)
@@ -107,9 +112,11 @@ M.Reverse_Iterator = Iterator:clone {
 local Accessor = accessor.Accessor
 
 M.Accessor = Accessor:clone {
-    __ctor = function(self, list)
-        self.__list = list
-        return Accessor.__ctor(self, eina.eina_list_accessor_new(list.__list))
+    __ctor = function(self, selfmt, list)
+        if list == nil then return Accessor.__ctor(self, selfmt, nil) end
+        selfmt.__list = list
+        return Accessor.__ctor(self, selfmt,
+            eina.eina_list_accessor_new(dgetmt(list).__list))
     end,
 
     data_get = function(self, pos)
@@ -168,8 +175,6 @@ local List = ffi.metatype("Eina_List", {
     }
 })
 
-local dgetmt = debug.getmetatable
-
 local List_Base = util.Readonly_Object:clone {
     __ctor = function(self, selfmt, list, freefunc)
         if list and freefunc then
index 23e2592..99e4545 100644 (file)
@@ -60,11 +60,14 @@ end
 
 cutil.init_module(init, shutdown)
 
+local dgetmt = debug.getmetatable
+
 local Iterator = iterator.Iterator
 
 M.Tiler_Iterator = Iterator:clone {
-    __ctor = function(self, tiler)
-        return Iterator.__ctor(self, eina.eina_tiler_iterator_new(tiler))
+    __ctor = function(self, selfmt, tiler)
+        return Iterator.__ctor(self, selfmt,
+            eina.eina_tiler_iterator_new(tiler))
     end,
 
     next = function(self)
@@ -75,9 +78,9 @@ M.Tiler_Iterator = Iterator:clone {
 }
 
 M.Tile_Grid_Slicer_Iterator = Iterator:clone {
-    __ctor = function(self, x, y, w, h, tile_w, tile_h)
-        return Iterator.__ctor(self, eina.eina_tile_grid_slicer_iterator_new(
-            x, y, w, h, tile_w, tile_h))
+    __ctor = function(self, selfmt, x, y, w, h, tile_w, tile_h)
+        return Iterator.__ctor(self, selfmt,
+            eina.eina_tile_grid_slicer_iterator_new(x, y, w, h, tile_w, tile_h))
     end,
 
     next = function(self)
index d48d56d..de62301 100644 (file)
@@ -64,8 +64,8 @@ cutil.init_module(init, shutdown)
 local Iterator = iterator.Iterator
 
 M.Iterator = Iterator:clone {
-    __ctor = function(self, file)
-        return Iterator.__ctor(self, eina.eina_xattr_ls(file))
+    __ctor = function(self, selfmt, file)
+        return Iterator.__ctor(self, selfmt, eina.eina_xattr_ls(file))
     end,
     next = function(self)
         local  v = Iterator.next(self)
@@ -77,8 +77,8 @@ M.Iterator = Iterator:clone {
 M.ls = M.Iterator
 
 M.Value_Iterator = Iterator:clone {
-    __ctor = function(self, file)
-        return Iterator.__ctor(self, eina.eina_xattr_value_ls(file))
+    __ctor = function(self, selfmt, file)
+        return Iterator.__ctor(self, selfmt, eina.eina_xattr_value_ls(file))
     end,
     next = function(self)
         local  v = Iterator.next(self)