aboutsummaryrefslogtreecommitdiff
path: root/ldblib.c
diff options
context:
space:
mode:
Diffstat (limited to 'ldblib.c')
-rw-r--r--ldblib.c18
1 files changed, 8 insertions, 10 deletions
diff --git a/ldblib.c b/ldblib.c
index 513a13cb..64158395 100644
--- a/ldblib.c
+++ b/ldblib.c
@@ -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*/
27static const int HOOKKEY = 0; 27static const char* HOOKKEY = "_HOOKKEY";
28 28
29 29
30/* 30/*
@@ -314,7 +314,7 @@ static int db_upvaluejoin (lua_State *L) {
314static void hookf (lua_State *L, lua_Debug *ar) { 314static 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] */