diff options
-rw-r--r-- | ldblib.c | 18 | ||||
-rw-r--r-- | loadlib.c | 11 | ||||
-rw-r--r-- | testes/db.lua | 4 |
3 files changed, 17 insertions, 16 deletions
@@ -21,10 +21,10 @@ | |||
21 | 21 | ||
22 | 22 | ||
23 | /* | 23 | /* |
24 | ** The hook table at registry[&HOOKKEY] maps threads to their current | 24 | ** The hook table at registry[HOOKKEY] maps threads to their current |
25 | ** hook function. (We only need the unique address of 'HOOKKEY'.) | 25 | ** hook function. |
26 | */ | 26 | */ |
27 | static const int HOOKKEY = 0; | 27 | static const char* HOOKKEY = "_HOOKKEY"; |
28 | 28 | ||
29 | 29 | ||
30 | /* | 30 | /* |
@@ -314,7 +314,7 @@ static int db_upvaluejoin (lua_State *L) { | |||
314 | static void hookf (lua_State *L, lua_Debug *ar) { | 314 | static void hookf (lua_State *L, lua_Debug *ar) { |
315 | static const char *const hooknames[] = | 315 | static const char *const hooknames[] = |
316 | {"call", "return", "line", "count", "tail call"}; | 316 | {"call", "return", "line", "count", "tail call"}; |
317 | lua_rawgetp(L, LUA_REGISTRYINDEX, &HOOKKEY); | 317 | lua_getfield(L, LUA_REGISTRYINDEX, HOOKKEY); |
318 | lua_pushthread(L); | 318 | lua_pushthread(L); |
319 | if (lua_rawget(L, -2) == LUA_TFUNCTION) { /* is there a hook function? */ | 319 | if (lua_rawget(L, -2) == LUA_TFUNCTION) { /* is there a hook function? */ |
320 | lua_pushstring(L, hooknames[(int)ar->event]); /* push event name */ | 320 | lua_pushstring(L, hooknames[(int)ar->event]); /* push event name */ |
@@ -367,14 +367,12 @@ static int db_sethook (lua_State *L) { | |||
367 | count = (int)luaL_optinteger(L, arg + 3, 0); | 367 | count = (int)luaL_optinteger(L, arg + 3, 0); |
368 | func = hookf; mask = makemask(smask, count); | 368 | func = hookf; mask = makemask(smask, count); |
369 | } | 369 | } |
370 | if (lua_rawgetp(L, LUA_REGISTRYINDEX, &HOOKKEY) == LUA_TNIL) { | 370 | if (!luaL_getsubtable(L, LUA_REGISTRYINDEX, HOOKKEY)) { |
371 | lua_createtable(L, 0, 2); /* create a hook table */ | 371 | /* table just created; initialize it */ |
372 | lua_pushvalue(L, -1); | ||
373 | lua_rawsetp(L, LUA_REGISTRYINDEX, &HOOKKEY); /* set it in position */ | ||
374 | lua_pushstring(L, "k"); | 372 | lua_pushstring(L, "k"); |
375 | lua_setfield(L, -2, "__mode"); /** hooktable.__mode = "k" */ | 373 | lua_setfield(L, -2, "__mode"); /** hooktable.__mode = "k" */ |
376 | lua_pushvalue(L, -1); | 374 | lua_pushvalue(L, -1); |
377 | lua_setmetatable(L, -2); /* setmetatable(hooktable) = hooktable */ | 375 | lua_setmetatable(L, -2); /* metatable(hooktable) = hooktable */ |
378 | } | 376 | } |
379 | checkstack(L, L1, 1); | 377 | checkstack(L, L1, 1); |
380 | lua_pushthread(L1); lua_xmove(L1, L, 1); /* key (thread) */ | 378 | lua_pushthread(L1); lua_xmove(L1, L, 1); /* key (thread) */ |
@@ -396,7 +394,7 @@ static int db_gethook (lua_State *L) { | |||
396 | else if (hook != hookf) /* external hook? */ | 394 | else if (hook != hookf) /* external hook? */ |
397 | lua_pushliteral(L, "external hook"); | 395 | lua_pushliteral(L, "external hook"); |
398 | else { /* hook table must exist */ | 396 | else { /* hook table must exist */ |
399 | lua_rawgetp(L, LUA_REGISTRYINDEX, &HOOKKEY); | 397 | lua_getfield(L, LUA_REGISTRYINDEX, HOOKKEY); |
400 | checkstack(L, L1, 1); | 398 | checkstack(L, L1, 1); |
401 | lua_pushthread(L1); lua_xmove(L1, L, 1); | 399 | lua_pushthread(L1); lua_xmove(L1, L, 1); |
402 | lua_rawget(L, -2); /* 1st result = hooktable[L1] */ | 400 | lua_rawget(L, -2); /* 1st result = hooktable[L1] */ |
@@ -56,10 +56,10 @@ | |||
56 | 56 | ||
57 | 57 | ||
58 | /* | 58 | /* |
59 | ** unique key for table in the registry that keeps handles | 59 | ** key for table in the registry that keeps handles |
60 | ** for all loaded C libraries | 60 | ** for all loaded C libraries |
61 | */ | 61 | */ |
62 | static const int CLIBS = 0; | 62 | static const char *CLIBS = "_CLIBS"; |
63 | 63 | ||
64 | #define LIB_FAIL "open" | 64 | #define LIB_FAIL "open" |
65 | 65 | ||
@@ -327,7 +327,7 @@ static void setpath (lua_State *L, const char *fieldname, | |||
327 | */ | 327 | */ |
328 | static void *checkclib (lua_State *L, const char *path) { | 328 | static void *checkclib (lua_State *L, const char *path) { |
329 | void *plib; | 329 | void *plib; |
330 | lua_rawgetp(L, LUA_REGISTRYINDEX, &CLIBS); | 330 | lua_getfield(L, LUA_REGISTRYINDEX, CLIBS); |
331 | lua_getfield(L, -1, path); | 331 | lua_getfield(L, -1, path); |
332 | plib = lua_touserdata(L, -1); /* plib = CLIBS[path] */ | 332 | plib = lua_touserdata(L, -1); /* plib = CLIBS[path] */ |
333 | lua_pop(L, 2); /* pop CLIBS table and 'plib' */ | 333 | lua_pop(L, 2); /* pop CLIBS table and 'plib' */ |
@@ -340,7 +340,7 @@ static void *checkclib (lua_State *L, const char *path) { | |||
340 | ** registry.CLIBS[#CLIBS + 1] = plib -- also keep a list of all libraries | 340 | ** registry.CLIBS[#CLIBS + 1] = plib -- also keep a list of all libraries |
341 | */ | 341 | */ |
342 | static void addtoclib (lua_State *L, const char *path, void *plib) { | 342 | static void addtoclib (lua_State *L, const char *path, void *plib) { |
343 | lua_rawgetp(L, LUA_REGISTRYINDEX, &CLIBS); | 343 | lua_getfield(L, LUA_REGISTRYINDEX, CLIBS); |
344 | lua_pushlightuserdata(L, plib); | 344 | lua_pushlightuserdata(L, plib); |
345 | lua_pushvalue(L, -1); | 345 | lua_pushvalue(L, -1); |
346 | lua_setfield(L, -3, path); /* CLIBS[path] = plib */ | 346 | lua_setfield(L, -3, path); /* CLIBS[path] = plib */ |
@@ -716,12 +716,11 @@ static void createsearcherstable (lua_State *L) { | |||
716 | ** setting a finalizer to close all libraries when closing state. | 716 | ** setting a finalizer to close all libraries when closing state. |
717 | */ | 717 | */ |
718 | static void createclibstable (lua_State *L) { | 718 | static void createclibstable (lua_State *L) { |
719 | lua_newtable(L); /* create CLIBS table */ | 719 | luaL_getsubtable(L, LUA_REGISTRYINDEX, CLIBS); /* create CLIBS table */ |
720 | lua_createtable(L, 0, 1); /* create metatable for CLIBS */ | 720 | lua_createtable(L, 0, 1); /* create metatable for CLIBS */ |
721 | lua_pushcfunction(L, gctm); | 721 | lua_pushcfunction(L, gctm); |
722 | lua_setfield(L, -2, "__gc"); /* set finalizer for CLIBS table */ | 722 | lua_setfield(L, -2, "__gc"); /* set finalizer for CLIBS table */ |
723 | lua_setmetatable(L, -2); | 723 | lua_setmetatable(L, -2); |
724 | lua_rawsetp(L, LUA_REGISTRYINDEX, &CLIBS); /* set CLIBS table in registry */ | ||
725 | } | 724 | } |
726 | 725 | ||
727 | 726 | ||
diff --git a/testes/db.lua b/testes/db.lua index 3d94f776..a64a1130 100644 --- a/testes/db.lua +++ b/testes/db.lua | |||
@@ -255,6 +255,10 @@ do -- test hook presence in debug info | |||
255 | end | 255 | end |
256 | 256 | ||
257 | 257 | ||
258 | -- hook table has weak keys | ||
259 | assert(getmetatable(debug.getregistry()._HOOKKEY).__mode == 'k') | ||
260 | |||
261 | |||
258 | a = {}; L = nil | 262 | a = {}; L = nil |
259 | local glob = 1 | 263 | local glob = 1 |
260 | local oldglob = glob | 264 | local oldglob = glob |