aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2013-08-27 17:04:00 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2013-08-27 17:04:00 -0300
commit90972ff136f310f00b04d9e9837ee0640983b743 (patch)
tree5362eb13fd6ab3d314bc9baefe3d73b1f0e02fad
parentaf35c7f398e8149b5f2481b63b399674e4ecdf7e (diff)
downloadlua-90972ff136f310f00b04d9e9837ee0640983b743.tar.gz
lua-90972ff136f310f00b04d9e9837ee0640983b743.tar.bz2
lua-90972ff136f310f00b04d9e9837ee0640983b743.zip
LOCALBLACK changed to LOCALMARK and used also to control whether object
is in 'localgc' list + luaC_newobj by default puts object in 'localgc' list
-rw-r--r--lfunc.c10
-rw-r--r--lgc.c16
-rw-r--r--lgc.h4
-rw-r--r--lstring.c6
-rw-r--r--ltable.c4
-rw-r--r--ltests.c4
6 files changed, 24 insertions, 20 deletions
diff --git a/lfunc.c b/lfunc.c
index 5bbae69c..0db0a87b 100644
--- a/lfunc.c
+++ b/lfunc.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lfunc.c,v 2.35 2013/08/26 12:41:10 roberto Exp roberto $ 2** $Id: lfunc.c,v 2.36 2013/08/27 18:53:35 roberto Exp roberto $
3** Auxiliary functions to manipulate prototypes and closures 3** Auxiliary functions to manipulate prototypes and closures
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -21,16 +21,14 @@
21 21
22 22
23Closure *luaF_newCclosure (lua_State *L, int n) { 23Closure *luaF_newCclosure (lua_State *L, int n) {
24 Closure *c = &luaC_newobj(L, LUA_TCCL, sizeCclosure(n), 24 Closure *c = &luaC_newobj(L, LUA_TCCL, sizeCclosure(n), NULL, 0)->cl;
25 &G(L)->localgc, 0)->cl;
26 c->c.nupvalues = cast_byte(n); 25 c->c.nupvalues = cast_byte(n);
27 return c; 26 return c;
28} 27}
29 28
30 29
31Closure *luaF_newLclosure (lua_State *L, int n) { 30Closure *luaF_newLclosure (lua_State *L, int n) {
32 Closure *c = &luaC_newobj(L, LUA_TLCL, sizeLclosure(n), 31 Closure *c = &luaC_newobj(L, LUA_TLCL, sizeLclosure(n), NULL, 0)->cl;
33 &G(L)->localgc, 0)->cl;
34 c->l.p = NULL; 32 c->l.p = NULL;
35 c->l.nupvalues = cast_byte(n); 33 c->l.nupvalues = cast_byte(n);
36 while (n--) c->l.upvals[n] = NULL; 34 while (n--) c->l.upvals[n] = NULL;
@@ -87,7 +85,7 @@ void luaF_close (lua_State *L, StkId level) {
87 85
88 86
89Proto *luaF_newproto (lua_State *L) { 87Proto *luaF_newproto (lua_State *L) {
90 Proto *f = &luaC_newobj(L, LUA_TPROTO, sizeof(Proto), NULL, 0)->p; 88 Proto *f = &luaC_newobj(L, LUA_TPROTO, sizeof(Proto), &G(L)->allgc, 0)->p;
91 nolocal(obj2gco(f)); /* prototypes are never local */ 89 nolocal(obj2gco(f)); /* prototypes are never local */
92 f->k = NULL; 90 f->k = NULL;
93 f->sizek = 0; 91 f->sizek = 0;
diff --git a/lgc.c b/lgc.c
index f09af8e7..f905d9d5 100644
--- a/lgc.c
+++ b/lgc.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lgc.c,v 2.152 2013/08/26 12:41:10 roberto Exp roberto $ 2** $Id: lgc.c,v 2.153 2013/08/27 18:53:35 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*/
@@ -208,9 +208,11 @@ GCObject *luaC_newobj (lua_State *L, int tt, size_t sz, GCObject **list,
208 global_State *g = G(L); 208 global_State *g = G(L);
209 char *raw = cast(char *, luaM_newobject(L, novariant(tt), sz)); 209 char *raw = cast(char *, luaM_newobject(L, novariant(tt), sz));
210 GCObject *o = obj2gco(raw + offset); 210 GCObject *o = obj2gco(raw + offset);
211 if (list == NULL)
212 list = &g->allgc; /* standard list for collectable objects */
213 gch(o)->marked = luaC_white(g); 211 gch(o)->marked = luaC_white(g);
212 if (list == NULL)
213 list = &g->localgc; /* standard list for collectable objects */
214 else
215 l_setbit(gch(o)->marked, LOCALMARK); /* mark object as not in 'localgc' */
214 gch(o)->tt = tt; 216 gch(o)->tt = tt;
215 gch(o)->next = *list; 217 gch(o)->next = *list;
216 *list = o; 218 *list = o;
@@ -894,7 +896,7 @@ static void localmarkthread (lua_State *l) {
894 return; /* stack not completely built yet */ 896 return; /* stack not completely built yet */
895 for (; o < l->top; o++) { /* mark live elements in the stack */ 897 for (; o < l->top; o++) { /* mark live elements in the stack */
896 if (iscollectable(o)) 898 if (iscollectable(o))
897 l_setbit(gcvalue(o)->gch.marked, LOCALBLACK); 899 l_setbit(gcvalue(o)->gch.marked, LOCALMARK);
898 } 900 }
899} 901}
900 902
@@ -918,10 +920,12 @@ static void localsweep (lua_State *L, global_State *g, GCObject **p) {
918 *p = curr->gch.next; /* remove 'curr' from list */ 920 *p = curr->gch.next; /* remove 'curr' from list */
919 curr->gch.next = g->allgc; /* link 'curr' in 'allgc' list */ 921 curr->gch.next = g->allgc; /* link 'curr' in 'allgc' list */
920 g->allgc = curr; 922 g->allgc = curr;
923 /* mark it as out of local list */
924 l_setbit(curr->gch.marked, LOCALMARK);
921 } 925 }
922 else { /* still local */ 926 else { /* still local */
923 if (testbit(curr->gch.marked, LOCALBLACK)) { /* locally alive? */ 927 if (testbit(curr->gch.marked, LOCALMARK)) { /* locally alive? */
924 resetbit(curr->gch.marked, LOCALBLACK); 928 resetbit(curr->gch.marked, LOCALMARK);
925 p = &curr->gch.next; /* go to next element */ 929 p = &curr->gch.next; /* go to next element */
926 } 930 }
927 else { /* object is dead */ 931 else { /* object is dead */
diff --git a/lgc.h b/lgc.h
index 13563db3..cce4293b 100644
--- a/lgc.h
+++ b/lgc.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lgc.h,v 2.66 2013/08/23 13:34:54 roberto Exp roberto $ 2** $Id: lgc.h,v 2.67 2013/08/27 18:53:35 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*/
@@ -77,7 +77,7 @@
77#define BLACKBIT 2 /* object is black */ 77#define BLACKBIT 2 /* object is black */
78#define FINALIZEDBIT 3 /* object has been marked for finalization */ 78#define FINALIZEDBIT 3 /* object has been marked for finalization */
79#define LOCALBIT 4 /* object is not local */ 79#define LOCALBIT 4 /* object is not local */
80#define LOCALBLACK 5 /* object is 'locally black' */ 80#define LOCALMARK 5 /* object is 'locally marked' or out of local list */
81/* bit 7 is currently used by tests (luaL_checkmemory) */ 81/* bit 7 is currently used by tests (luaL_checkmemory) */
82 82
83#define WHITEBITS bit2mask(WHITE0BIT, WHITE1BIT) 83#define WHITEBITS bit2mask(WHITE0BIT, WHITE1BIT)
diff --git a/lstring.c b/lstring.c
index 6d1ce978..3fb86ab2 100644
--- a/lstring.c
+++ b/lstring.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lstring.c,v 2.30 2013/08/22 15:21:48 roberto Exp roberto $ 2** $Id: lstring.c,v 2.31 2013/08/23 13:34:54 roberto Exp roberto $
3** String table (keeps all strings handled by Lua) 3** String table (keeps all strings handled by Lua)
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -106,7 +106,7 @@ static TString *createstrobj (lua_State *L, const char *str, size_t l,
106 TString *ts; 106 TString *ts;
107 size_t totalsize; /* total size of TString object */ 107 size_t totalsize; /* total size of TString object */
108 totalsize = sizeof(TString) + ((l + 1) * sizeof(char)); 108 totalsize = sizeof(TString) + ((l + 1) * sizeof(char));
109 ts = &luaC_newobj(L, tag, totalsize, &G(L)->localgc, 0)->ts; 109 ts = &luaC_newobj(L, tag, totalsize, NULL, 0)->ts;
110 ts->tsv.len = l; 110 ts->tsv.len = l;
111 ts->tsv.hash = h; 111 ts->tsv.hash = h;
112 ts->tsv.extra = 0; 112 ts->tsv.extra = 0;
@@ -213,7 +213,7 @@ Udata *luaS_newudata (lua_State *L, size_t s, Table *e) {
213 Udata *u; 213 Udata *u;
214 if (s > MAX_SIZE - sizeof(Udata)) 214 if (s > MAX_SIZE - sizeof(Udata))
215 luaM_toobig(L); 215 luaM_toobig(L);
216 u = &luaC_newobj(L, LUA_TUSERDATA, sizeof(Udata) + s, NULL, 0)->u; 216 u = &luaC_newobj(L, LUA_TUSERDATA, sizeof(Udata) + s, &G(L)->allgc, 0)->u;
217 u->uv.len = s; 217 u->uv.len = s;
218 u->uv.metatable = NULL; 218 u->uv.metatable = NULL;
219 u->uv.env = e; 219 u->uv.env = e;
diff --git a/ltable.c b/ltable.c
index f5b8fcf6..ed5d9977 100644
--- a/ltable.c
+++ b/ltable.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ltable.c,v 2.78 2013/06/20 15:02:49 roberto Exp roberto $ 2** $Id: ltable.c,v 2.79 2013/08/18 16:12:18 roberto Exp roberto $
3** Lua tables (hash) 3** Lua tables (hash)
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -378,7 +378,7 @@ static void rehash (lua_State *L, Table *t, const TValue *ek) {
378 378
379 379
380Table *luaH_new (lua_State *L) { 380Table *luaH_new (lua_State *L) {
381 Table *t = &luaC_newobj(L, LUA_TTABLE, sizeof(Table), NULL, 0)->h; 381 Table *t = &luaC_newobj(L, LUA_TTABLE, sizeof(Table), &G(L)->allgc, 0)->h;
382 t->metatable = NULL; 382 t->metatable = NULL;
383 t->flags = cast_byte(~0); 383 t->flags = cast_byte(~0);
384 t->array = NULL; 384 t->array = NULL;
diff --git a/ltests.c b/ltests.c
index e2057736..aa247aa6 100644
--- a/ltests.c
+++ b/ltests.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ltests.c,v 2.149 2013/08/26 12:41:10 roberto Exp roberto $ 2** $Id: ltests.c,v 2.150 2013/08/27 18:53:35 roberto Exp roberto $
3** Internal Module for Debugging of the Lua Implementation 3** Internal Module for Debugging of the Lua Implementation
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -452,6 +452,7 @@ int lua_checkmemory (lua_State *L) {
452 else lua_assert(!isthread); /* ... and only threads */ 452 else lua_assert(!isthread); /* ... and only threads */
453 checkobject(g, o, maybedead); 453 checkobject(g, o, maybedead);
454 lua_assert(!tofinalize(o)); 454 lua_assert(!tofinalize(o));
455 lua_assert(testbit(o->gch.marked, LOCALMARK));
455 } 456 }
456 /* check 'finobj' list */ 457 /* check 'finobj' list */
457 checkgray(g, g->finobj); 458 checkgray(g, g->finobj);
@@ -473,6 +474,7 @@ int lua_checkmemory (lua_State *L) {
473 checkgray(g, g->localgc); 474 checkgray(g, g->localgc);
474 for (o = g->localgc; o != NULL; o = gch(o)->next) { 475 for (o = g->localgc; o != NULL; o = gch(o)->next) {
475 checkobject(g, o, 1); 476 checkobject(g, o, 1);
477 lua_assert(!testbit(o->gch.marked, LOCALMARK));
476 } 478 }
477 return 0; 479 return 0;
478} 480}