diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2021-08-18 12:05:06 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2021-08-18 12:05:06 -0300 |
commit | 91673a8ec0ae55e188a790bd2dfdc99246adf20e (patch) | |
tree | 4370ab4d6fa5127cc6bb44a1dfa62ea5eca8ff88 /lvm.c | |
parent | 41871f1803770305f182f56cbd22a336c5236a19 (diff) | |
download | lua-91673a8ec0ae55e188a790bd2dfdc99246adf20e.tar.gz lua-91673a8ec0ae55e188a790bd2dfdc99246adf20e.tar.bz2 lua-91673a8ec0ae55e188a790bd2dfdc99246adf20e.zip |
'luaD_tryfuncTM' checks stack space by itself
Diffstat (limited to 'lvm.c')
-rw-r--r-- | lvm.c | 11 |
1 files changed, 6 insertions, 5 deletions
@@ -1657,9 +1657,8 @@ void luaV_execute (lua_State *L, CallInfo *ci) { | |||
1657 | lua_assert(base == ci->func + 1); | 1657 | lua_assert(base == ci->func + 1); |
1658 | } | 1658 | } |
1659 | while (!ttisfunction(s2v(ra))) { /* not a function? */ | 1659 | while (!ttisfunction(s2v(ra))) { /* not a function? */ |
1660 | luaD_tryfuncTM(L, ra); /* try '__call' metamethod */ | 1660 | ra = luaD_tryfuncTM(L, ra); /* try '__call' metamethod */ |
1661 | b++; /* there is now one extra argument */ | 1661 | b++; /* there is now one extra argument */ |
1662 | checkstackGCp(L, 1, ra); | ||
1663 | } | 1662 | } |
1664 | if (!ttisLclosure(s2v(ra))) { /* C function? */ | 1663 | if (!ttisLclosure(s2v(ra))) { /* C function? */ |
1665 | luaD_precall(L, ra, LUA_MULTRET); /* call it */ | 1664 | luaD_precall(L, ra, LUA_MULTRET); /* call it */ |
@@ -1670,9 +1669,11 @@ void luaV_execute (lua_State *L, CallInfo *ci) { | |||
1670 | updatetrap(ci); /* 'luaD_poscall' can change hooks */ | 1669 | updatetrap(ci); /* 'luaD_poscall' can change hooks */ |
1671 | goto ret; /* caller returns after the tail call */ | 1670 | goto ret; /* caller returns after the tail call */ |
1672 | } | 1671 | } |
1673 | ci->func -= delta; /* restore 'func' (if vararg) */ | 1672 | else { /* Lua function */ |
1674 | luaD_pretailcall(L, ci, ra, b); /* prepare call frame */ | 1673 | ci->func -= delta; /* restore 'func' (if vararg) */ |
1675 | goto startfunc; /* execute the callee */ | 1674 | luaD_pretailcall(L, ci, ra, b); /* prepare call frame */ |
1675 | goto startfunc; /* execute the callee */ | ||
1676 | } | ||
1676 | } | 1677 | } |
1677 | vmcase(OP_RETURN) { | 1678 | vmcase(OP_RETURN) { |
1678 | int n = GETARG_B(i) - 1; /* number of results */ | 1679 | int n = GETARG_B(i) - 1; /* number of results */ |