diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2018-11-29 16:02:44 -0200 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2018-11-29 16:02:44 -0200 |
| commit | 6d04537ea660fd12fc16c328366b701fabaf4919 (patch) | |
| tree | 41eab6e4d87552e29731db552f7d58d679c56973 /lvm.c | |
| parent | 7696c6474fe51ed59fee324e78c1233af74febdd (diff) | |
| download | lua-6d04537ea660fd12fc16c328366b701fabaf4919.tar.gz lua-6d04537ea660fd12fc16c328366b701fabaf4919.tar.bz2 lua-6d04537ea660fd12fc16c328366b701fabaf4919.zip | |
A to-be-closed variable must have a closable value (or be nil)
It is an error for a to-be-closed variable to have a non-closable
non-nil value when it is being closed. This situation does not seem to
be useful and often hints to an error. (Particularly in the C API, it is
easy to change a to-be-closed index by mistake.)
Diffstat (limited to 'lvm.c')
| -rw-r--r-- | lvm.c | 7 |
1 files changed, 3 insertions, 4 deletions
| @@ -1427,7 +1427,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) { | |||
| 1427 | } | 1427 | } |
| 1428 | vmcase(OP_CLOSE) { | 1428 | vmcase(OP_CLOSE) { |
| 1429 | L->top = ra + 1; /* everything is free after this slot */ | 1429 | L->top = ra + 1; /* everything is free after this slot */ |
| 1430 | ProtectNT(luaF_close(L, ra, LUA_OK)); | 1430 | Protect(luaF_close(L, ra, LUA_OK)); |
| 1431 | vmbreak; | 1431 | vmbreak; |
| 1432 | } | 1432 | } |
| 1433 | vmcase(OP_TBC) { | 1433 | vmcase(OP_TBC) { |
| @@ -1717,9 +1717,8 @@ void luaV_execute (lua_State *L, CallInfo *ci) { | |||
| 1717 | vmbreak; | 1717 | vmbreak; |
| 1718 | } | 1718 | } |
| 1719 | vmcase(OP_TFORPREP) { | 1719 | vmcase(OP_TFORPREP) { |
| 1720 | /* is 'toclose' a function or has a '__close' metamethod? */ | 1720 | /* is 'toclose' not nil? */ |
| 1721 | if (ttisfunction(s2v(ra + 3)) || | 1721 | if (!ttisnil(s2v(ra + 3))) { |
| 1722 | !ttisnil(luaT_gettmbyobj(L, s2v(ra + 3), TM_CLOSE))) { | ||
| 1723 | /* create to-be-closed upvalue for it */ | 1722 | /* create to-be-closed upvalue for it */ |
| 1724 | halfProtect(luaF_newtbcupval(L, ra + 3)); | 1723 | halfProtect(luaF_newtbcupval(L, ra + 3)); |
| 1725 | } | 1724 | } |
