aboutsummaryrefslogtreecommitdiff
path: root/lref.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-08-07 17:21:34 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-08-07 17:21:34 -0300
commitd9e61e8ceafe8c3f6ad936979719ca7c446ce228 (patch)
tree0808ada3d7b7219022b9002503894c76c7253df6 /lref.c
parent397905ef8694ec716a51acebc993bb625340d388 (diff)
downloadlua-d9e61e8ceafe8c3f6ad936979719ca7c446ce228.tar.gz
lua-d9e61e8ceafe8c3f6ad936979719ca7c446ce228.tar.bz2
lua-d9e61e8ceafe8c3f6ad936979719ca7c446ce228.zip
new algorithm for traversing in GC to avoid deep recursion calls
Diffstat (limited to 'lref.c')
-rw-r--r--lref.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/lref.c b/lref.c
index cf355d51..26889cfb 100644
--- a/lref.c
+++ b/lref.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lref.c,v 1.14 2000/06/12 13:52:05 roberto Exp roberto $ 2** $Id: lref.c,v 1.15 2000/06/30 14:35:17 roberto Exp roberto $
3** reference mechanism 3** reference mechanism
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -81,15 +81,15 @@ void lua_endblock (lua_State *L) {
81 81
82 82
83 83
84static int ismarked (const TObject *o) { 84static int hasmark (const TObject *o) {
85 /* valid only for locked objects */ 85 /* valid only for locked objects */
86 switch (o->ttype) { 86 switch (o->ttype) {
87 case TAG_STRING: case TAG_USERDATA: 87 case TAG_STRING: case TAG_USERDATA:
88 return tsvalue(o)->marked; 88 return tsvalue(o)->marked;
89 case TAG_TABLE: 89 case TAG_TABLE:
90 return hvalue(o)->marked; 90 return ismarked(hvalue(o));
91 case TAG_LCLOSURE: case TAG_CCLOSURE: 91 case TAG_LCLOSURE: case TAG_CCLOSURE:
92 return clvalue(o)->marked; 92 return ismarked(clvalue(o)->mark);
93 default: /* number */ 93 default: /* number */
94 return 1; 94 return 1;
95 } 95 }
@@ -104,9 +104,9 @@ void luaR_invalidaterefs (lua_State *L) {
104 int i; 104 int i;
105 for (i=0; i<n; i++) { 105 for (i=0; i<n; i++) {
106 struct Ref *r = &L->refArray[i]; 106 struct Ref *r = &L->refArray[i];
107 if (r->st == HOLD && !ismarked(&r->o)) 107 if (r->st == HOLD && !hasmark(&r->o))
108 r->st = COLLECTED; 108 r->st = COLLECTED;
109 LUA_ASSERT((r->st == LOCK && ismarked(&r->o)) || 109 LUA_ASSERT((r->st == LOCK && hasmark(&r->o)) ||
110 r->st == COLLECTED || 110 r->st == COLLECTED ||
111 r->st == NONEXT || 111 r->st == NONEXT ||
112 (r->st < n && VALIDLINK(L, L->refArray[r->st].st, n)), 112 (r->st < n && VALIDLINK(L, L->refArray[r->st].st, n)),