elua lib: manage bound modules within Elua_State
authorDaniel Kolesa <d.kolesa@samsung.com>
Thu, 9 Apr 2015 15:12:15 +0000 (16:12 +0100)
committerDaniel Kolesa <d.kolesa@osg.samsung.com>
Wed, 6 May 2015 14:05:19 +0000 (15:05 +0100)
src/bin/elua/main.c
src/lib/elua/Elua.h
src/lib/elua/elua.c
src/lib/elua/elua_private.h

index d3655df..44113c3 100644 (file)
@@ -34,7 +34,6 @@ enum
    ARG_LIBDIR
 };
 
-static Eina_List   *elua_modlist     = NULL;
 static int          elua_require_ref = LUA_REFNIL;
 static int          elua_appload_ref = LUA_REFNIL;
 static const char  *elua_progname    = NULL;
@@ -106,23 +105,6 @@ elua_getargs(Elua_State *es, int argc, char **argv, int n)
 }
 
 static int
-elua_init_module(lua_State *L)
-{
-   if (!lua_isnoneornil(L, 1))
-     {
-        lua_pushvalue(L, 1);
-        lua_call(L, 0, 0);
-     }
-   if (!lua_isnoneornil(L, 2))
-     {
-        lua_pushvalue(L, 2);
-        elua_modlist = eina_list_append(elua_modlist,
-           (void*)(size_t)luaL_ref(L, LUA_REGISTRYINDEX));
-     }
-   return 0;
-}
-
-static int
 elua_register_require(lua_State *L)
 {
    const char *corepath = elua_state_core_dir_get(elua_state);
@@ -279,17 +261,8 @@ elua_doscript(Elua_State *es, int argc, char **argv, int n, int *quit)
 void
 elua_bin_shutdown(Elua_State *es, int c)
 {
-   void *data;
    INF("elua shutdown");
-
-   if (es) EINA_LIST_FREE(elua_modlist, data)
-     {
-        lua_rawgeti(elua_state_lua_state_get(es), LUA_REGISTRYINDEX, (size_t)data);
-        lua_call(elua_state_lua_state_get(es), 0, 0);
-     }
-
    if (elua_prefix) eina_prefix_free(elua_prefix);
-
    if (es) elua_state_free(es);
    if (_el_log_domain != EINA_LOG_DOMAIN_GLOBAL)
      eina_log_domain_unregister(_el_log_domain);
@@ -307,7 +280,7 @@ struct Main_Data
 
 const luaL_reg cutillib[] =
 {
-   { "init_module", elua_init_module },
+   { "init_module", elua_module_init },
    { "popenv"     , elua_io_popen    },
    { NULL         , NULL             }
 };
index 0b452cf..b72ada5 100644 (file)
@@ -87,6 +87,7 @@ EAPI int elua_io_loadfile(const Elua_State *es, const char *fname);
 EAPI void elua_io_register(const Elua_State *es);
 
 EAPI int elua_io_popen(lua_State *L);
+EAPI int elua_module_init(lua_State *L);
 
 #endif
 
index f14dc29..3ab2448 100644 (file)
@@ -81,7 +81,18 @@ EAPI void
 elua_state_free(Elua_State *es)
 {
    if (!es) return;
-   if (es->luastate) lua_close(es->luastate);
+   if (es->luastate)
+     {
+        void *data;
+        EINA_LIST_FREE(es->cmods, data)
+          {
+             lua_rawgeti(es->luastate, LUA_REGISTRYINDEX, (size_t)data);
+             lua_call(es->luastate, 0, 0);
+          }
+        lua_close(es->luastate);
+     }
+   else if (es->cmods)
+     eina_list_free(es->cmods);
    eina_stringshare_del(es->coredir);
    eina_stringshare_del(es->moddir);
    eina_stringshare_del(es->appsdir);
@@ -211,3 +222,21 @@ elua_state_setup_i18n(const Elua_State *es)
    lua_setfield(es->luastate, -2, "dngettext");
 #endif
 }
+
+EAPI int
+elua_module_init(lua_State *L)
+{
+   Elua_State *es = elua_state_from_lua_get(L);
+   if (!lua_isnoneornil(L, 1))
+     {
+        lua_pushvalue(L, 1);
+        lua_call(L, 0, 0);
+     }
+   if (!lua_isnoneornil(L, 2))
+     {
+        lua_pushvalue(L, 2);
+        es->cmods = eina_list_append(es->cmods,
+           (void*)(size_t)luaL_ref(L, LUA_REGISTRYINDEX));
+     }
+   return 0;
+}
index 5c63488..722d3f2 100644 (file)
@@ -33,6 +33,7 @@ struct _Elua_State
    Eina_Stringshare *coredir;
    Eina_Stringshare *moddir;
    Eina_Stringshare *appsdir;
+   Eina_List *cmods;
 };
 
 extern int _elua_log_dom;