diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2001-06-15 17:36:57 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2001-06-15 17:36:57 -0300 |
| commit | 8e586c13fcf3066886a7edd69011304eaad57a2b (patch) | |
| tree | 417c2102ba8c4d693c49a2df839612d371eded50 /lgc.c | |
| parent | eadf2aaaffa7a35e7f67b150ce0d57f2c17b9231 (diff) | |
| download | lua-8e586c13fcf3066886a7edd69011304eaad57a2b.tar.gz lua-8e586c13fcf3066886a7edd69011304eaad57a2b.tar.bz2 lua-8e586c13fcf3066886a7edd69011304eaad57a2b.zip | |
cleaner way to ensure alignment for strings and userdata
Diffstat (limited to 'lgc.c')
| -rw-r--r-- | lgc.c | 30 |
1 files changed, 15 insertions, 15 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lgc.c,v 1.104 2001/06/13 18:51:20 roberto Exp roberto $ | 2 | ** $Id: lgc.c,v 1.105 2001/06/15 19:17:33 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 | */ |
| @@ -27,7 +27,7 @@ typedef struct GCState { | |||
| 27 | 27 | ||
| 28 | 28 | ||
| 29 | /* mark a string; marks larger than 1 cannot be changed */ | 29 | /* mark a string; marks larger than 1 cannot be changed */ |
| 30 | #define strmark(s) {if ((s)->marked == 0) (s)->marked = 1;} | 30 | #define strmark(s) {if ((s)->tsv.marked == 0) (s)->tsv.marked = 1;} |
| 31 | 31 | ||
| 32 | 32 | ||
| 33 | 33 | ||
| @@ -184,7 +184,7 @@ static void markall (lua_State *L) { | |||
| 184 | static int hasmark (int tt, Value *v) { | 184 | static int hasmark (int tt, Value *v) { |
| 185 | switch (tt) { | 185 | switch (tt) { |
| 186 | case LUA_TSTRING: | 186 | case LUA_TSTRING: |
| 187 | return v->ts->marked; | 187 | return v->ts->tsv.marked; |
| 188 | case LUA_TUSERDATA: | 188 | case LUA_TUSERDATA: |
| 189 | return ismarkedudata(v->u); | 189 | return ismarkedudata(v->u); |
| 190 | case LUA_TTABLE: | 190 | case LUA_TTABLE: |
| @@ -274,12 +274,12 @@ void luaC_collectudata (lua_State *L) { | |||
| 274 | while ((curr = *p) != NULL) { | 274 | while ((curr = *p) != NULL) { |
| 275 | if (ismarkedudata(curr)) { | 275 | if (ismarkedudata(curr)) { |
| 276 | switchudatamark(curr); /* unmark */ | 276 | switchudatamark(curr); /* unmark */ |
| 277 | p = &curr->next; | 277 | p = &curr->uv.next; |
| 278 | } | 278 | } |
| 279 | else { /* collect */ | 279 | else { /* collect */ |
| 280 | int tag = curr->tag; | 280 | int tag = curr->uv.tag; |
| 281 | *p = curr->next; | 281 | *p = curr->uv.next; |
| 282 | curr->next = G(L)->TMtable[tag].collected; /* chain udata */ | 282 | curr->uv.next = G(L)->TMtable[tag].collected; /* chain udata */ |
| 283 | G(L)->TMtable[tag].collected = curr; | 283 | G(L)->TMtable[tag].collected = curr; |
| 284 | } | 284 | } |
| 285 | } | 285 | } |
| @@ -292,15 +292,15 @@ static void collectstrings (lua_State *L, int all) { | |||
| 292 | TString **p = &G(L)->strt.hash[i]; | 292 | TString **p = &G(L)->strt.hash[i]; |
| 293 | TString *curr; | 293 | TString *curr; |
| 294 | while ((curr = *p) != NULL) { | 294 | while ((curr = *p) != NULL) { |
| 295 | if (curr->marked && !all) { /* preserve? */ | 295 | if (curr->tsv.marked && !all) { /* preserve? */ |
| 296 | if (curr->marked < FIXMARK) /* does not change FIXMARKs */ | 296 | if (curr->tsv.marked < FIXMARK) /* does not change FIXMARKs */ |
| 297 | curr->marked = 0; | 297 | curr->tsv.marked = 0; |
| 298 | p = &curr->nexthash; | 298 | p = &curr->tsv.nexthash; |
| 299 | } | 299 | } |
| 300 | else { /* collect */ | 300 | else { /* collect */ |
| 301 | *p = curr->nexthash; | 301 | *p = curr->tsv.nexthash; |
| 302 | G(L)->strt.nuse--; | 302 | G(L)->strt.nuse--; |
| 303 | luaM_free(L, curr, sizestring(curr->len)); | 303 | luaM_free(L, curr, sizestring(curr->tsv.len)); |
| 304 | } | 304 | } |
| 305 | } | 305 | } |
| 306 | } | 306 | } |
| @@ -344,10 +344,10 @@ void luaC_callgcTMudata (lua_State *L) { | |||
| 344 | Udata *udata; | 344 | Udata *udata; |
| 345 | while ((udata = G(L)->TMtable[tag].collected) != NULL) { | 345 | while ((udata = G(L)->TMtable[tag].collected) != NULL) { |
| 346 | TObject obj; | 346 | TObject obj; |
| 347 | G(L)->TMtable[tag].collected = udata->next; /* remove it from list */ | 347 | G(L)->TMtable[tag].collected = udata->uv.next; /* remove it from list */ |
| 348 | setuvalue(&obj, udata); | 348 | setuvalue(&obj, udata); |
| 349 | callgcTM(L, &obj); | 349 | callgcTM(L, &obj); |
| 350 | luaM_free(L, udata, sizeudata(udata->len)); | 350 | luaM_free(L, udata, sizeudata(udata->uv.len)); |
| 351 | } | 351 | } |
| 352 | } | 352 | } |
| 353 | } | 353 | } |
