diff options
| author | Li Jin <dragon-fly@qq.com> | 2021-03-03 21:31:01 +0800 |
|---|---|---|
| committer | Li Jin <dragon-fly@qq.com> | 2021-03-03 21:33:37 +0800 |
| commit | 1df786307c1983b8ce693e3916081a8bcd4e95ae (patch) | |
| tree | 6c7aeb2198d825877fd3d179c394b7a5c1f06a17 /src/lua/lapi.c | |
| parent | 66168b112b707172b9035edf8c1daed469781e06 (diff) | |
| download | yuescript-1df786307c1983b8ce693e3916081a8bcd4e95ae.tar.gz yuescript-1df786307c1983b8ce693e3916081a8bcd4e95ae.tar.bz2 yuescript-1df786307c1983b8ce693e3916081a8bcd4e95ae.zip | |
add new metatable syntax for issue #41, fix reusing local variable issue, update built-in Lua.
Diffstat (limited to 'src/lua/lapi.c')
| -rw-r--r-- | src/lua/lapi.c | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/src/lua/lapi.c b/src/lua/lapi.c index 3583e9c..a9cf2fd 100644 --- a/src/lua/lapi.c +++ b/src/lua/lapi.c | |||
| @@ -39,7 +39,7 @@ const char lua_ident[] = | |||
| 39 | 39 | ||
| 40 | 40 | ||
| 41 | /* | 41 | /* |
| 42 | ** Test for a valid index. | 42 | ** Test for a valid index (one that is not the 'nilvalue'). |
| 43 | ** '!ttisnil(o)' implies 'o != &G(L)->nilvalue', so it is not needed. | 43 | ** '!ttisnil(o)' implies 'o != &G(L)->nilvalue', so it is not needed. |
| 44 | ** However, it covers the most common cases in a faster way. | 44 | ** However, it covers the most common cases in a faster way. |
| 45 | */ | 45 | */ |
| @@ -74,7 +74,8 @@ static TValue *index2value (lua_State *L, int idx) { | |||
| 74 | return &G(L)->nilvalue; /* it has no upvalues */ | 74 | return &G(L)->nilvalue; /* it has no upvalues */ |
| 75 | else { | 75 | else { |
| 76 | CClosure *func = clCvalue(s2v(ci->func)); | 76 | CClosure *func = clCvalue(s2v(ci->func)); |
| 77 | return (idx <= func->nupvalues) ? &func->upvalue[idx-1] : &G(L)->nilvalue; | 77 | return (idx <= func->nupvalues) ? &func->upvalue[idx-1] |
| 78 | : &G(L)->nilvalue; | ||
| 78 | } | 79 | } |
| 79 | } | 80 | } |
| 80 | } | 81 | } |
| @@ -191,9 +192,8 @@ LUA_API void lua_settop (lua_State *L, int idx) { | |||
| 191 | if (diff < 0 && hastocloseCfunc(ci->nresults)) | 192 | if (diff < 0 && hastocloseCfunc(ci->nresults)) |
| 192 | luaF_close(L, L->top + diff, CLOSEKTOP, 0); | 193 | luaF_close(L, L->top + diff, CLOSEKTOP, 0); |
| 193 | #endif | 194 | #endif |
| 195 | api_check(L, L->tbclist < L->top + diff, "cannot pop an unclosed slot"); | ||
| 194 | L->top += diff; | 196 | L->top += diff; |
| 195 | api_check(L, L->openupval == NULL || uplevel(L->openupval) < L->top, | ||
| 196 | "cannot pop an unclosed slot"); | ||
| 197 | lua_unlock(L); | 197 | lua_unlock(L); |
| 198 | } | 198 | } |
| 199 | 199 | ||
| @@ -202,10 +202,10 @@ LUA_API void lua_closeslot (lua_State *L, int idx) { | |||
| 202 | StkId level; | 202 | StkId level; |
| 203 | lua_lock(L); | 203 | lua_lock(L); |
| 204 | level = index2stack(L, idx); | 204 | level = index2stack(L, idx); |
| 205 | api_check(L, hastocloseCfunc(L->ci->nresults) && L->openupval != NULL && | 205 | api_check(L, hastocloseCfunc(L->ci->nresults) && L->tbclist == level, |
| 206 | uplevel(L->openupval) == level, | ||
| 207 | "no variable to close at given level"); | 206 | "no variable to close at given level"); |
| 208 | luaF_close(L, level, CLOSEKTOP, 0); | 207 | luaF_close(L, level, CLOSEKTOP, 0); |
| 208 | level = index2stack(L, idx); /* stack may be moved */ | ||
| 209 | setnilvalue(s2v(level)); | 209 | setnilvalue(s2v(level)); |
| 210 | lua_unlock(L); | 210 | lua_unlock(L); |
| 211 | } | 211 | } |
| @@ -1264,8 +1264,7 @@ LUA_API void lua_toclose (lua_State *L, int idx) { | |||
| 1264 | lua_lock(L); | 1264 | lua_lock(L); |
| 1265 | o = index2stack(L, idx); | 1265 | o = index2stack(L, idx); |
| 1266 | nresults = L->ci->nresults; | 1266 | nresults = L->ci->nresults; |
| 1267 | api_check(L, L->openupval == NULL || uplevel(L->openupval) <= o, | 1267 | api_check(L, L->tbclist < o, "given index below or equal a marked one"); |
| 1268 | "marked index below or equal new one"); | ||
| 1269 | luaF_newtbcupval(L, o); /* create new to-be-closed upvalue */ | 1268 | luaF_newtbcupval(L, o); /* create new to-be-closed upvalue */ |
| 1270 | if (!hastocloseCfunc(nresults)) /* function not marked yet? */ | 1269 | if (!hastocloseCfunc(nresults)) /* function not marked yet? */ |
| 1271 | L->ci->nresults = codeNresults(nresults); /* mark it */ | 1270 | L->ci->nresults = codeNresults(nresults); /* mark it */ |
