summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ldo.c36
-rw-r--r--lgc.c16
-rw-r--r--lstate.c3
3 files changed, 32 insertions, 23 deletions
diff --git a/ldo.c b/ldo.c
index 2c2a28cd..ed18aec7 100644
--- a/ldo.c
+++ b/ldo.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ldo.c,v 1.154 2002/01/11 20:27:41 roberto Exp $ 2** $Id: ldo.c,v 1.160 2002/02/14 21:40:13 roberto Exp $
3** Stack and Call structure of Lua 3** Stack and Call structure of Lua
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -86,7 +86,7 @@ void luaD_growstack (lua_State *L, int n) {
86 else { 86 else {
87 if (n <= L->stacksize && 2*L->stacksize < LUA_MAXSTACK) /* can double? */ 87 if (n <= L->stacksize && 2*L->stacksize < LUA_MAXSTACK) /* can double? */
88 luaD_reallocstack(L, 2*L->stacksize); 88 luaD_reallocstack(L, 2*L->stacksize);
89 else if (L->stacksize+n <= LUA_MAXSTACK) /* no overflow? */ 89 else if ((L->top - L->stack) + n <= LUA_MAXSTACK) /* no overflow? */
90 luaD_reallocstack(L, LUA_MAXSTACK); 90 luaD_reallocstack(L, LUA_MAXSTACK);
91 else { 91 else {
92 /* resize to maximum + some extra space to handle error */ 92 /* resize to maximum + some extra space to handle error */
@@ -108,7 +108,7 @@ static void luaD_openstack (lua_State *L, StkId pos) {
108 108
109 109
110static void dohook (lua_State *L, lua_Debug *ar, lua_Hook hook) { 110static void dohook (lua_State *L, lua_Debug *ar, lua_Hook hook) {
111 L->ci->top = L->top; 111 StkId top = L->top;
112 luaD_checkstack(L, LUA_MINSTACK); /* ensure minimum stack size */ 112 luaD_checkstack(L, LUA_MINSTACK); /* ensure minimum stack size */
113 L->allowhooks = 0; /* cannot call hooks inside a hook */ 113 L->allowhooks = 0; /* cannot call hooks inside a hook */
114 lua_unlock(L); 114 lua_unlock(L);
@@ -116,7 +116,7 @@ static void dohook (lua_State *L, lua_Debug *ar, lua_Hook hook) {
116 lua_lock(L); 116 lua_lock(L);
117 lua_assert(L->allowhooks == 0); 117 lua_assert(L->allowhooks == 0);
118 L->allowhooks = 1; 118 L->allowhooks = 1;
119 L->top = L->ci->top; 119 L->top = top;
120} 120}
121 121
122 122
@@ -137,6 +137,7 @@ static void luaD_callHook (lua_State *L, lua_Hook callhook, const char *event) {
137 ar.event = event; 137 ar.event = event;
138 ar._ci = L->ci - L->base_ci; 138 ar._ci = L->ci - L->base_ci;
139 L->ci->pc = NULL; /* function is not active */ 139 L->ci->pc = NULL; /* function is not active */
140 L->ci->top = L->top + LUA_MINSTACK;
140 dohook(L, &ar, callhook); 141 dohook(L, &ar, callhook);
141 } 142 }
142} 143}
@@ -186,6 +187,19 @@ static void adjust_varargs (lua_State *L, int nfixargs) {
186} 187}
187 188
188 189
190static StkId tryfuncTM (lua_State *L, StkId func) {
191 const TObject *tm = luaT_gettmbyobj(L, func, TM_CALL);
192 if (ttype(tm) != LUA_TFUNCTION) {
193 L->ci--; /* undo increment (no function here) */
194 luaG_typeerror(L, func, "call");
195 }
196 luaD_openstack(L, func);
197 func = L->ci->base - 1; /* previous call may change stack */
198 setobj(func, tm); /* tag method is the new function to be called */
199 return func;
200}
201
202
189StkId luaD_precall (lua_State *L, StkId func) { 203StkId luaD_precall (lua_State *L, StkId func) {
190 CallInfo *ci; 204 CallInfo *ci;
191 LClosure *cl; 205 LClosure *cl;
@@ -193,17 +207,8 @@ StkId luaD_precall (lua_State *L, StkId func) {
193 ci = L->ci; 207 ci = L->ci;
194 ci->base = func+1; 208 ci->base = func+1;
195 ci->pc = NULL; 209 ci->pc = NULL;
196 if (ttype(func) != LUA_TFUNCTION) { 210 if (ttype(func) != LUA_TFUNCTION) /* `func' is not a function? */
197 /* `func' is not a function; check the `function' tag method */ 211 func = tryfuncTM(L, func); /* check the `function' tag method */
198 const TObject *tm = luaT_gettmbyobj(L, func, TM_CALL);
199 if (ttype(tm) != LUA_TFUNCTION) {
200 L->ci--; /* undo increment (no function here) */
201 luaG_typeerror(L, func, "call");
202 }
203 luaD_openstack(L, func);
204 func = ci->base - 1; /* previous call may change stack */
205 setobj(func, tm); /* tag method is the new function to be called */
206 }
207 cl = &clvalue(func)->l; 212 cl = &clvalue(func)->l;
208 if (L->callhook) { 213 if (L->callhook) {
209 luaD_callHook(L, L->callhook, "call"); 214 luaD_callHook(L, L->callhook, "call");
@@ -226,6 +231,7 @@ StkId luaD_precall (lua_State *L, StkId func) {
226 else { /* if is a C function, call it */ 231 else { /* if is a C function, call it */
227 int n; 232 int n;
228 luaD_checkstack(L, LUA_MINSTACK); /* ensure minimum stack size */ 233 luaD_checkstack(L, LUA_MINSTACK); /* ensure minimum stack size */
234 ci->top = L->top + LUA_MINSTACK;
229 lua_unlock(L); 235 lua_unlock(L);
230#if LUA_COMPATUPVALUES 236#if LUA_COMPATUPVALUES
231 lua_pushupvalues(L); 237 lua_pushupvalues(L);
diff --git a/lgc.c b/lgc.c
index 884f689f..1088cb23 100644
--- a/lgc.c
+++ b/lgc.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lgc.c,v 1.128 2002/03/04 21:32:34 roberto Exp roberto $ 2** $Id: lgc.c,v 1.129 2002/03/05 16:22:54 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*/
@@ -122,12 +122,12 @@ static void reallymarkobject (GCState *st, TObject *o) {
122} 122}
123 123
124 124
125static void checkstacksizes (lua_State *L) { 125static void checkstacksizes (lua_State *L, StkId max) {
126 int used = L->ci - L->base_ci; /* number of `ci' in use */ 126 int used = L->ci - L->base_ci; /* number of `ci' in use */
127 if (4*used < L->size_ci && 2*BASIC_CI_SIZE < L->size_ci) 127 if (4*used < L->size_ci && 2*BASIC_CI_SIZE < L->size_ci)
128 luaD_reallocCI(L, L->size_ci/2); /* still big enough... */ 128 luaD_reallocCI(L, L->size_ci/2); /* still big enough... */
129 used = L->top - L->stack; /* part of stack in use */ 129 used = max - L->stack; /* part of stack in use */
130 if (2*(used+MAXSTACK) < L->stacksize && 2*BASIC_STACK_SIZE < L->stacksize) 130 if (4*used < L->stacksize && 2*BASIC_STACK_SIZE < L->stacksize)
131 luaD_reallocstack(L, L->stacksize/2); /* still big enough... */ 131 luaD_reallocstack(L, L->stacksize/2); /* still big enough... */
132} 132}
133 133
@@ -136,6 +136,7 @@ static void markstacks (GCState *st) {
136 lua_State *L1 = st->L; 136 lua_State *L1 = st->L;
137 do { /* for each thread */ 137 do { /* for each thread */
138 StkId o, lim; 138 StkId o, lim;
139 CallInfo *ci;
139 if (L1->base_ci == NULL) { /* incomplete state? */ 140 if (L1->base_ci == NULL) { /* incomplete state? */
140 lua_assert(L1 != st->L); 141 lua_assert(L1 != st->L);
141 L1 = L1->next; 142 L1 = L1->next;
@@ -144,10 +145,11 @@ static void markstacks (GCState *st) {
144 } 145 }
145 for (o=L1->stack; o<L1->top; o++) 146 for (o=L1->stack; o<L1->top; o++)
146 markobject(st, o); 147 markobject(st, o);
147 lim = (L1->stack_last - L1->ci->base > MAXSTACK) ? L1->ci->base+MAXSTACK 148 lim = o;
148 : L1->stack_last; 149 for (ci = L1->base_ci; ci <= L1->ci; ci++)
150 if (lim < ci->top) lim = ci->top;
149 for (; o<=lim; o++) setnilvalue(o); 151 for (; o<=lim; o++) setnilvalue(o);
150 checkstacksizes(L1); 152 checkstacksizes(L1, lim);
151 lua_assert(L1->previous->next == L1 && L1->next->previous == L1); 153 lua_assert(L1->previous->next == L1 && L1->next->previous == L1);
152 L1 = L1->next; 154 L1 = L1->next;
153 } while (L1 != st->L); 155 } while (L1 != st->L);
diff --git a/lstate.c b/lstate.c
index ea625ccc..45a0cec9 100644
--- a/lstate.c
+++ b/lstate.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lstate.c,v 1.84 2002/02/14 21:40:13 roberto Exp roberto $ 2** $Id: lstate.c,v 1.85 2002/03/05 16:22:54 roberto Exp roberto $
3** Global State 3** Global State
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -33,6 +33,7 @@ static void stack_init (lua_State *L, lua_State *OL) {
33 L->base_ci = luaM_newvector(OL, BASIC_CI_SIZE, CallInfo); 33 L->base_ci = luaM_newvector(OL, BASIC_CI_SIZE, CallInfo);
34 L->ci = L->base_ci; 34 L->ci = L->base_ci;
35 L->ci->base = L->top; 35 L->ci->base = L->top;
36 L->ci->top = L->top;
36 L->ci->pc = NULL; 37 L->ci->pc = NULL;
37 L->size_ci = BASIC_CI_SIZE; 38 L->size_ci = BASIC_CI_SIZE;
38 L->end_ci = L->base_ci + L->size_ci; 39 L->end_ci = L->base_ci + L->size_ci;