diff options
author | Carsten Haitzler (Rasterman) <raster@rasterman.com> | 2017-11-23 18:07:01 +0900 |
---|---|---|
committer | Carsten Haitzler (Rasterman) <raster@rasterman.com> | 2017-11-24 18:29:23 +0900 |
commit | 6587613a5810188378d52191fbc12ba44394b607 (patch) | |
tree | 536cba3dfbad0253c448ef8bcdc8e368baba2694 /src/lib/elua | |
parent | e0f4455eaac5947306144afca9c54f7d145fd140 (diff) |
elua - use safeptr with lightuserdata to work around luajit 64bit issue
luajit only supports 47bits on 64bit for lightuser data (bad! don't
mess with opaque pointers... really unexpected and bad and probably
should be fixed in luajit by doing things like on 32bit where
pointers are not messed with etc.)
Diffstat (limited to 'src/lib/elua')
-rw-r--r-- | src/lib/elua/elua.c | 26 | ||||
-rw-r--r-- | src/lib/elua/elua_private.h | 1 |
2 files changed, 13 insertions, 14 deletions
diff --git a/src/lib/elua/elua.c b/src/lib/elua/elua.c index 2d9eebe3c3..44b5c32c59 100644 --- a/src/lib/elua/elua.c +++ b/src/lib/elua/elua.c | |||
@@ -70,6 +70,7 @@ EAPI Elua_State * | |||
70 | elua_state_new(const char *progname) | 70 | elua_state_new(const char *progname) |
71 | { | 71 | { |
72 | Elua_State *ret = NULL; | 72 | Elua_State *ret = NULL; |
73 | Eina_Safepointer *sp; | ||
73 | lua_State *L = luaL_newstate(); | 74 | lua_State *L = luaL_newstate(); |
74 | if (!L) | 75 | if (!L) |
75 | return NULL; | 76 | return NULL; |
@@ -77,7 +78,9 @@ elua_state_new(const char *progname) | |||
77 | ret->luastate = L; | 78 | ret->luastate = L; |
78 | if (progname) ret->progname = eina_stringshare_add(progname); | 79 | if (progname) ret->progname = eina_stringshare_add(progname); |
79 | luaL_openlibs(L); | 80 | luaL_openlibs(L); |
80 | lua_pushlightuserdata(L, ret); | 81 | sp = (Eina_Safepointer *)eina_safepointer_register(ret); |
82 | ret->sp = sp; | ||
83 | lua_pushlightuserdata(L, sp); | ||
81 | lua_setfield(L, LUA_REGISTRYINDEX, "elua_ptr"); | 84 | lua_setfield(L, LUA_REGISTRYINDEX, "elua_ptr"); |
82 | return ret; | 85 | return ret; |
83 | } | 86 | } |
@@ -106,6 +109,7 @@ elua_state_free(Elua_State *es) | |||
106 | eina_stringshare_del(es->coredir); | 109 | eina_stringshare_del(es->coredir); |
107 | eina_stringshare_del(es->moddir); | 110 | eina_stringshare_del(es->moddir); |
108 | eina_stringshare_del(es->appsdir); | 111 | eina_stringshare_del(es->appsdir); |
112 | eina_safepointer_unregister(es->sp); | ||
109 | free(es); | 113 | free(es); |
110 | } | 114 | } |
111 | 115 | ||
@@ -260,7 +264,8 @@ elua_state_from_lua_state_get(lua_State *L) | |||
260 | lua_getfield(L, LUA_REGISTRYINDEX, "elua_ptr"); | 264 | lua_getfield(L, LUA_REGISTRYINDEX, "elua_ptr"); |
261 | if (!lua_isnil(L, -1)) | 265 | if (!lua_isnil(L, -1)) |
262 | { | 266 | { |
263 | void *st = lua_touserdata(L, -1); | 267 | Eina_Safepointer *sp = lua_touserdata(L, -1); |
268 | void *st = eina_safepointer_get(sp); | ||
264 | lua_pop(L, 1); | 269 | lua_pop(L, 1); |
265 | return (Elua_State *)st; | 270 | return (Elua_State *)st; |
266 | } | 271 | } |
@@ -360,17 +365,16 @@ const luaL_Reg gettextlib[] = | |||
360 | { "bind_textdomain", _elua_gettext_bind_textdomain }, | 365 | { "bind_textdomain", _elua_gettext_bind_textdomain }, |
361 | { "get_message_language", _elua_get_message_language }, | 366 | { "get_message_language", _elua_get_message_language }, |
362 | { "get_localeconv", _elua_get_localeconv }, | 367 | { "get_localeconv", _elua_get_localeconv }, |
368 | #ifdef ENABLE_NLS | ||
369 | { "dgettext", dgettext }, | ||
370 | { "dgettext", dngettext }, | ||
371 | #endif | ||
363 | { NULL, NULL } | 372 | { NULL, NULL } |
364 | }; | 373 | }; |
365 | 374 | ||
366 | static Eina_Bool | 375 | static Eina_Bool |
367 | _elua_state_i18n_setup(const Elua_State *es) | 376 | _elua_state_i18n_setup(Elua_State *es) |
368 | { | 377 | { |
369 | #ifdef ENABLE_NLS | ||
370 | char *(*dgettextp)(const char*, const char*) = dgettext; | ||
371 | char *(*dngettextp)(const char*, const char*, const char*, unsigned long) | ||
372 | = dngettext; | ||
373 | #endif | ||
374 | char buf[PATH_MAX]; | 378 | char buf[PATH_MAX]; |
375 | EINA_SAFETY_ON_NULL_RETURN_VAL(es, EINA_FALSE); | 379 | EINA_SAFETY_ON_NULL_RETURN_VAL(es, EINA_FALSE); |
376 | EINA_SAFETY_ON_NULL_RETURN_VAL(es->coredir, EINA_FALSE); | 380 | EINA_SAFETY_ON_NULL_RETURN_VAL(es->coredir, EINA_FALSE); |
@@ -380,12 +384,6 @@ _elua_state_i18n_setup(const Elua_State *es) | |||
380 | return EINA_FALSE; | 384 | return EINA_FALSE; |
381 | lua_createtable(es->luastate, 0, 0); | 385 | lua_createtable(es->luastate, 0, 0); |
382 | luaL_register(es->luastate, NULL, gettextlib); | 386 | luaL_register(es->luastate, NULL, gettextlib); |
383 | #ifdef ENABLE_NLS | ||
384 | lua_pushlightuserdata(es->luastate, *((void**)&dgettextp)); | ||
385 | lua_setfield(es->luastate, -2, "dgettext"); | ||
386 | lua_pushlightuserdata(es->luastate, *((void**)&dngettextp)); | ||
387 | lua_setfield(es->luastate, -2, "dngettext"); | ||
388 | #endif | ||
389 | lua_call(es->luastate, 1, 0); | 387 | lua_call(es->luastate, 1, 0); |
390 | return EINA_TRUE; | 388 | return EINA_TRUE; |
391 | } | 389 | } |
diff --git a/src/lib/elua/elua_private.h b/src/lib/elua/elua_private.h index f4392f604b..1fd955c3ea 100644 --- a/src/lib/elua/elua_private.h +++ b/src/lib/elua/elua_private.h | |||
@@ -40,6 +40,7 @@ struct _Elua_State | |||
40 | Eina_List *lmods; | 40 | Eina_List *lmods; |
41 | Eina_List *cmods; | 41 | Eina_List *cmods; |
42 | Eina_List *lincs; | 42 | Eina_List *lincs; |
43 | Eina_Safepointer *sp; | ||
43 | int requireref, apploadref; | 44 | int requireref, apploadref; |
44 | }; | 45 | }; |
45 | 46 | ||