diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-11-25 15:47:13 -0200 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-11-25 15:47:13 -0200 |
| commit | 5f698f8b6f7e5fb18e0a7386dc506b0d5b538e6b (patch) | |
| tree | 30ae565e9ca884a66c3cca023d24950972e02b0b | |
| parent | 9b1c586b2f5b86173bf0ceca8a0dd84510af9024 (diff) | |
| download | lua-5f698f8b6f7e5fb18e0a7386dc506b0d5b538e6b.tar.gz lua-5f698f8b6f7e5fb18e0a7386dc506b0d5b538e6b.tar.bz2 lua-5f698f8b6f7e5fb18e0a7386dc506b0d5b538e6b.zip | |
simpler interface to hooks + use of `int' to count hooks
| -rw-r--r-- | ldblib.c | 20 | ||||
| -rw-r--r-- | ldebug.c | 17 | ||||
| -rw-r--r-- | llimits.h | 7 | ||||
| -rw-r--r-- | lstate.h | 6 | ||||
| -rw-r--r-- | ltests.c | 12 | ||||
| -rw-r--r-- | lua.c | 11 | ||||
| -rw-r--r-- | lua.h | 12 | ||||
| -rw-r--r-- | lvm.c | 4 |
8 files changed, 41 insertions, 48 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ldblib.c,v 1.71 2002/11/14 15:41:38 roberto Exp roberto $ | 2 | ** $Id: ldblib.c,v 1.72 2002/11/18 15:23:15 roberto Exp roberto $ |
| 3 | ** Interface from Lua to its debug API | 3 | ** Interface from Lua to its debug API |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -126,16 +126,17 @@ static void hookf (lua_State *L, lua_Debug *ar) { | |||
| 126 | } | 126 | } |
| 127 | 127 | ||
| 128 | 128 | ||
| 129 | static unsigned long makemask (const char *smask, int count) { | 129 | static int makemask (const char *smask, int count) { |
| 130 | unsigned long mask = 0; | 130 | int mask = 0; |
| 131 | if (strchr(smask, 'c')) mask |= LUA_MASKCALL; | 131 | if (strchr(smask, 'c')) mask |= LUA_MASKCALL; |
| 132 | if (strchr(smask, 'r')) mask |= LUA_MASKRET; | 132 | if (strchr(smask, 'r')) mask |= LUA_MASKRET; |
| 133 | if (strchr(smask, 'l')) mask |= LUA_MASKLINE; | 133 | if (strchr(smask, 'l')) mask |= LUA_MASKLINE; |
| 134 | return mask | LUA_MASKCOUNT(count); | 134 | if (count > 0) mask |= LUA_MASKCOUNT; |
| 135 | return mask; | ||
| 135 | } | 136 | } |
| 136 | 137 | ||
| 137 | 138 | ||
| 138 | static char *unmakemask (unsigned long mask, char *smask) { | 139 | static char *unmakemask (int mask, char *smask) { |
| 139 | int i = 0; | 140 | int i = 0; |
| 140 | if (mask & LUA_MASKCALL) smask[i++] = 'c'; | 141 | if (mask & LUA_MASKCALL) smask[i++] = 'c'; |
| 141 | if (mask & LUA_MASKRET) smask[i++] = 'r'; | 142 | if (mask & LUA_MASKRET) smask[i++] = 'r'; |
| @@ -148,14 +149,13 @@ static char *unmakemask (unsigned long mask, char *smask) { | |||
| 148 | static int sethook (lua_State *L) { | 149 | static int sethook (lua_State *L) { |
| 149 | if (lua_isnoneornil(L, 1)) { | 150 | if (lua_isnoneornil(L, 1)) { |
| 150 | lua_settop(L, 1); | 151 | lua_settop(L, 1); |
| 151 | lua_sethook(L, NULL, 0); /* turn off hooks */ | 152 | lua_sethook(L, NULL, 0, 0); /* turn off hooks */ |
| 152 | } | 153 | } |
| 153 | else { | 154 | else { |
| 154 | const char *smask = luaL_checkstring(L, 2); | 155 | const char *smask = luaL_checkstring(L, 2); |
| 155 | lua_Number count = luaL_optnumber(L, 3, 0); | 156 | lua_Number count = luaL_optnumber(L, 3, 0); |
| 156 | luaL_checktype(L, 1, LUA_TFUNCTION); | 157 | luaL_checktype(L, 1, LUA_TFUNCTION); |
| 157 | luaL_argcheck(L, count <= LUA_MAXCOUNT, 2, "count too large (>= 2^24)"); | 158 | lua_sethook(L, hookf, makemask(smask, count), count); |
| 158 | lua_sethook(L, hookf, makemask(smask, (int)count)); | ||
| 159 | } | 159 | } |
| 160 | lua_pushlightuserdata(L, (void *)&KEY_HOOK); | 160 | lua_pushlightuserdata(L, (void *)&KEY_HOOK); |
| 161 | lua_pushvalue(L, 1); | 161 | lua_pushvalue(L, 1); |
| @@ -166,7 +166,7 @@ static int sethook (lua_State *L) { | |||
| 166 | 166 | ||
| 167 | static int gethook (lua_State *L) { | 167 | static int gethook (lua_State *L) { |
| 168 | char buff[5]; | 168 | char buff[5]; |
| 169 | unsigned long mask = lua_gethookmask(L); | 169 | int mask = lua_gethookmask(L); |
| 170 | lua_Hook hook = lua_gethook(L); | 170 | lua_Hook hook = lua_gethook(L); |
| 171 | if (hook != NULL && hook != hookf) /* external hook? */ | 171 | if (hook != NULL && hook != hookf) /* external hook? */ |
| 172 | lua_pushliteral(L, "external hook"); | 172 | lua_pushliteral(L, "external hook"); |
| @@ -175,7 +175,7 @@ static int gethook (lua_State *L) { | |||
| 175 | lua_rawget(L, LUA_REGISTRYINDEX); /* get hook */ | 175 | lua_rawget(L, LUA_REGISTRYINDEX); /* get hook */ |
| 176 | } | 176 | } |
| 177 | lua_pushstring(L, unmakemask(mask, buff)); | 177 | lua_pushstring(L, unmakemask(mask, buff)); |
| 178 | lua_pushnumber(L, lua_getmaskcount(mask)); | 178 | lua_pushnumber(L, lua_gethookcount(L)); |
| 179 | return 3; | 179 | return 3; |
| 180 | } | 180 | } |
| 181 | 181 | ||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ldebug.c,v 1.137 2002/11/18 11:01:55 roberto Exp roberto $ | 2 | ** $Id: ldebug.c,v 1.138 2002/11/21 15:16:04 roberto Exp roberto $ |
| 3 | ** Debug Interface | 3 | ** Debug Interface |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -60,17 +60,15 @@ void luaG_inithooks (lua_State *L) { | |||
| 60 | /* | 60 | /* |
| 61 | ** this function can be called asynchronous (e.g. during a signal) | 61 | ** this function can be called asynchronous (e.g. during a signal) |
| 62 | */ | 62 | */ |
| 63 | LUA_API int lua_sethook (lua_State *L, lua_Hook func, unsigned long mask) { | 63 | LUA_API int lua_sethook (lua_State *L, lua_Hook func, int mask, int count) { |
| 64 | ls_count count = lua_getmaskcount(mask); | ||
| 65 | if (func == NULL || mask == 0) { /* turn off hooks? */ | 64 | if (func == NULL || mask == 0) { /* turn off hooks? */ |
| 66 | mask = 0; | 65 | mask = 0; |
| 67 | func = NULL; | 66 | func = NULL; |
| 68 | } | 67 | } |
| 69 | else if (count > 0) mask |= (1<<LUA_HOOKCOUNT); | ||
| 70 | L->hook = func; | 68 | L->hook = func; |
| 71 | L->basehookcount = count; | 69 | L->basehookcount = count; |
| 72 | resethookcount(L); | 70 | resethookcount(L); |
| 73 | L->hookmask = cast(lu_byte, mask & 0xf); | 71 | L->hookmask = cast(lu_byte, mask); |
| 74 | L->hookinit = 0; | 72 | L->hookinit = 0; |
| 75 | return 1; | 73 | return 1; |
| 76 | } | 74 | } |
| @@ -81,8 +79,13 @@ LUA_API lua_Hook lua_gethook (lua_State *L) { | |||
| 81 | } | 79 | } |
| 82 | 80 | ||
| 83 | 81 | ||
| 84 | LUA_API unsigned long lua_gethookmask (lua_State *L) { | 82 | LUA_API int lua_gethookmask (lua_State *L) { |
| 85 | return L->hookmask | LUA_MASKCOUNT(L->basehookcount); | 83 | return L->hookmask; |
| 84 | } | ||
| 85 | |||
| 86 | |||
| 87 | LUA_API int lua_gethookcount (lua_State *L) { | ||
| 88 | return L->basehookcount; | ||
| 86 | } | 89 | } |
| 87 | 90 | ||
| 88 | 91 | ||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: llimits.h,v 1.49 2002/11/22 17:16:52 roberto Exp roberto $ | 2 | ** $Id: llimits.h,v 1.50 2002/11/22 18:01:46 roberto Exp roberto $ |
| 3 | ** Limits, basic types, and some other `installation-dependent' definitions | 3 | ** Limits, basic types, and some other `installation-dependent' definitions |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -52,11 +52,6 @@ typedef unsigned long lu_mem; | |||
| 52 | /* an integer big enough to count the number of strings in use */ | 52 | /* an integer big enough to count the number of strings in use */ |
| 53 | typedef long ls_nstr; | 53 | typedef long ls_nstr; |
| 54 | 54 | ||
| 55 | /* an integer big enough to count the number of steps when calling a | ||
| 56 | ** `count' hook */ | ||
| 57 | typedef long ls_count; | ||
| 58 | |||
| 59 | |||
| 60 | /* chars used as small naturals (so that `char' is reserved for characters) */ | 55 | /* chars used as small naturals (so that `char' is reserved for characters) */ |
| 61 | typedef unsigned char lu_byte; | 56 | typedef unsigned char lu_byte; |
| 62 | 57 | ||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lstate.h,v 1.106 2002/11/22 17:16:52 roberto Exp roberto $ | 2 | ** $Id: lstate.h,v 1.107 2002/11/22 18:01:46 roberto Exp roberto $ |
| 3 | ** Global State | 3 | ** Global State |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -143,8 +143,8 @@ struct lua_State { | |||
| 143 | lu_byte hookmask; | 143 | lu_byte hookmask; |
| 144 | lu_byte allowhook; | 144 | lu_byte allowhook; |
| 145 | lu_byte hookinit; | 145 | lu_byte hookinit; |
| 146 | ls_count basehookcount; | 146 | int basehookcount; |
| 147 | ls_count hookcount; | 147 | int hookcount; |
| 148 | lua_Hook hook; | 148 | lua_Hook hook; |
| 149 | TObject _gt; /* table of globals */ | 149 | TObject _gt; /* table of globals */ |
| 150 | GCObject *openupval; /* list of open upvalues in this stack */ | 150 | GCObject *openupval; /* list of open upvalues in this stack */ |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ltests.c,v 1.144 2002/11/14 16:59:16 roberto Exp roberto $ | 2 | ** $Id: ltests.c,v 1.145 2002/11/18 15:24:27 roberto Exp roberto $ |
| 3 | ** Internal Module for Debugging of the Lua Implementation | 3 | ** Internal Module for Debugging of the Lua Implementation |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -702,12 +702,14 @@ static void yieldf (lua_State *L, lua_Debug *ar) { | |||
| 702 | 702 | ||
| 703 | static int setyhook (lua_State *L) { | 703 | static int setyhook (lua_State *L) { |
| 704 | if (lua_isnoneornil(L, 1)) | 704 | if (lua_isnoneornil(L, 1)) |
| 705 | lua_sethook(L, NULL, 0); /* turn off hooks */ | 705 | lua_sethook(L, NULL, 0, 0); /* turn off hooks */ |
| 706 | else { | 706 | else { |
| 707 | const char *smask = luaL_checkstring(L, 1); | 707 | const char *smask = luaL_checkstring(L, 1); |
| 708 | unsigned long count = LUA_MASKCOUNT(luaL_optint(L, 2, 0)); | 708 | int count = luaL_optint(L, 2, 0); |
| 709 | if (strchr(smask, 'l')) count |= LUA_MASKLINE; | 709 | int mask = 0; |
| 710 | lua_sethook(L, yieldf, count); | 710 | if (strchr(smask, 'l')) mask |= LUA_MASKLINE; |
| 711 | if (count > 0) mask |= LUA_MASKCOUNT; | ||
| 712 | lua_sethook(L, yieldf, mask, count); | ||
| 711 | } | 713 | } |
| 712 | return 0; | 714 | return 0; |
| 713 | } | 715 | } |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lua.c,v 1.108 2002/11/14 15:42:05 roberto Exp roberto $ | 2 | ** $Id: lua.c,v 1.109 2002/11/19 13:49:43 roberto Exp roberto $ |
| 3 | ** Lua stand-alone interpreter | 3 | ** Lua stand-alone interpreter |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -57,9 +57,6 @@ static lua_State *L = NULL; | |||
| 57 | static const char *progname; | 57 | static const char *progname; |
| 58 | 58 | ||
| 59 | 59 | ||
| 60 | static lua_Hook old_hook = NULL; | ||
| 61 | static unsigned long old_mask = 0; | ||
| 62 | |||
| 63 | 60 | ||
| 64 | static const luaL_reg lualibs[] = { | 61 | static const luaL_reg lualibs[] = { |
| 65 | {"baselib", lua_baselibopen}, | 62 | {"baselib", lua_baselibopen}, |
| @@ -77,7 +74,7 @@ static const luaL_reg lualibs[] = { | |||
| 77 | 74 | ||
| 78 | static void lstop (lua_State *l, lua_Debug *ar) { | 75 | static void lstop (lua_State *l, lua_Debug *ar) { |
| 79 | (void)ar; /* unused arg. */ | 76 | (void)ar; /* unused arg. */ |
| 80 | lua_sethook(l, old_hook, old_mask); | 77 | lua_sethook(l, NULL, 0, 0); |
| 81 | luaL_error(l, "interrupted!"); | 78 | luaL_error(l, "interrupted!"); |
| 82 | } | 79 | } |
| 83 | 80 | ||
| @@ -85,9 +82,7 @@ static void lstop (lua_State *l, lua_Debug *ar) { | |||
| 85 | static void laction (int i) { | 82 | static void laction (int i) { |
| 86 | signal(i, SIG_DFL); /* if another SIGINT happens before lstop, | 83 | signal(i, SIG_DFL); /* if another SIGINT happens before lstop, |
| 87 | terminate process (default action) */ | 84 | terminate process (default action) */ |
| 88 | old_hook = lua_gethook(L); | 85 | lua_sethook(L, lstop, LUA_MASKCALL | LUA_MASKRET | LUA_MASKCOUNT, 1); |
| 89 | old_mask = lua_gethookmask(L); | ||
| 90 | lua_sethook(L, lstop, LUA_MASKCALL | LUA_MASKRET | LUA_MASKCOUNT(1)); | ||
| 91 | } | 86 | } |
| 92 | 87 | ||
| 93 | 88 | ||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lua.h,v 1.164 2002/11/14 11:51:50 roberto Exp roberto $ | 2 | ** $Id: lua.h,v 1.165 2002/11/18 11:01:55 roberto Exp roberto $ |
| 3 | ** Lua - An Extensible Extension Language | 3 | ** Lua - An Extensible Extension Language |
| 4 | ** Tecgraf: Computer Graphics Technology Group, PUC-Rio, Brazil | 4 | ** Tecgraf: Computer Graphics Technology Group, PUC-Rio, Brazil |
| 5 | ** http://www.lua.org mailto:info@lua.org | 5 | ** http://www.lua.org mailto:info@lua.org |
| @@ -330,10 +330,7 @@ LUA_API int lua_pushupvalues (lua_State *L); | |||
| 330 | #define LUA_MASKCALL (1 << LUA_HOOKCALL) | 330 | #define LUA_MASKCALL (1 << LUA_HOOKCALL) |
| 331 | #define LUA_MASKRET (1 << LUA_HOOKRET) | 331 | #define LUA_MASKRET (1 << LUA_HOOKRET) |
| 332 | #define LUA_MASKLINE (1 << LUA_HOOKLINE) | 332 | #define LUA_MASKLINE (1 << LUA_HOOKLINE) |
| 333 | #define LUA_MASKCOUNT(count) ((unsigned long)(count) << 8) | 333 | #define LUA_MASKCOUNT (1 << LUA_HOOKCOUNT) |
| 334 | #define lua_getmaskcount(mask) ((mask) >> 8) | ||
| 335 | |||
| 336 | #define LUA_MAXCOUNT ((~(unsigned long)0) >> 8) | ||
| 337 | 334 | ||
| 338 | typedef struct lua_Debug lua_Debug; /* activation record */ | 335 | typedef struct lua_Debug lua_Debug; /* activation record */ |
| 339 | 336 | ||
| @@ -345,9 +342,10 @@ LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar); | |||
| 345 | LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n); | 342 | LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n); |
| 346 | LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n); | 343 | LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n); |
| 347 | 344 | ||
| 348 | LUA_API int lua_sethook (lua_State *L, lua_Hook func, unsigned long mask); | 345 | LUA_API int lua_sethook (lua_State *L, lua_Hook func, int mask, int count); |
| 349 | LUA_API lua_Hook lua_gethook (lua_State *L); | 346 | LUA_API lua_Hook lua_gethook (lua_State *L); |
| 350 | LUA_API unsigned long lua_gethookmask (lua_State *L); | 347 | LUA_API int lua_gethookmask (lua_State *L); |
| 348 | LUA_API int lua_gethookcount (lua_State *L); | ||
| 351 | 349 | ||
| 352 | 350 | ||
| 353 | #define LUA_IDSIZE 60 | 351 | #define LUA_IDSIZE 60 |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lvm.c,v 1.268 2002/11/21 17:19:42 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 1.269 2002/11/25 11:20:29 roberto Exp roberto $ |
| 3 | ** Lua virtual machine | 3 | ** Lua virtual machine |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -383,7 +383,7 @@ StkId luaV_execute (lua_State *L) { | |||
| 383 | for (;;) { | 383 | for (;;) { |
| 384 | const Instruction i = *pc++; | 384 | const Instruction i = *pc++; |
| 385 | StkId base, ra; | 385 | StkId base, ra; |
| 386 | if (L->hookmask >= LUA_MASKLINE && | 386 | if ((L->hookmask & (LUA_MASKLINE | LUA_MASKCOUNT)) && |
| 387 | (--L->hookcount == 0 || L->hookmask & LUA_MASKLINE)) { | 387 | (--L->hookcount == 0 || L->hookmask & LUA_MASKLINE)) { |
| 388 | traceexec(L); | 388 | traceexec(L); |
| 389 | if (L->ci->state & CI_YIELD) { /* did hook yield? */ | 389 | if (L->ci->state & CI_YIELD) { /* did hook yield? */ |
