elua lib: add elua_state_from_lua_get
authorDaniel Kolesa <d.kolesa@samsung.com>
Wed, 8 Apr 2015 13:29:58 +0000 (14:29 +0100)
committerDaniel Kolesa <d.kolesa@osg.samsung.com>
Wed, 6 May 2015 14:05:18 +0000 (15:05 +0100)
src/lib/elua/Elua.h
src/lib/elua/elua.c

index 69c72b0..2f1f41a 100644 (file)
@@ -69,6 +69,8 @@ EAPI int elua_shutdown(void);
 EAPI Elua_State *elua_state_new(void);
 EAPI void elua_state_free(Elua_State *state);
 
+EAPI Elua_State *elua_state_from_lua_get(lua_State *L);
+
 EAPI int elua_report_error(lua_State *L, const char *pname, int status);
 
 EAPI void elua_state_setup_i18n(lua_State *L);
index a6bb391..bdd5606 100644 (file)
@@ -72,6 +72,8 @@ elua_state_new(void)
    ret = malloc(sizeof(Elua_State));
    ret->luastate = L;
    luaL_openlibs(L);
+   lua_pushlightuserdata(L, ret);
+   lua_setfield(L, LUA_REGISTRYINDEX, "elua_ptr");
    return ret;
 }
 
@@ -83,6 +85,20 @@ elua_state_free(Elua_State *state)
    free(state);
 }
 
+EAPI Elua_State *
+elua_state_from_lua_get(lua_State *L)
+{
+   lua_getfield(L, LUA_REGISTRYINDEX, "elua_ptr");
+   if (!lua_isnil(L, -1))
+     {
+        void *st = lua_touserdata(L, -1);
+        lua_pop(L, 1);
+        return (Elua_State *)st;
+     }
+   lua_pop(L, 1);
+   return NULL;
+}
+
 static void
 _elua_errmsg(const char *pname, const char *msg)
 {