aboutsummaryrefslogtreecommitdiff
path: root/lgc.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-01-25 20:14:54 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2002-01-25 20:14:54 -0200
commit50e29525936be4891f9db090f293432913b5f7c0 (patch)
tree8e487b87f82761e15cd096ac345354f57f38fedc /lgc.c
parentb217ae644e3a83def93be2fe742e2cd0970e1a5f (diff)
downloadlua-50e29525936be4891f9db090f293432913b5f7c0.tar.gz
lua-50e29525936be4891f9db090f293432913b5f7c0.tar.bz2
lua-50e29525936be4891f9db090f293432913b5f7c0.zip
first version of dynamic stack
Diffstat (limited to 'lgc.c')
-rw-r--r--lgc.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/lgc.c b/lgc.c
index 696c726c..fe098467 100644
--- a/lgc.c
+++ b/lgc.c
@@ -20,7 +20,6 @@
20#include "ltm.h" 20#include "ltm.h"
21 21
22 22
23
24typedef struct GCState { 23typedef struct GCState {
25 Table *tmark; /* list of marked tables to be visited */ 24 Table *tmark; /* list of marked tables to be visited */
26 Table *toclear; /* list of visited weak tables (to be cleared after GC) */ 25 Table *toclear; /* list of visited weak tables (to be cleared after GC) */
@@ -36,13 +35,14 @@ typedef struct GCState {
36/* mark tricks for userdata */ 35/* mark tricks for userdata */
37#define isudmarked(u) (u->uv.len & 1) 36#define isudmarked(u) (u->uv.len & 1)
38#define markud(u) (u->uv.len |= 1) 37#define markud(u) (u->uv.len |= 1)
39#define unmarkud(u) (u->uv.len--) 38#define unmarkud(u) (u->uv.len &= (~(size_t)1))
40 39
41 40
42/* mark tricks for upvalues (assume that open upvalues are always marked) */ 41/* mark tricks for upvalues (assume that open upvalues are always marked) */
43#define isupvalmarked(uv) ((uv)->v != &(uv)->value) 42#define isupvalmarked(uv) ((uv)->v != &(uv)->value)
44 43
45 44
45
46static void markobject (GCState *st, TObject *o); 46static void markobject (GCState *st, TObject *o);
47 47
48 48
@@ -122,6 +122,17 @@ static void markobject (GCState *st, TObject *o) {
122} 122}
123 123
124 124
125static void checkstacksizes (lua_State *L, StkId lim) {
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)
128 luaD_reallocCI(L, L->size_ci/2); /* still big enough... */
129 if (lim < L->top) lim = L->top;
130 used = lim - L->stack; /* part of stack in use */
131 if (3*used < L->stacksize && 2*BASIC_STACK_SIZE < L->stacksize)
132 luaD_reallocstack(L, L->stacksize/2); /* still big enough... */
133}
134
135
125static void markstacks (GCState *st) { 136static void markstacks (GCState *st) {
126 lua_State *L1 = st->L; 137 lua_State *L1 = st->L;
127 do { /* for each thread */ 138 do { /* for each thread */
@@ -137,6 +148,7 @@ static void markstacks (GCState *st) {
137 lim = (L1->stack_last - L1->ci->base > MAXSTACK) ? L1->ci->base+MAXSTACK 148 lim = (L1->stack_last - L1->ci->base > MAXSTACK) ? L1->ci->base+MAXSTACK
138 : L1->stack_last; 149 : L1->stack_last;
139 for (; o<=lim; o++) setnilvalue(o); 150 for (; o<=lim; o++) setnilvalue(o);
151 checkstacksizes(L1, lim);
140 lua_assert(L1->previous->next == L1 && L1->next->previous == L1); 152 lua_assert(L1->previous->next == L1 && L1->next->previous == L1);
141 L1 = L1->next; 153 L1 = L1->next;
142 } while (L1 != st->L); 154 } while (L1 != st->L);
@@ -374,11 +386,10 @@ static void checkMbuffer (lua_State *L) {
374static void do1gcTM (lua_State *L, Udata *udata) { 386static void do1gcTM (lua_State *L, Udata *udata) {
375 const TObject *tm = fasttm(L, udata->uv.eventtable, TM_GC); 387 const TObject *tm = fasttm(L, udata->uv.eventtable, TM_GC);
376 if (tm != NULL) { 388 if (tm != NULL) {
377 StkId top = L->top; 389 setobj(L->top, tm);
378 setobj(top, tm); 390 setuvalue(L->top+1, udata);
379 setuvalue(top+1, udata);
380 L->top += 2; 391 L->top += 2;
381 luaD_call(L, top, 0); 392 luaD_call(L, L->top - 2, 0);
382 } 393 }
383} 394}
384 395
@@ -396,6 +407,7 @@ static void unprotectedcallGCTM (lua_State *L, void *pu) {
396 do1gcTM(L, udata); 407 do1gcTM(L, udata);
397 /* mark udata as finalized (default event table) */ 408 /* mark udata as finalized (default event table) */
398 uvalue(L->top-1)->uv.eventtable = hvalue(defaultet(L)); 409 uvalue(L->top-1)->uv.eventtable = hvalue(defaultet(L));
410 unmarkud(uvalue(L->top-1));
399 } 411 }
400 L->top--; 412 L->top--;
401} 413}