aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2017-12-19 14:40:17 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2017-12-19 14:40:17 -0200
commit4dc0be950ad67e4385400aacd25e10325a2a6e59 (patch)
tree9d201a8d3725f7130740bb574f7e19d8ad3c4d96
parent3153a41e330a624fccfb7b9ade576767619b4a6b (diff)
downloadlua-4dc0be950ad67e4385400aacd25e10325a2a6e59.tar.gz
lua-4dc0be950ad67e4385400aacd25e10325a2a6e59.tar.bz2
lua-4dc0be950ad67e4385400aacd25e10325a2a6e59.zip
new macro 'isLuacode' (to distinguish regular Lua code from
hooks, where C code can run inside a Lua function).
-rw-r--r--ldo.c7
-rw-r--r--lstate.c4
-rw-r--r--lstate.h10
-rw-r--r--ltm.c6
4 files changed, 16 insertions, 11 deletions
diff --git a/ldo.c b/ldo.c
index e58efa52..fa8a382b 100644
--- a/ldo.c
+++ b/ldo.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ldo.c,v 2.180 2017/12/12 11:57:30 roberto Exp roberto $ 2** $Id: ldo.c,v 2.181 2017/12/15 13:07:10 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*/
@@ -454,7 +454,7 @@ void luaD_call (lua_State *L, StkId func, int nresults) {
454 ci->func = func; 454 ci->func = func;
455 ci->top = L->top + LUA_MINSTACK; 455 ci->top = L->top + LUA_MINSTACK;
456 lua_assert(ci->top <= L->stack_last); 456 lua_assert(ci->top <= L->stack_last);
457 ci->callstatus = 0; 457 ci->callstatus = CIST_C;
458 if (L->hookmask & LUA_MASKCALL) 458 if (L->hookmask & LUA_MASKCALL)
459 luaD_hook(L, LUA_HOOKCALL, -1); 459 luaD_hook(L, LUA_HOOKCALL, -1);
460 lua_unlock(L); 460 lua_unlock(L);
@@ -479,7 +479,7 @@ void luaD_call (lua_State *L, StkId func, int nresults) {
479 L->top = ci->top = func + 1 + fsize; 479 L->top = ci->top = func + 1 + fsize;
480 lua_assert(ci->top <= L->stack_last); 480 lua_assert(ci->top <= L->stack_last);
481 ci->u.l.savedpc = p->code; /* starting point */ 481 ci->u.l.savedpc = p->code; /* starting point */
482 ci->callstatus = CIST_LUA; 482 ci->callstatus = 0;
483 if (L->hookmask) 483 if (L->hookmask)
484 callhook(L, ci, 0); 484 callhook(L, ci, 0);
485 luaV_execute(L, ci); /* run the function */ 485 luaV_execute(L, ci); /* run the function */
@@ -698,6 +698,7 @@ LUA_API int lua_yieldk (lua_State *L, int nresults, lua_KContext ctx,
698 } 698 }
699 L->status = LUA_YIELD; 699 L->status = LUA_YIELD;
700 if (isLua(ci)) { /* inside a hook? */ 700 if (isLua(ci)) { /* inside a hook? */
701 lua_assert(!isLuacode(ci));
701 api_check(L, k == NULL, "hooks cannot continue after yielding"); 702 api_check(L, k == NULL, "hooks cannot continue after yielding");
702 ci->u2.nyield = 0; /* no results */ 703 ci->u2.nyield = 0; /* no results */
703 } 704 }
diff --git a/lstate.c b/lstate.c
index 22702a00..81e10851 100644
--- a/lstate.c
+++ b/lstate.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lstate.c,v 2.147 2017/11/13 15:36:52 roberto Exp roberto $ 2** $Id: lstate.c,v 2.148 2017/11/23 16:35:54 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*/
@@ -177,7 +177,7 @@ static void stack_init (lua_State *L1, lua_State *L) {
177 /* initialize first ci */ 177 /* initialize first ci */
178 ci = &L1->base_ci; 178 ci = &L1->base_ci;
179 ci->next = ci->previous = NULL; 179 ci->next = ci->previous = NULL;
180 ci->callstatus = 0; 180 ci->callstatus = CIST_C;
181 ci->func = L1->top; 181 ci->func = L1->top;
182 setnilvalue(s2v(L1->top)); /* 'function' entry for this 'ci' */ 182 setnilvalue(s2v(L1->top)); /* 'function' entry for this 'ci' */
183 L1->top++; 183 L1->top++;
diff --git a/lstate.h b/lstate.h
index fad54634..bc4df4e5 100644
--- a/lstate.h
+++ b/lstate.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lstate.h,v 2.151 2017/11/13 15:36:52 roberto Exp roberto $ 2** $Id: lstate.h,v 2.152 2017/11/23 16:35:54 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*/
@@ -112,7 +112,7 @@ typedef struct CallInfo {
112** Bits in CallInfo status 112** Bits in CallInfo status
113*/ 113*/
114#define CIST_OAH (1<<0) /* original value of 'allowhook' */ 114#define CIST_OAH (1<<0) /* original value of 'allowhook' */
115#define CIST_LUA (1<<1) /* call is running a Lua function */ 115#define CIST_C (1<<1) /* call is running a C function */
116#define CIST_HOOKED (1<<2) /* call is running a debug hook */ 116#define CIST_HOOKED (1<<2) /* call is running a debug hook */
117#define CIST_YPCALL (1<<3) /* call is a yieldable protected call */ 117#define CIST_YPCALL (1<<3) /* call is a yieldable protected call */
118#define CIST_TAIL (1<<4) /* call was tail called */ 118#define CIST_TAIL (1<<4) /* call was tail called */
@@ -120,7 +120,11 @@ typedef struct CallInfo {
120#define CIST_LEQ (1<<6) /* using __lt for __le */ 120#define CIST_LEQ (1<<6) /* using __lt for __le */
121#define CIST_FIN (1<<7) /* call is running a finalizer */ 121#define CIST_FIN (1<<7) /* call is running a finalizer */
122 122
123#define isLua(ci) ((ci)->callstatus & CIST_LUA) 123/* active function is a Lua function */
124#define isLua(ci) (!((ci)->callstatus & CIST_C))
125
126/* call is running Lua code (not a hook) */
127#define isLuacode(ci) (!((ci)->callstatus & (CIST_C | CIST_HOOKED)))
124 128
125/* assume that CIST_OAH has offset 0 and that 'v' is strictly 0/1 */ 129/* assume that CIST_OAH has offset 0 and that 'v' is strictly 0/1 */
126#define setoah(st,v) ((st) = ((st) & ~CIST_OAH) | (v)) 130#define setoah(st,v) ((st) = ((st) & ~CIST_OAH) | (v))
diff --git a/ltm.c b/ltm.c
index 049c1712..5906a2fd 100644
--- a/ltm.c
+++ b/ltm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ltm.c,v 2.52 2017/12/13 18:32:09 roberto Exp roberto $ 2** $Id: ltm.c,v 2.53 2017/12/15 13:07:10 roberto Exp roberto $
3** Tag methods 3** Tag methods
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -108,7 +108,7 @@ void luaT_callTM (lua_State *L, const TValue *f, const TValue *p1,
108 setobj2s(L, func + 3, p3); /* 3rd argument */ 108 setobj2s(L, func + 3, p3); /* 3rd argument */
109 L->top += 4; 109 L->top += 4;
110 /* metamethod may yield only when called from Lua code */ 110 /* metamethod may yield only when called from Lua code */
111 if (isLua(L->ci)) 111 if (isLuacode(L->ci))
112 luaD_call(L, func, 0); 112 luaD_call(L, func, 0);
113 else 113 else
114 luaD_callnoyield(L, func, 0); 114 luaD_callnoyield(L, func, 0);
@@ -124,7 +124,7 @@ void luaT_callTMres (lua_State *L, const TValue *f, const TValue *p1,
124 setobj2s(L, func + 2, p2); /* 2nd argument */ 124 setobj2s(L, func + 2, p2); /* 2nd argument */
125 L->top += 3; 125 L->top += 3;
126 /* metamethod may yield only when called from Lua code */ 126 /* metamethod may yield only when called from Lua code */
127 if (isLua(L->ci)) 127 if (isLuacode(L->ci))
128 luaD_call(L, func, 1); 128 luaD_call(L, func, 1);
129 else 129 else
130 luaD_callnoyield(L, func, 1); 130 luaD_callnoyield(L, func, 1);