q66 pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=dfb5c03ce059ebb3b736309ee01cd096bdd0839a
commit dfb5c03ce059ebb3b736309ee01cd096bdd0839a Author: Daniel Kolesa <quake...@gmail.com> Date: Wed Feb 19 13:05:10 2014 +0000 edje: fix custom allocator with luajit --- src/lib/edje/edje_lua2.c | 46 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/src/lib/edje/edje_lua2.c b/src/lib/edje/edje_lua2.c index 24717ff..1418bba 100644 --- a/src/lib/edje/edje_lua2.c +++ b/src/lib/edje/edje_lua2.c @@ -60,6 +60,7 @@ Should do the same for the support functions. These ARE more important to check //--------------------------------------------------------------------------// typedef struct _Edje_Lua_Alloc Edje_Lua_Alloc; +typedef struct _Edje_Lua_Allocator Edje_Lua_Allocator; typedef struct _Edje_Lua_Obj Edje_Lua_Obj; typedef struct _Edje_Lua_Animator Edje_Lua_Animator; typedef struct _Edje_Lua_Timer Edje_Lua_Timer; @@ -72,6 +73,14 @@ struct _Edje_Lua_Alloc size_t max, cur; }; +struct _Edje_Lua_Allocator +{ + Edje_Lua_Alloc *ela; + void *(*func) (void *ud, void *ptr, size_t osize, size_t nsize); + void *ud; + int ref; +}; + struct _Edje_Lua_Obj { EINA_INLIST; @@ -206,8 +215,8 @@ static void * _elua_alloc(void *ud, void *ptr, size_t osize, size_t nsize) { size_t dif; - Edje_Lua_Alloc *ela = ud; - void *ptr2; + Edje_Lua_Allocator *al = ud; + Edje_Lua_Alloc *ela = al->ela; // in lua 5.2 osize encodes the type of data allocted if ptr is NULL // LUA_TSTRING, LUA_TTABLE, LUA_TFUNCTION, LUA_TUSERDATA, or LUA_TTHREAD @@ -235,13 +244,9 @@ _elua_alloc(void *ud, void *ptr, size_t osize, size_t nsize) (int)ela->max, (int)ela->cur); return NULL; } - if (nsize == 0) - { - free(ptr); - return NULL; - } - ptr2 = realloc(ptr, nsize + 4); - if (ptr2) return ptr2; + + ptr = al->func(al->ud, ptr, osize, nsize); + if (nsize == 0 || ptr) return ptr; ERR("Lua cannot re-allocate %i bytes", (int)nsize); return NULL; @@ -3866,12 +3871,18 @@ static void _elua_init(void) // Stack usage [-16, +20, em] { static Edje_Lua_Alloc ela = { MAX_LUA_MEM, 0 }; + Edje_Lua_Allocator *al; const luaL_Reg *l; lua_State *L; if (lstate) return; - lstate = L = lua_newstate(_elua_alloc, &ela); // Stack usage [-0, +0, -] + lstate = L = luaL_newstate(); + al = lua_newuserdata(L, sizeof(Edje_Lua_Allocator)); + al->ref = luaL_ref(L, LUA_REGISTRYINDEX); + al->func = lua_getallocf(L, &(al->ud)); + al->ela = &ela; + lua_setallocf(L, _elua_alloc, al); // Stack usage [-0, +0, -] lua_atpanic(L, _elua_custom_panic); // Stack usage [-0, +0, -] // FIXME: figure out optimal gc settings later @@ -3920,6 +3931,7 @@ void _edje_lua2_script_init(Edje *ed) // Stack usage [-63, +99, em] { static Edje_Lua_Alloc ela = { MAX_LUA_MEM, 0 }; + Edje_Lua_Allocator *al; const luaL_Reg *l; char buf[256]; void *data; @@ -3938,7 +3950,12 @@ _edje_lua2_script_init(Edje *ed) // Stack usage #ifndef RASTER_FORGOT_WHY _elua_init(); // This is actually truly pointless, even if raster remembers. #endif - L = ed->L = lua_newstate(_elua_alloc, &ela); // Stack usage [-0, +0, -] + L = ed->L = luaL_newstate(); + al = lua_newuserdata(L, sizeof(Edje_Lua_Allocator)); + al->ref = luaL_ref(L, LUA_REGISTRYINDEX); + al->func = lua_getallocf(L, &(al->ud)); + al->ela = &ela; + lua_setallocf(L, _elua_alloc, al); // Stack usage [-0, +0, -] lua_atpanic(L, _elua_custom_panic); // Stack usage [-0, +0, -] // FIXME: figure out optimal gc settings later @@ -4041,7 +4058,14 @@ _edje_lua2_script_init(Edje *ed) // Stack usage void _edje_lua2_script_shutdown(Edje *ed) { + Edje_Lua_Allocator *al; + void *ud; if (!ed->L) return; + lua_getallocf(ed->L, &ud); + al = ud; + // restore old allocator to close the state + lua_setallocf(ed->L, al->func, al->ud); + luaL_unref(ed->L, LUA_REGISTRYINDEX, al->ref); lua_close(ed->L); // Stack usage irrelevant, as it's all gone now. ed->L = NULL; while (ed->lua_objs) --