onefang pushed a commit to branch master.

commit d6b3e8848a6aaa132e4211c4a6bf2e764a74bcc6
Author: David Walter Seikel <[email protected]>
Date:   Wed May 22 12:55:41 2013 +1000

    Stop leaking evas objects in Lua.
    
    Bug and test case reported by Leif Middelschulte.
---
 src/lib/edje/edje_lua2.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/src/lib/edje/edje_lua2.c b/src/lib/edje/edje_lua2.c
index ec5d48a..8bb7f02 100644
--- a/src/lib/edje/edje_lua2.c
+++ b/src/lib/edje/edje_lua2.c
@@ -327,9 +327,13 @@ _elua_obj_new(lua_State *L, Edje *ed, int size, const char 
*metatable)  // Stack
 }
 
 static void
-_elua_obj_free(lua_State *L EINA_UNUSED, Edje_Lua_Obj *obj)
+_elua_obj_free(lua_State *L, Edje_Lua_Obj *obj)
 {
    if (!obj->free_func) return;
+   // Free the reference, so it will actually get gc'd.
+   // It seems that being a completely weak table isn't enough.
+   lua_pushnil(L);                                  // Stack usage [-0, +1, -]
+   _elua_ref_set(L, obj);                           // Stack usage [-4, +4, m]
    obj->free_func(obj);
    obj->ed->lua_objs = eina_inlist_remove(obj->ed->lua_objs, 
EINA_INLIST_GET(obj));
    obj->free_func = NULL;
@@ -3888,7 +3892,7 @@ _elua_init(void)
    lua_pushlightuserdata(L, &_elua_objs);                                      
            // Stack usage [-0, +1, -]
    lua_newtable(L);                                                            
            // Stack usage [-0, +1, m]
    lua_pushstring(L, "__mode");                                                
            // Stack usage [-0, +1, m]
-   lua_pushstring(L, "v");                                                     
            // Stack usage [-0, +1, m]
+   lua_pushstring(L, "kv");                                                    
            // Stack usage [-0, +1, m]
    lua_rawset(L, -3);                                                          
            // Stack usage [-2, +0, m]
    lua_rawset(L, LUA_REGISTRYINDEX);                                           
            // Stack usage [-2, +0, m]
 }
@@ -3978,7 +3982,7 @@ _edje_lua2_script_init(Edje *ed)                          
        // Stack usage
    lua_pushlightuserdata(L, &_elua_objs);                         // Stack 
usage [-0, +1, -]
    lua_newtable(L);                                               // Stack 
usage [-0, +1, m]
    lua_pushstring(L, "__mode");                                   // Stack 
usage [-0, +1, m]
-   lua_pushstring(L, "v");                                        // Stack 
usage [-0, +1, m]
+   lua_pushstring(L, "kv");                                       // Stack 
usage [-0, +1, m]
    lua_rawset(L, -3);                                             // Stack 
usage [-2, +0, m]
    lua_rawset(L, LUA_REGISTRYINDEX);                              // Stack 
usage [-2, +0, m]
 

-- 

------------------------------------------------------------------------------
Try New Relic Now & We'll Send You this Cool Shirt
New Relic is the only SaaS-based application performance monitoring service 
that delivers powerful full stack analytics. Optimize and monitor your
browser, app, & servers with just a few lines of code. Try New Relic
and get this awesome Nerd Life shirt! http://p.sf.net/sfu/newrelic_d2d_may

Reply via email to