aboutsummaryrefslogtreecommitdiff
path: root/ldo.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-11-18 09:01:55 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-11-18 09:01:55 -0200
commit43013b39cc28e873e18207e8e7259b6b90fed06b (patch)
tree3c2a9c520a01086df28c8f0d1ef6d9b5069fa451 /ldo.c
parent94912d99fcdf61c1fc6dc8897c9d2b0e042e0d63 (diff)
downloadlua-43013b39cc28e873e18207e8e7259b6b90fed06b.tar.gz
lua-43013b39cc28e873e18207e8e7259b6b90fed06b.tar.bz2
lua-43013b39cc28e873e18207e8e7259b6b90fed06b.zip
new representation for hooks (to allow asynchronous calls to sethook)
Diffstat (limited to 'ldo.c')
-rw-r--r--ldo.c20
1 files changed, 10 insertions, 10 deletions
diff --git a/ldo.c b/ldo.c
index ae752ece..176cf0da 100644
--- a/ldo.c
+++ b/ldo.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ldo.c,v 1.200 2002/11/13 11:31:39 roberto Exp roberto $ 2** $Id: ldo.c,v 1.201 2002/11/14 16:15:53 roberto Exp roberto $
3** Stack and Call structure of Lua 3** Stack and Call structure of Lua
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -154,7 +154,7 @@ static void luaD_growCI (lua_State *L) {
154 154
155void luaD_callhook (lua_State *L, int event, int line) { 155void luaD_callhook (lua_State *L, int event, int line) {
156 lua_Hook hook = L->hook; 156 lua_Hook hook = L->hook;
157 if (hook && allowhook(L)) { 157 if (hook && L->allowhook) {
158 ptrdiff_t top = savestack(L, L->top); 158 ptrdiff_t top = savestack(L, L->top);
159 ptrdiff_t ci_top = savestack(L, L->ci->top); 159 ptrdiff_t ci_top = savestack(L, L->ci->top);
160 lua_Debug ar; 160 lua_Debug ar;
@@ -163,12 +163,12 @@ void luaD_callhook (lua_State *L, int event, int line) {
163 ar.i_ci = L->ci - L->base_ci; 163 ar.i_ci = L->ci - L->base_ci;
164 luaD_checkstack(L, LUA_MINSTACK); /* ensure minimum stack size */ 164 luaD_checkstack(L, LUA_MINSTACK); /* ensure minimum stack size */
165 L->ci->top = L->top + LUA_MINSTACK; 165 L->ci->top = L->top + LUA_MINSTACK;
166 setallowhook(L, 0); /* cannot call hooks inside a hook */ 166 L->allowhook = 0; /* cannot call hooks inside a hook */
167 lua_unlock(L); 167 lua_unlock(L);
168 (*hook)(L, &ar); 168 (*hook)(L, &ar);
169 lua_lock(L); 169 lua_lock(L);
170 lua_assert(!allowhook(L)); 170 lua_assert(!L->allowhook);
171 setallowhook(L, 1); 171 L->allowhook = 1;
172 L->ci->top = restorestack(L, ci_top); 172 L->ci->top = restorestack(L, ci_top);
173 L->top = restorestack(L, top); 173 L->top = restorestack(L, top);
174 } 174 }
@@ -328,16 +328,16 @@ static void resume (lua_State *L, void *ud) {
328 328
329LUA_API int lua_resume (lua_State *L, int nargs) { 329LUA_API int lua_resume (lua_State *L, int nargs) {
330 int status; 330 int status;
331 int old_allowhooks; 331 lu_byte old_allowhooks;
332 lua_lock(L); 332 lua_lock(L);
333 old_allowhooks = allowhook(L); 333 old_allowhooks = L->allowhook;
334 lua_assert(L->errfunc == 0); 334 lua_assert(L->errfunc == 0);
335 status = luaD_rawrunprotected(L, resume, &nargs); 335 status = luaD_rawrunprotected(L, resume, &nargs);
336 if (status != 0) { /* error? */ 336 if (status != 0) { /* error? */
337 L->ci = L->base_ci; /* go back to initial level */ 337 L->ci = L->base_ci; /* go back to initial level */
338 luaF_close(L, L->ci->base); /* close eventual pending closures */ 338 luaF_close(L, L->ci->base); /* close eventual pending closures */
339 seterrorobj(L, status, L->ci->base); 339 seterrorobj(L, status, L->ci->base);
340 setallowhook(L, old_allowhooks); 340 L->allowhook = old_allowhooks;
341 restore_stack_limit(L); 341 restore_stack_limit(L);
342 } 342 }
343 lua_unlock(L); 343 lua_unlock(L);
@@ -383,7 +383,7 @@ int luaD_pcall (lua_State *L, int nargs, int nresults, ptrdiff_t errfunc) {
383 int status; 383 int status;
384 ptrdiff_t old_top = savestack(L, L->top); 384 ptrdiff_t old_top = savestack(L, L->top);
385 ptrdiff_t old_ci = saveci(L, L->ci); 385 ptrdiff_t old_ci = saveci(L, L->ci);
386 int old_allowhooks = allowhook(L); 386 lu_byte old_allowhooks = L->allowhook;
387 ptrdiff_t old_errfunc = L->errfunc; 387 ptrdiff_t old_errfunc = L->errfunc;
388 L->errfunc = errfunc; 388 L->errfunc = errfunc;
389 c.func = L->top - (nargs+1); /* function to be called */ 389 c.func = L->top - (nargs+1); /* function to be called */
@@ -394,7 +394,7 @@ int luaD_pcall (lua_State *L, int nargs, int nresults, ptrdiff_t errfunc) {
394 luaF_close(L, oldtop); /* close eventual pending closures */ 394 luaF_close(L, oldtop); /* close eventual pending closures */
395 seterrorobj(L, status, oldtop); 395 seterrorobj(L, status, oldtop);
396 L->ci = restoreci(L, old_ci); 396 L->ci = restoreci(L, old_ci);
397 setallowhook(L, old_allowhooks); 397 L->allowhook = old_allowhooks;
398 restore_stack_limit(L); 398 restore_stack_limit(L);
399 } 399 }
400 L->errfunc = old_errfunc; 400 L->errfunc = old_errfunc;