diff options
Diffstat (limited to 'src/lib_aux.c')
-rw-r--r-- | src/lib_aux.c | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/src/lib_aux.c b/src/lib_aux.c index b8e56436..7b01693a 100644 --- a/src/lib_aux.c +++ b/src/lib_aux.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include "lj_state.h" | 21 | #include "lj_state.h" |
22 | #include "lj_trace.h" | 22 | #include "lj_trace.h" |
23 | #include "lj_lib.h" | 23 | #include "lj_lib.h" |
24 | #include "lj_vmevent.h" | ||
24 | 25 | ||
25 | #if LJ_TARGET_POSIX | 26 | #if LJ_TARGET_POSIX |
26 | #include <sys/wait.h> | 27 | #include <sys/wait.h> |
@@ -318,6 +319,18 @@ static int panic(lua_State *L) | |||
318 | return 0; | 319 | return 0; |
319 | } | 320 | } |
320 | 321 | ||
322 | #ifndef LUAJIT_DISABLE_VMEVENT | ||
323 | static int error_finalizer(lua_State *L) | ||
324 | { | ||
325 | const char *s = lua_tostring(L, -1); | ||
326 | fputs("ERROR in finalizer: ", stderr); | ||
327 | fputs(s ? s : "?", stderr); | ||
328 | fputc('\n', stderr); | ||
329 | fflush(stderr); | ||
330 | return 0; | ||
331 | } | ||
332 | #endif | ||
333 | |||
321 | #ifdef LUAJIT_USE_SYSMALLOC | 334 | #ifdef LUAJIT_USE_SYSMALLOC |
322 | 335 | ||
323 | #if LJ_64 && !LJ_GC64 && !defined(LUAJIT_USE_VALGRIND) | 336 | #if LJ_64 && !LJ_GC64 && !defined(LUAJIT_USE_VALGRIND) |
@@ -339,7 +352,15 @@ static void *mem_alloc(void *ud, void *ptr, size_t osize, size_t nsize) | |||
339 | LUALIB_API lua_State *luaL_newstate(void) | 352 | LUALIB_API lua_State *luaL_newstate(void) |
340 | { | 353 | { |
341 | lua_State *L = lua_newstate(mem_alloc, NULL); | 354 | lua_State *L = lua_newstate(mem_alloc, NULL); |
342 | if (L) G(L)->panic = panic; | 355 | if (L) { |
356 | G(L)->panic = panic; | ||
357 | #ifndef LUAJIT_DISABLE_VMEVENT | ||
358 | luaL_findtable(L, LUA_REGISTRYINDEX, LJ_VMEVENTS_REGKEY, LJ_VMEVENTS_HSIZE); | ||
359 | lua_pushcfunction(L, error_finalizer); | ||
360 | lua_rawseti(L, -2, VMEVENT_HASH(LJ_VMEVENT_ERRFIN)); | ||
361 | G(L)->vmevmask = VMEVENT_MASK(LJ_VMEVENT_ERRFIN); | ||
362 | #endif | ||
363 | } | ||
343 | return L; | 364 | return L; |
344 | } | 365 | } |
345 | 366 | ||
@@ -353,7 +374,15 @@ LUALIB_API lua_State *luaL_newstate(void) | |||
353 | #else | 374 | #else |
354 | L = lua_newstate(LJ_ALLOCF_INTERNAL, NULL); | 375 | L = lua_newstate(LJ_ALLOCF_INTERNAL, NULL); |
355 | #endif | 376 | #endif |
356 | if (L) G(L)->panic = panic; | 377 | if (L) { |
378 | G(L)->panic = panic; | ||
379 | #ifndef LUAJIT_DISABLE_VMEVENT | ||
380 | luaL_findtable(L, LUA_REGISTRYINDEX, LJ_VMEVENTS_REGKEY, LJ_VMEVENTS_HSIZE); | ||
381 | lua_pushcfunction(L, error_finalizer); | ||
382 | lua_rawseti(L, -2, VMEVENT_HASH(LJ_VMEVENT_ERRFIN)); | ||
383 | G(L)->vmevmask = VMEVENT_MASK(LJ_VMEVENT_ERRFIN); | ||
384 | #endif | ||
385 | } | ||
357 | return L; | 386 | return L; |
358 | } | 387 | } |
359 | 388 | ||