aboutsummaryrefslogtreecommitdiff
path: root/lvm.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2021-08-18 12:05:06 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2021-08-18 12:05:06 -0300
commit91673a8ec0ae55e188a790bd2dfdc99246adf20e (patch)
tree4370ab4d6fa5127cc6bb44a1dfa62ea5eca8ff88 /lvm.c
parent41871f1803770305f182f56cbd22a336c5236a19 (diff)
downloadlua-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.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/lvm.c b/lvm.c
index df1dec83..29a211c6 100644
--- a/lvm.c
+++ b/lvm.c
@@ -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 */