aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-11-21 12:17:15 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-11-21 12:17:15 -0200
commitaff97fffc4a63cd25af313b4790409477c13d68a (patch)
treea8227590a91cdb15207523cb83023ac48158e7c8
parent1648674653bd33775a6ab31539f9d9490b3282ae (diff)
downloadlua-aff97fffc4a63cd25af313b4790409477c13d68a.tar.gz
lua-aff97fffc4a63cd25af313b4790409477c13d68a.tar.bz2
lua-aff97fffc4a63cd25af313b4790409477c13d68a.zip
C functions cannot increase its top without filling the stack
-rw-r--r--lgc.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/lgc.c b/lgc.c
index 15338987..6c33df95 100644
--- a/lgc.c
+++ b/lgc.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lgc.c,v 1.158 2002/11/14 11:51:50 roberto Exp roberto $ 2** $Id: lgc.c,v 1.159 2002/11/18 11:01:55 roberto Exp roberto $
3** Garbage Collector 3** Garbage Collector
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -234,14 +234,16 @@ static void traversestack (GCState *st, lua_State *L1) {
234 StkId o, lim; 234 StkId o, lim;
235 CallInfo *ci; 235 CallInfo *ci;
236 markobject(st, gt(L1)); 236 markobject(st, gt(L1));
237 for (o=L1->stack; o<L1->top; o++) 237 lim = L1->top;
238 markobject(st, o);
239 lim = o;
240 for (ci = L1->base_ci; ci <= L1->ci; ci++) { 238 for (ci = L1->base_ci; ci <= L1->ci; ci++) {
241 lua_assert(ci->top <= L1->stack_last); 239 lua_assert(ci->top <= L1->stack_last);
242 if (lim < ci->top) lim = ci->top; 240 if (!(ci->state & CI_C) && lim < ci->top)
241 lim = ci->top;
243 } 242 }
244 for (; o<=lim; o++) setnilvalue(o); 243 for (o = L1->stack; o < L1->top; o++)
244 markobject(st, o);
245 for (; o <= lim; o++)
246 setnilvalue(o);
245 checkstacksizes(L1, lim); 247 checkstacksizes(L1, lim);
246} 248}
247 249