diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2000-08-07 17:21:34 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2000-08-07 17:21:34 -0300 |
commit | d9e61e8ceafe8c3f6ad936979719ca7c446ce228 (patch) | |
tree | 0808ada3d7b7219022b9002503894c76c7253df6 /lref.c | |
parent | 397905ef8694ec716a51acebc993bb625340d388 (diff) | |
download | lua-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.c | 12 |
1 files changed, 6 insertions, 6 deletions
@@ -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 | ||
84 | static int ismarked (const TObject *o) { | 84 | static 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)), |