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 /ltm.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 'ltm.c')
| -rw-r--r-- | ltm.c | 19 |
1 files changed, 15 insertions, 4 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ltm.c,v 1.60 2001/01/18 15:59:09 roberto Exp roberto $ | 2 | ** $Id: ltm.c,v 1.61 2001/01/19 13:20:30 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 | */ |
| @@ -84,10 +84,14 @@ void luaT_init (lua_State *L) { | |||
| 84 | 84 | ||
| 85 | 85 | ||
| 86 | LUA_API int lua_newtag (lua_State *L) { | 86 | LUA_API int lua_newtag (lua_State *L) { |
| 87 | int tag; | ||
| 88 | LUA_ENTRY; | ||
| 87 | luaM_growvector(L, G(L)->TMtable, G(L)->ntag, G(L)->sizeTM, struct TM, | 89 | luaM_growvector(L, G(L)->TMtable, G(L)->ntag, G(L)->sizeTM, struct TM, |
| 88 | MAX_INT, "tag table overflow"); | 90 | MAX_INT, "tag table overflow"); |
| 89 | init_entry(L, G(L)->ntag); | 91 | init_entry(L, G(L)->ntag); |
| 90 | return G(L)->ntag++; | 92 | tag = G(L)->ntag++; |
| 93 | LUA_EXIT; | ||
| 94 | return tag; | ||
| 91 | } | 95 | } |
| 92 | 96 | ||
| 93 | 97 | ||
| @@ -104,12 +108,14 @@ void luaT_realtag (lua_State *L, int tag) { | |||
| 104 | 108 | ||
| 105 | LUA_API int lua_copytagmethods (lua_State *L, int tagto, int tagfrom) { | 109 | LUA_API int lua_copytagmethods (lua_State *L, int tagto, int tagfrom) { |
| 106 | int e; | 110 | int e; |
| 111 | LUA_ENTRY; | ||
| 107 | checktag(L, tagto); | 112 | checktag(L, tagto); |
| 108 | checktag(L, tagfrom); | 113 | checktag(L, tagfrom); |
| 109 | for (e=0; e<TM_N; e++) { | 114 | for (e=0; e<TM_N; e++) { |
| 110 | if (luaT_validevent(tagto, e)) | 115 | if (luaT_validevent(tagto, e)) |
| 111 | luaT_gettm(G(L), tagto, e) = luaT_gettm(G(L), tagfrom, e); | 116 | luaT_gettm(G(L), tagto, e) = luaT_gettm(G(L), tagfrom, e); |
| 112 | } | 117 | } |
| 118 | LUA_EXIT; | ||
| 113 | return tagto; | 119 | return tagto; |
| 114 | } | 120 | } |
| 115 | 121 | ||
| @@ -126,6 +132,7 @@ int luaT_tag (const TObject *o) { | |||
| 126 | 132 | ||
| 127 | LUA_API void lua_gettagmethod (lua_State *L, int t, const char *event) { | 133 | LUA_API void lua_gettagmethod (lua_State *L, int t, const char *event) { |
| 128 | int e; | 134 | int e; |
| 135 | LUA_ENTRY; | ||
| 129 | e = luaI_checkevent(L, event, t); | 136 | e = luaI_checkevent(L, event, t); |
| 130 | checktag(L, t); | 137 | checktag(L, t); |
| 131 | if (luaT_validevent(t, e) && luaT_gettm(G(L), t, e)) { | 138 | if (luaT_validevent(t, e) && luaT_gettm(G(L), t, e)) { |
| @@ -134,11 +141,14 @@ LUA_API void lua_gettagmethod (lua_State *L, int t, const char *event) { | |||
| 134 | else | 141 | else |
| 135 | setnilvalue(L->top); | 142 | setnilvalue(L->top); |
| 136 | incr_top; | 143 | incr_top; |
| 144 | LUA_EXIT; | ||
| 137 | } | 145 | } |
| 138 | 146 | ||
| 139 | 147 | ||
| 140 | LUA_API void lua_settagmethod (lua_State *L, int t, const char *event) { | 148 | LUA_API void lua_settagmethod (lua_State *L, int t, const char *event) { |
| 141 | int e = luaI_checkevent(L, event, t); | 149 | int e; |
| 150 | LUA_ENTRY; | ||
| 151 | e = luaI_checkevent(L, event, t); | ||
| 142 | checktag(L, t); | 152 | checktag(L, t); |
| 143 | if (!luaT_validevent(t, e)) | 153 | if (!luaT_validevent(t, e)) |
| 144 | luaO_verror(L, "cannot change `%.20s' tag method for type `%.20s'%.20s", | 154 | luaO_verror(L, "cannot change `%.20s' tag method for type `%.20s'%.20s", |
| @@ -153,8 +163,9 @@ LUA_API void lua_settagmethod (lua_State *L, int t, const char *event) { | |||
| 153 | luaT_gettm(G(L), t, e) = clvalue(L->top - 1); | 163 | luaT_gettm(G(L), t, e) = clvalue(L->top - 1); |
| 154 | break; | 164 | break; |
| 155 | default: | 165 | default: |
| 156 | lua_error(L, "tag method must be a function (or nil)"); | 166 | luaD_error(L, "tag method must be a function (or nil)"); |
| 157 | } | 167 | } |
| 158 | L->top--; | 168 | L->top--; |
| 169 | LUA_EXIT; | ||
| 159 | } | 170 | } |
| 160 | 171 | ||
