aboutsummaryrefslogtreecommitdiff
path: root/ltm.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2020-07-07 18:03:48 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2020-07-07 18:03:48 -0300
commiteb41999461b6f428186c55abd95f4ce1a76217d5 (patch)
tree577e56c4ad5999b34966232b1e2a2bf9a63f7cc2 /ltm.c
parent314c6057b785cd94ac88905ccfce61724107d66b (diff)
downloadlua-eb41999461b6f428186c55abd95f4ce1a76217d5.tar.gz
lua-eb41999461b6f428186c55abd95f4ce1a76217d5.tar.bz2
lua-eb41999461b6f428186c55abd95f4ce1a76217d5.zip
Fixed bugs of stack reallocation x GC
Macro 'checkstackGC' was doing a GC step after resizing the stack; the GC could shrink the stack and undo the resize. Moreover, macro 'checkstackp' also does a GC step, which could remove the preallocated CallInfo when calling a function. (Its name has been changed to 'checkstackGCp' to emphasize that it calls the GC.)
Diffstat (limited to 'ltm.c')
-rw-r--r--ltm.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/ltm.c b/ltm.c
index ae60983f..4770f96b 100644
--- a/ltm.c
+++ b/ltm.c
@@ -240,7 +240,7 @@ void luaT_adjustvarargs (lua_State *L, int nfixparams, CallInfo *ci,
240 int actual = cast_int(L->top - ci->func) - 1; /* number of arguments */ 240 int actual = cast_int(L->top - ci->func) - 1; /* number of arguments */
241 int nextra = actual - nfixparams; /* number of extra arguments */ 241 int nextra = actual - nfixparams; /* number of extra arguments */
242 ci->u.l.nextraargs = nextra; 242 ci->u.l.nextraargs = nextra;
243 checkstackGC(L, p->maxstacksize + 1); 243 luaD_checkstack(L, p->maxstacksize + 1);
244 /* copy function to the top of the stack */ 244 /* copy function to the top of the stack */
245 setobjs2s(L, L->top++, ci->func); 245 setobjs2s(L, L->top++, ci->func);
246 /* move fixed parameters to the top of the stack */ 246 /* move fixed parameters to the top of the stack */
@@ -259,7 +259,7 @@ void luaT_getvarargs (lua_State *L, CallInfo *ci, StkId where, int wanted) {
259 int nextra = ci->u.l.nextraargs; 259 int nextra = ci->u.l.nextraargs;
260 if (wanted < 0) { 260 if (wanted < 0) {
261 wanted = nextra; /* get all extra arguments available */ 261 wanted = nextra; /* get all extra arguments available */
262 checkstackp(L, nextra, where); /* ensure stack space */ 262 checkstackGCp(L, nextra, where); /* ensure stack space */
263 L->top = where + nextra; /* next instruction will need top */ 263 L->top = where + nextra; /* next instruction will need top */
264 } 264 }
265 for (i = 0; i < wanted && i < nextra; i++) 265 for (i = 0; i < wanted && i < nextra; i++)