diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2001-01-24 13:45:33 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2001-01-24 13:45:33 -0200 |
commit | 71ae4801d66d9592b0fb08e4e78138b7a6e993d5 (patch) | |
tree | a683b5b3757efb979329bf513f1bd9fde3fb9d1f /ldebug.c | |
parent | 6fda6a530265268c01a83c31f8fc30e34753bbf1 (diff) | |
download | lua-71ae4801d66d9592b0fb08e4e78138b7a6e993d5.tar.gz lua-71ae4801d66d9592b0fb08e4e78138b7a6e993d5.tar.bz2 lua-71ae4801d66d9592b0fb08e4e78138b7a6e993d5.zip |
macros LUA_ENTRY/LUA_EXIT to control exclusive access to Lua core
Diffstat (limited to 'ldebug.c')
-rw-r--r-- | ldebug.c | 73 |
1 files changed, 51 insertions, 22 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ldebug.c,v 1.53 2001/01/18 15:59:09 roberto Exp roberto $ | 2 | ** $Id: ldebug.c,v 1.54 2001/01/19 13:20:30 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 | */ |
@@ -41,15 +41,21 @@ static int isLmark (StkId o) { | |||
41 | 41 | ||
42 | 42 | ||
43 | LUA_API lua_Hook lua_setcallhook (lua_State *L, lua_Hook func) { | 43 | LUA_API lua_Hook lua_setcallhook (lua_State *L, lua_Hook func) { |
44 | lua_Hook oldhook = L->callhook; | 44 | lua_Hook oldhook; |
45 | LUA_ENTRY; | ||
46 | oldhook = L->callhook; | ||
45 | L->callhook = func; | 47 | L->callhook = func; |
48 | LUA_EXIT; | ||
46 | return oldhook; | 49 | return oldhook; |
47 | } | 50 | } |
48 | 51 | ||
49 | 52 | ||
50 | LUA_API lua_Hook lua_setlinehook (lua_State *L, lua_Hook func) { | 53 | LUA_API lua_Hook lua_setlinehook (lua_State *L, lua_Hook func) { |
51 | lua_Hook oldhook = L->linehook; | 54 | lua_Hook oldhook; |
55 | LUA_ENTRY; | ||
56 | oldhook = L->linehook; | ||
52 | L->linehook = func; | 57 | L->linehook = func; |
58 | LUA_EXIT; | ||
53 | return oldhook; | 59 | return oldhook; |
54 | } | 60 | } |
55 | 61 | ||
@@ -68,12 +74,17 @@ static StkId aux_stackedfunction (lua_State *L, int level, StkId top) { | |||
68 | 74 | ||
69 | 75 | ||
70 | LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar) { | 76 | LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar) { |
71 | StkId f = aux_stackedfunction(L, level, L->top); | 77 | StkId f; |
72 | if (f == NULL) return 0; /* there is no such level */ | 78 | int status; |
79 | LUA_ENTRY; | ||
80 | f = aux_stackedfunction(L, level, L->top); | ||
81 | if (f == NULL) status = 0; /* there is no such level */ | ||
73 | else { | 82 | else { |
74 | ar->_func = f; | 83 | ar->_func = f; |
75 | return 1; | 84 | status = 1; |
76 | } | 85 | } |
86 | LUA_EXIT; | ||
87 | return status; | ||
77 | } | 88 | } |
78 | 89 | ||
79 | 90 | ||
@@ -149,25 +160,39 @@ static Proto *getluaproto (StkId f) { | |||
149 | 160 | ||
150 | LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n) { | 161 | LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n) { |
151 | const char *name; | 162 | const char *name; |
152 | StkId f = ar->_func; | 163 | StkId f; |
153 | Proto *fp = getluaproto(f); | 164 | Proto *fp; |
154 | if (!fp) return NULL; /* `f' is not a Lua function? */ | 165 | LUA_ENTRY; |
155 | name = luaF_getlocalname(fp, n, currentpc(f)); | 166 | name = NULL; |
156 | if (!name) return NULL; | 167 | f = ar->_func; |
157 | luaA_pushobject(L, (f+1)+(n-1)); /* push value */ | 168 | fp = getluaproto(f); |
169 | if (fp) { /* `f' is a Lua function? */ | ||
170 | name = luaF_getlocalname(fp, n, currentpc(f)); | ||
171 | if (name) | ||
172 | luaA_pushobject(L, (f+1)+(n-1)); /* push value */ | ||
173 | } | ||
174 | LUA_EXIT; | ||
158 | return name; | 175 | return name; |
159 | } | 176 | } |
160 | 177 | ||
161 | 178 | ||
162 | LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n) { | 179 | LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n) { |
163 | const char *name; | 180 | const char *name; |
164 | StkId f = ar->_func; | 181 | StkId f; |
165 | Proto *fp = getluaproto(f); | 182 | Proto *fp; |
183 | LUA_ENTRY; | ||
184 | name = NULL; | ||
185 | f = ar->_func; | ||
186 | fp = getluaproto(f); | ||
166 | L->top--; /* pop new value */ | 187 | L->top--; /* pop new value */ |
167 | if (!fp) return NULL; /* `f' is not a Lua function? */ | 188 | if (fp) { /* `f' is a Lua function? */ |
168 | name = luaF_getlocalname(fp, n, currentpc(f)); | 189 | name = luaF_getlocalname(fp, n, currentpc(f)); |
169 | if (!name || name[0] == '(') return NULL; /* `(' starts private locals */ | 190 | if (!name || name[0] == '(') /* `(' starts private locals */ |
170 | setobj((f+1)+(n-1), L->top); | 191 | name = NULL; |
192 | else | ||
193 | setobj((f+1)+(n-1), L->top); | ||
194 | } | ||
195 | LUA_EXIT; | ||
171 | return name; | 196 | return name; |
172 | } | 197 | } |
173 | 198 | ||
@@ -189,7 +214,7 @@ static void funcinfo (lua_State *L, lua_Debug *ar, StkId func) { | |||
189 | cl = infovalue(func)->func; | 214 | cl = infovalue(func)->func; |
190 | break; | 215 | break; |
191 | default: | 216 | default: |
192 | lua_error(L, "value for `lua_getinfo' is not a function"); | 217 | luaD_error(L, "value for `lua_getinfo' is not a function"); |
193 | } | 218 | } |
194 | if (cl->isC) { | 219 | if (cl->isC) { |
195 | ar->source = "=C"; | 220 | ar->source = "=C"; |
@@ -245,7 +270,10 @@ static void getname (lua_State *L, StkId f, lua_Debug *ar) { | |||
245 | 270 | ||
246 | LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) { | 271 | LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) { |
247 | StkId func; | 272 | StkId func; |
248 | int isactive = (*what != '>'); | 273 | int isactive; |
274 | int status = 1; | ||
275 | LUA_ENTRY; | ||
276 | isactive = (*what != '>'); | ||
249 | if (isactive) | 277 | if (isactive) |
250 | func = ar->_func; | 278 | func = ar->_func; |
251 | else { | 279 | else { |
@@ -277,11 +305,12 @@ LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) { | |||
277 | incr_top; /* push function */ | 305 | incr_top; /* push function */ |
278 | break; | 306 | break; |
279 | } | 307 | } |
280 | default: return 0; /* invalid option */ | 308 | default: status = 0; /* invalid option */ |
281 | } | 309 | } |
282 | } | 310 | } |
283 | if (!isactive) L->top--; /* pop function */ | 311 | if (!isactive) L->top--; /* pop function */ |
284 | return 1; | 312 | LUA_EXIT; |
313 | return status; | ||
285 | } | 314 | } |
286 | 315 | ||
287 | 316 | ||