diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-01-25 20:14:54 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2002-01-25 20:14:54 -0200 |
commit | 50e29525936be4891f9db090f293432913b5f7c0 (patch) | |
tree | 8e487b87f82761e15cd096ac345354f57f38fedc /lgc.c | |
parent | b217ae644e3a83def93be2fe742e2cd0970e1a5f (diff) | |
download | lua-50e29525936be4891f9db090f293432913b5f7c0.tar.gz lua-50e29525936be4891f9db090f293432913b5f7c0.tar.bz2 lua-50e29525936be4891f9db090f293432913b5f7c0.zip |
first version of dynamic stack
Diffstat (limited to 'lgc.c')
-rw-r--r-- | lgc.c | 24 |
1 files changed, 18 insertions, 6 deletions
@@ -20,7 +20,6 @@ | |||
20 | #include "ltm.h" | 20 | #include "ltm.h" |
21 | 21 | ||
22 | 22 | ||
23 | |||
24 | typedef struct GCState { | 23 | typedef 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 | |||
46 | static void markobject (GCState *st, TObject *o); | 46 | static 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 | ||
125 | static 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 | |||
125 | static void markstacks (GCState *st) { | 136 | static 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) { | |||
374 | static void do1gcTM (lua_State *L, Udata *udata) { | 386 | static 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 | } |