diff options
| -rw-r--r-- | lgc.c | 64 | ||||
| -rw-r--r-- | lgc.h | 16 | ||||
| -rw-r--r-- | lobject.h | 10 | ||||
| -rw-r--r-- | lstate.h | 26 | ||||
| -rw-r--r-- | ltests.c | 36 |
5 files changed, 71 insertions, 81 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lgc.c,v 2.183 2014/05/25 19:08:32 roberto Exp roberto $ | 2 | ** $Id: lgc.c,v 2.184 2014/06/30 19:48:08 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 | */ |
| @@ -62,10 +62,10 @@ | |||
| 62 | */ | 62 | */ |
| 63 | #define maskcolors (~(bitmask(BLACKBIT) | WHITEBITS)) | 63 | #define maskcolors (~(bitmask(BLACKBIT) | WHITEBITS)) |
| 64 | #define makewhite(g,x) \ | 64 | #define makewhite(g,x) \ |
| 65 | (gch(x)->marked = cast_byte((gch(x)->marked & maskcolors) | luaC_white(g))) | 65 | (x->marked = cast_byte((x->marked & maskcolors) | luaC_white(g))) |
| 66 | 66 | ||
| 67 | #define white2gray(x) resetbits(gch(x)->marked, WHITEBITS) | 67 | #define white2gray(x) resetbits(x->marked, WHITEBITS) |
| 68 | #define black2gray(x) resetbit(gch(x)->marked, BLACKBIT) | 68 | #define black2gray(x) resetbit(x->marked, BLACKBIT) |
| 69 | 69 | ||
| 70 | 70 | ||
| 71 | #define valiswhite(x) (iscollectable(x) && iswhite(gcvalue(x))) | 71 | #define valiswhite(x) (iscollectable(x) && iswhite(gcvalue(x))) |
| @@ -141,7 +141,7 @@ void luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v) { | |||
| 141 | global_State *g = G(L); | 141 | global_State *g = G(L); |
| 142 | lua_assert(isblack(o) && iswhite(v) && !isdead(g, v) && !isdead(g, o)); | 142 | lua_assert(isblack(o) && iswhite(v) && !isdead(g, v) && !isdead(g, o)); |
| 143 | lua_assert(g->gcstate != GCSpause); | 143 | lua_assert(g->gcstate != GCSpause); |
| 144 | lua_assert(gch(o)->tt != LUA_TTABLE); /* tables use a back barrier */ | 144 | lua_assert(o->tt != LUA_TTABLE); /* tables use a back barrier */ |
| 145 | if (keepinvariant(g)) /* must keep invariant? */ | 145 | if (keepinvariant(g)) /* must keep invariant? */ |
| 146 | reallymarkobject(g, v); /* restore invariant */ | 146 | reallymarkobject(g, v); /* restore invariant */ |
| 147 | else { /* sweep phase */ | 147 | else { /* sweep phase */ |
| @@ -159,7 +159,7 @@ void luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v) { | |||
| 159 | */ | 159 | */ |
| 160 | void luaC_barrierback_ (lua_State *L, GCObject *o) { | 160 | void luaC_barrierback_ (lua_State *L, GCObject *o) { |
| 161 | global_State *g = G(L); | 161 | global_State *g = G(L); |
| 162 | lua_assert(isblack(o) && !isdead(g, o) && gch(o)->tt == LUA_TTABLE); | 162 | lua_assert(isblack(o) && !isdead(g, o) && o->tt == LUA_TTABLE); |
| 163 | black2gray(o); /* make object gray (again) */ | 163 | black2gray(o); /* make object gray (again) */ |
| 164 | gco2t(o)->gclist = g->grayagain; | 164 | gco2t(o)->gclist = g->grayagain; |
| 165 | g->grayagain = o; | 165 | g->grayagain = o; |
| @@ -185,8 +185,8 @@ void luaC_fix (lua_State *L, GCObject *o) { | |||
| 185 | global_State *g = G(L); | 185 | global_State *g = G(L); |
| 186 | lua_assert(g->allgc == o); /* object must be 1st in 'allgc' list! */ | 186 | lua_assert(g->allgc == o); /* object must be 1st in 'allgc' list! */ |
| 187 | white2gray(o); /* they will be gray forever */ | 187 | white2gray(o); /* they will be gray forever */ |
| 188 | g->allgc = o->gch.next; /* remove object from 'allgc' list */ | 188 | g->allgc = o->next; /* remove object from 'allgc' list */ |
| 189 | o->gch.next = g->fixedgc; /* link it to 'fixedgc' list */ | 189 | o->next = g->fixedgc; /* link it to 'fixedgc' list */ |
| 190 | g->fixedgc = o; | 190 | g->fixedgc = o; |
| 191 | } | 191 | } |
| 192 | 192 | ||
| @@ -198,9 +198,9 @@ void luaC_fix (lua_State *L, GCObject *o) { | |||
| 198 | GCObject *luaC_newobj (lua_State *L, int tt, size_t sz) { | 198 | GCObject *luaC_newobj (lua_State *L, int tt, size_t sz) { |
| 199 | global_State *g = G(L); | 199 | global_State *g = G(L); |
| 200 | GCObject *o = cast(GCObject *, luaM_newobject(L, novariant(tt), sz)); | 200 | GCObject *o = cast(GCObject *, luaM_newobject(L, novariant(tt), sz)); |
| 201 | gch(o)->marked = luaC_white(g); | 201 | o->marked = luaC_white(g); |
| 202 | gch(o)->tt = tt; | 202 | o->tt = tt; |
| 203 | gch(o)->next = g->allgc; | 203 | o->next = g->allgc; |
| 204 | g->allgc = o; | 204 | g->allgc = o; |
| 205 | return o; | 205 | return o; |
| 206 | } | 206 | } |
| @@ -225,7 +225,7 @@ GCObject *luaC_newobj (lua_State *L, int tt, size_t sz) { | |||
| 225 | static void reallymarkobject (global_State *g, GCObject *o) { | 225 | static void reallymarkobject (global_State *g, GCObject *o) { |
| 226 | reentry: | 226 | reentry: |
| 227 | white2gray(o); | 227 | white2gray(o); |
| 228 | switch (gch(o)->tt) { | 228 | switch (o->tt) { |
| 229 | case LUA_TSHRSTR: | 229 | case LUA_TSHRSTR: |
| 230 | case LUA_TLNGSTR: { | 230 | case LUA_TLNGSTR: { |
| 231 | gray2black(o); | 231 | gray2black(o); |
| @@ -288,7 +288,7 @@ static void markmt (global_State *g) { | |||
| 288 | */ | 288 | */ |
| 289 | static void markbeingfnz (global_State *g) { | 289 | static void markbeingfnz (global_State *g) { |
| 290 | GCObject *o; | 290 | GCObject *o; |
| 291 | for (o = g->tobefnz; o != NULL; o = gch(o)->next) | 291 | for (o = g->tobefnz; o != NULL; o = o->next) |
| 292 | markobject(g, o); | 292 | markobject(g, o); |
| 293 | } | 293 | } |
| 294 | 294 | ||
| @@ -528,7 +528,7 @@ static void propagatemark (global_State *g) { | |||
| 528 | GCObject *o = g->gray; | 528 | GCObject *o = g->gray; |
| 529 | lua_assert(isgray(o)); | 529 | lua_assert(isgray(o)); |
| 530 | gray2black(o); | 530 | gray2black(o); |
| 531 | switch (gch(o)->tt) { | 531 | switch (o->tt) { |
| 532 | case LUA_TTABLE: { | 532 | case LUA_TTABLE: { |
| 533 | Table *h = gco2t(o); | 533 | Table *h = gco2t(o); |
| 534 | g->gray = h->gclist; /* remove from 'gray' list */ | 534 | g->gray = h->gclist; /* remove from 'gray' list */ |
| @@ -685,7 +685,7 @@ static void freeLclosure (lua_State *L, LClosure *cl) { | |||
| 685 | 685 | ||
| 686 | 686 | ||
| 687 | static void freeobj (lua_State *L, GCObject *o) { | 687 | static void freeobj (lua_State *L, GCObject *o) { |
| 688 | switch (gch(o)->tt) { | 688 | switch (o->tt) { |
| 689 | case LUA_TPROTO: luaF_freeproto(L, gco2p(o)); break; | 689 | case LUA_TPROTO: luaF_freeproto(L, gco2p(o)); break; |
| 690 | case LUA_TLCL: { | 690 | case LUA_TLCL: { |
| 691 | freeLclosure(L, gco2lcl(o)); | 691 | freeLclosure(L, gco2lcl(o)); |
| @@ -727,14 +727,14 @@ static GCObject **sweeplist (lua_State *L, GCObject **p, lu_mem count) { | |||
| 727 | int white = luaC_white(g); /* current white */ | 727 | int white = luaC_white(g); /* current white */ |
| 728 | while (*p != NULL && count-- > 0) { | 728 | while (*p != NULL && count-- > 0) { |
| 729 | GCObject *curr = *p; | 729 | GCObject *curr = *p; |
| 730 | int marked = gch(curr)->marked; | 730 | int marked = curr->marked; |
| 731 | if (isdeadm(ow, marked)) { /* is 'curr' dead? */ | 731 | if (isdeadm(ow, marked)) { /* is 'curr' dead? */ |
| 732 | *p = gch(curr)->next; /* remove 'curr' from list */ | 732 | *p = curr->next; /* remove 'curr' from list */ |
| 733 | freeobj(L, curr); /* erase 'curr' */ | 733 | freeobj(L, curr); /* erase 'curr' */ |
| 734 | } | 734 | } |
| 735 | else { /* update marks */ | 735 | else { /* update marks */ |
| 736 | gch(curr)->marked = cast_byte((marked & maskcolors) | white); | 736 | curr->marked = cast_byte((marked & maskcolors) | white); |
| 737 | p = &gch(curr)->next; /* go to next element */ | 737 | p = &curr->next; /* go to next element */ |
| 738 | } | 738 | } |
| 739 | } | 739 | } |
| 740 | return (*p == NULL) ? NULL : p; | 740 | return (*p == NULL) ? NULL : p; |
| @@ -781,10 +781,10 @@ static void checkSizes (lua_State *L, global_State *g) { | |||
| 781 | static GCObject *udata2finalize (global_State *g) { | 781 | static GCObject *udata2finalize (global_State *g) { |
| 782 | GCObject *o = g->tobefnz; /* get first element */ | 782 | GCObject *o = g->tobefnz; /* get first element */ |
| 783 | lua_assert(tofinalize(o)); | 783 | lua_assert(tofinalize(o)); |
| 784 | g->tobefnz = gch(o)->next; /* remove it from 'tobefnz' list */ | 784 | g->tobefnz = o->next; /* remove it from 'tobefnz' list */ |
| 785 | gch(o)->next = g->allgc; /* return it to 'allgc' list */ | 785 | o->next = g->allgc; /* return it to 'allgc' list */ |
| 786 | g->allgc = o; | 786 | g->allgc = o; |
| 787 | resetbit(gch(o)->marked, FINALIZEDBIT); /* object is "normal" again */ | 787 | resetbit(o->marked, FINALIZEDBIT); /* object is "normal" again */ |
| 788 | if (issweepphase(g)) | 788 | if (issweepphase(g)) |
| 789 | makewhite(g, o); /* "sweep" object */ | 789 | makewhite(g, o); /* "sweep" object */ |
| 790 | return o; | 790 | return o; |
| @@ -859,7 +859,7 @@ static void callallpendingfinalizers (lua_State *L, int propagateerrors) { | |||
| 859 | */ | 859 | */ |
| 860 | static GCObject **findlast (GCObject **p) { | 860 | static GCObject **findlast (GCObject **p) { |
| 861 | while (*p != NULL) | 861 | while (*p != NULL) |
| 862 | p = &gch(*p)->next; | 862 | p = &(*p)->next; |
| 863 | return p; | 863 | return p; |
| 864 | } | 864 | } |
| 865 | 865 | ||
| @@ -875,12 +875,12 @@ static void separatetobefnz (global_State *g, int all) { | |||
| 875 | while ((curr = *p) != NULL) { /* traverse all finalizable objects */ | 875 | while ((curr = *p) != NULL) { /* traverse all finalizable objects */ |
| 876 | lua_assert(tofinalize(curr)); | 876 | lua_assert(tofinalize(curr)); |
| 877 | if (!(iswhite(curr) || all)) /* not being collected? */ | 877 | if (!(iswhite(curr) || all)) /* not being collected? */ |
| 878 | p = &gch(curr)->next; /* don't bother with it */ | 878 | p = &curr->next; /* don't bother with it */ |
| 879 | else { | 879 | else { |
| 880 | *p = gch(curr)->next; /* remove 'curr' from "fin" list */ | 880 | *p = curr->next; /* remove 'curr' from "fin" list */ |
| 881 | gch(curr)->next = *lastnext; /* link at the end of 'tobefnz' list */ | 881 | curr->next = *lastnext; /* link at the end of 'tobefnz' list */ |
| 882 | *lastnext = curr; | 882 | *lastnext = curr; |
| 883 | lastnext = &gch(curr)->next; | 883 | lastnext = &curr->next; |
| 884 | } | 884 | } |
| 885 | } | 885 | } |
| 886 | } | 886 | } |
| @@ -899,15 +899,15 @@ void luaC_checkfinalizer (lua_State *L, GCObject *o, Table *mt) { | |||
| 899 | GCObject **p; | 899 | GCObject **p; |
| 900 | if (issweepphase(g)) { | 900 | if (issweepphase(g)) { |
| 901 | makewhite(g, o); /* "sweep" object 'o' */ | 901 | makewhite(g, o); /* "sweep" object 'o' */ |
| 902 | if (g->sweepgc == &o->gch.next) /* should not remove 'sweepgc' object */ | 902 | if (g->sweepgc == &o->next) /* should not remove 'sweepgc' object */ |
| 903 | g->sweepgc = sweeptolive(L, g->sweepgc, NULL); /* change 'sweepgc' */ | 903 | g->sweepgc = sweeptolive(L, g->sweepgc, NULL); /* change 'sweepgc' */ |
| 904 | } | 904 | } |
| 905 | /* search for pointer pointing to 'o' */ | 905 | /* search for pointer pointing to 'o' */ |
| 906 | for (p = &g->allgc; *p != o; p = &gch(*p)->next) { /* empty */ } | 906 | for (p = &g->allgc; *p != o; p = &(*p)->next) { /* empty */ } |
| 907 | *p = o->gch.next; /* remove 'o' from 'allgc' list */ | 907 | *p = o->next; /* remove 'o' from 'allgc' list */ |
| 908 | o->gch.next = g->finobj; /* link it in "fin" list */ | 908 | o->next = g->finobj; /* link it in "fin" list */ |
| 909 | g->finobj = o; | 909 | g->finobj = o; |
| 910 | l_setbit(o->gch.marked, FINALIZEDBIT); /* mark it as such */ | 910 | l_setbit(o->marked, FINALIZEDBIT); /* mark it as such */ |
| 911 | } | 911 | } |
| 912 | } | 912 | } |
| 913 | 913 | ||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lgc.h,v 2.81 2014/02/18 13:46:26 roberto Exp roberto $ | 2 | ** $Id: lgc.h,v 2.82 2014/03/19 18:51:16 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 | */ |
| @@ -84,19 +84,19 @@ | |||
| 84 | #define WHITEBITS bit2mask(WHITE0BIT, WHITE1BIT) | 84 | #define WHITEBITS bit2mask(WHITE0BIT, WHITE1BIT) |
| 85 | 85 | ||
| 86 | 86 | ||
| 87 | #define iswhite(x) testbits((x)->gch.marked, WHITEBITS) | 87 | #define iswhite(x) testbits((x)->marked, WHITEBITS) |
| 88 | #define isblack(x) testbit((x)->gch.marked, BLACKBIT) | 88 | #define isblack(x) testbit((x)->marked, BLACKBIT) |
| 89 | #define isgray(x) /* neither white nor black */ \ | 89 | #define isgray(x) /* neither white nor black */ \ |
| 90 | (!testbits((x)->gch.marked, WHITEBITS | bitmask(BLACKBIT))) | 90 | (!testbits((x)->marked, WHITEBITS | bitmask(BLACKBIT))) |
| 91 | 91 | ||
| 92 | #define tofinalize(x) testbit((x)->gch.marked, FINALIZEDBIT) | 92 | #define tofinalize(x) testbit((x)->marked, FINALIZEDBIT) |
| 93 | 93 | ||
| 94 | #define otherwhite(g) ((g)->currentwhite ^ WHITEBITS) | 94 | #define otherwhite(g) ((g)->currentwhite ^ WHITEBITS) |
| 95 | #define isdeadm(ow,m) (!(((m) ^ WHITEBITS) & (ow))) | 95 | #define isdeadm(ow,m) (!(((m) ^ WHITEBITS) & (ow))) |
| 96 | #define isdead(g,v) isdeadm(otherwhite(g), (v)->gch.marked) | 96 | #define isdead(g,v) isdeadm(otherwhite(g), (v)->marked) |
| 97 | 97 | ||
| 98 | #define changewhite(x) ((x)->gch.marked ^= WHITEBITS) | 98 | #define changewhite(x) ((x)->marked ^= WHITEBITS) |
| 99 | #define gray2black(x) l_setbit((x)->gch.marked, BLACKBIT) | 99 | #define gray2black(x) l_setbit((x)->marked, BLACKBIT) |
| 100 | 100 | ||
| 101 | #define luaC_white(g) cast(lu_byte, (g)->currentwhite & WHITEBITS) | 101 | #define luaC_white(g) cast(lu_byte, (g)->currentwhite & WHITEBITS) |
| 102 | 102 | ||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lobject.h,v 2.94 2014/06/19 18:39:36 roberto Exp roberto $ | 2 | ** $Id: lobject.h,v 2.95 2014/07/17 17:09:50 roberto Exp roberto $ |
| 3 | ** Type definitions for Lua objects | 3 | ** Type definitions for Lua objects |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -85,9 +85,7 @@ typedef struct GCObject GCObject; | |||
| 85 | ** Common type has only the common header | 85 | ** Common type has only the common header |
| 86 | */ | 86 | */ |
| 87 | struct GCObject { | 87 | struct GCObject { |
| 88 | struct { | 88 | CommonHeader; |
| 89 | CommonHeader; | ||
| 90 | } gch; | ||
| 91 | }; | 89 | }; |
| 92 | 90 | ||
| 93 | 91 | ||
| @@ -179,7 +177,7 @@ typedef struct lua_TValue TValue; | |||
| 179 | 177 | ||
| 180 | 178 | ||
| 181 | /* Macros for internal tests */ | 179 | /* Macros for internal tests */ |
| 182 | #define righttt(obj) (ttype(obj) == gcvalue(obj)->gch.tt) | 180 | #define righttt(obj) (ttype(obj) == gcvalue(obj)->tt) |
| 183 | 181 | ||
| 184 | #define checkliveness(g,obj) \ | 182 | #define checkliveness(g,obj) \ |
| 185 | lua_longassert(!iscollectable(obj) || \ | 183 | lua_longassert(!iscollectable(obj) || \ |
| @@ -208,7 +206,7 @@ typedef struct lua_TValue TValue; | |||
| 208 | 206 | ||
| 209 | #define setgcovalue(L,obj,x) \ | 207 | #define setgcovalue(L,obj,x) \ |
| 210 | { TValue *io = (obj); GCObject *i_g=(x); \ | 208 | { TValue *io = (obj); GCObject *i_g=(x); \ |
| 211 | val_(io).gc = i_g; settt_(io, ctb(gch(i_g)->tt)); } | 209 | val_(io).gc = i_g; settt_(io, ctb(i_g->tt)); } |
| 212 | 210 | ||
| 213 | #define setsvalue(L,obj,x) \ | 211 | #define setsvalue(L,obj,x) \ |
| 214 | { TValue *io = (obj); TString *x_ = (x); \ | 212 | { TValue *io = (obj); TString *x_ = (x); \ |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lstate.h,v 2.108 2014/07/17 13:53:37 roberto Exp roberto $ | 2 | ** $Id: lstate.h,v 2.109 2014/07/17 17:09:50 roberto Exp roberto $ |
| 3 | ** Global State | 3 | ** Global State |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -183,29 +183,21 @@ union GCUnion { | |||
| 183 | }; | 183 | }; |
| 184 | 184 | ||
| 185 | 185 | ||
| 186 | #define gch(o) (&(o)->gch) | ||
| 187 | |||
| 188 | #define cast_u(o) cast(union GCUnion *, (o)) | 186 | #define cast_u(o) cast(union GCUnion *, (o)) |
| 189 | 187 | ||
| 190 | /* macros to convert a GCObject into a specific value */ | 188 | /* macros to convert a GCObject into a specific value */ |
| 191 | #define rawgco2ts(o) \ | 189 | #define rawgco2ts(o) \ |
| 192 | check_exp(novariant((o)->gch.tt) == LUA_TSTRING, &((cast_u(o))->ts)) | 190 | check_exp(novariant((o)->tt) == LUA_TSTRING, &((cast_u(o))->ts)) |
| 193 | #define gco2ts(o) (&rawgco2ts(o)->tsv) | 191 | #define gco2ts(o) (&rawgco2ts(o)->tsv) |
| 194 | #define rawgco2u(o) \ | 192 | #define rawgco2u(o) check_exp((o)->tt == LUA_TUSERDATA, &((cast_u(o))->u)) |
| 195 | check_exp((o)->gch.tt == LUA_TUSERDATA, &((cast_u(o))->u)) | ||
| 196 | #define gco2u(o) (&rawgco2u(o)->uv) | 193 | #define gco2u(o) (&rawgco2u(o)->uv) |
| 197 | #define gco2lcl(o) \ | 194 | #define gco2lcl(o) check_exp((o)->tt == LUA_TLCL, &((cast_u(o))->cl.l)) |
| 198 | check_exp((o)->gch.tt == LUA_TLCL, &((cast_u(o))->cl.l)) | 195 | #define gco2ccl(o) check_exp((o)->tt == LUA_TCCL, &((cast_u(o))->cl.c)) |
| 199 | #define gco2ccl(o) \ | ||
| 200 | check_exp((o)->gch.tt == LUA_TCCL, &((cast_u(o))->cl.c)) | ||
| 201 | #define gco2cl(o) \ | 196 | #define gco2cl(o) \ |
| 202 | check_exp(novariant((o)->gch.tt) == LUA_TFUNCTION, &((cast_u(o))->cl)) | 197 | check_exp(novariant((o)->tt) == LUA_TFUNCTION, &((cast_u(o))->cl)) |
| 203 | #define gco2t(o) \ | 198 | #define gco2t(o) check_exp((o)->tt == LUA_TTABLE, &((cast_u(o))->h)) |
| 204 | check_exp((o)->gch.tt == LUA_TTABLE, &((cast_u(o))->h)) | 199 | #define gco2p(o) check_exp((o)->tt == LUA_TPROTO, &((cast_u(o))->p)) |
| 205 | #define gco2p(o) \ | 200 | #define gco2th(o) check_exp((o)->tt == LUA_TTHREAD, &((cast_u(o))->th)) |
| 206 | check_exp((o)->gch.tt == LUA_TPROTO, &((cast_u(o))->p)) | ||
| 207 | #define gco2th(o) \ | ||
| 208 | check_exp((o)->gch.tt == LUA_TTHREAD, &((cast_u(o))->th)) | ||
| 209 | 201 | ||
| 210 | 202 | ||
| 211 | /* macro to convert any Lua object into a GCObject */ | 203 | /* macro to convert any Lua object into a GCObject */ |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ltests.c,v 2.175 2014/07/16 14:51:36 roberto Exp roberto $ | 2 | ** $Id: ltests.c,v 2.176 2014/07/17 13:53:37 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 | */ |
| @@ -190,8 +190,8 @@ static int testobjref1 (global_State *g, GCObject *f, GCObject *t) { | |||
| 190 | 190 | ||
| 191 | static void printobj (global_State *g, GCObject *o) { | 191 | static void printobj (global_State *g, GCObject *o) { |
| 192 | printf("||%s(%p)-%c(%02X)||", | 192 | printf("||%s(%p)-%c(%02X)||", |
| 193 | ttypename(novariant(gch(o)->tt)), (void *)o, | 193 | ttypename(novariant(o->tt)), (void *)o, |
| 194 | isdead(g,o)?'d':isblack(o)?'b':iswhite(o)?'w':'g', gch(o)->marked); | 194 | isdead(g,o)?'d':isblack(o)?'b':iswhite(o)?'w':'g', o->marked); |
| 195 | } | 195 | } |
| 196 | 196 | ||
| 197 | 197 | ||
| @@ -316,7 +316,7 @@ static void checkobject (global_State *g, GCObject *o, int maybedead) { | |||
| 316 | lua_assert(maybedead); | 316 | lua_assert(maybedead); |
| 317 | else { | 317 | else { |
| 318 | lua_assert(g->gcstate != GCSpause || iswhite(o)); | 318 | lua_assert(g->gcstate != GCSpause || iswhite(o)); |
| 319 | switch (gch(o)->tt) { | 319 | switch (o->tt) { |
| 320 | case LUA_TUSERDATA: { | 320 | case LUA_TUSERDATA: { |
| 321 | TValue uservalue; | 321 | TValue uservalue; |
| 322 | Table *mt = gco2u(o)->metatable; | 322 | Table *mt = gco2u(o)->metatable; |
| @@ -362,9 +362,9 @@ static void checkgraylist (global_State *g, GCObject *o) { | |||
| 362 | ((void)g); /* better to keep it available if we need to print an object */ | 362 | ((void)g); /* better to keep it available if we need to print an object */ |
| 363 | while (o) { | 363 | while (o) { |
| 364 | lua_assert(isgray(o)); | 364 | lua_assert(isgray(o)); |
| 365 | lua_assert(!testbit(o->gch.marked, TESTGRAYBIT)); | 365 | lua_assert(!testbit(o->marked, TESTGRAYBIT)); |
| 366 | l_setbit(o->gch.marked, TESTGRAYBIT); | 366 | l_setbit(o->marked, TESTGRAYBIT); |
| 367 | switch (gch(o)->tt) { | 367 | switch (o->tt) { |
| 368 | case LUA_TTABLE: o = gco2t(o)->gclist; break; | 368 | case LUA_TTABLE: o = gco2t(o)->gclist; break; |
| 369 | case LUA_TLCL: o = gco2lcl(o)->gclist; break; | 369 | case LUA_TLCL: o = gco2lcl(o)->gclist; break; |
| 370 | case LUA_TCCL: o = gco2ccl(o)->gclist; break; | 370 | case LUA_TCCL: o = gco2ccl(o)->gclist; break; |
| @@ -391,12 +391,12 @@ static void markgrays (global_State *g) { | |||
| 391 | 391 | ||
| 392 | 392 | ||
| 393 | static void checkgray (global_State *g, GCObject *o) { | 393 | static void checkgray (global_State *g, GCObject *o) { |
| 394 | for (; o != NULL; o = gch(o)->next) { | 394 | for (; o != NULL; o = o->next) { |
| 395 | if (isgray(o)) { | 395 | if (isgray(o)) { |
| 396 | lua_assert(!keepinvariant(g) || testbit(o->gch.marked, TESTGRAYBIT)); | 396 | lua_assert(!keepinvariant(g) || testbit(o->marked, TESTGRAYBIT)); |
| 397 | resetbit(o->gch.marked, TESTGRAYBIT); | 397 | resetbit(o->marked, TESTGRAYBIT); |
| 398 | } | 398 | } |
| 399 | lua_assert(!testbit(o->gch.marked, TESTGRAYBIT)); | 399 | lua_assert(!testbit(o->marked, TESTGRAYBIT)); |
| 400 | } | 400 | } |
| 401 | } | 401 | } |
| 402 | 402 | ||
| @@ -415,29 +415,29 @@ int lua_checkmemory (lua_State *L) { | |||
| 415 | lua_assert(g->sweepgc == NULL || issweepphase(g)); | 415 | lua_assert(g->sweepgc == NULL || issweepphase(g)); |
| 416 | markgrays(g); | 416 | markgrays(g); |
| 417 | /* check 'fixedgc' list */ | 417 | /* check 'fixedgc' list */ |
| 418 | for (o = g->fixedgc; o != NULL; o = gch(o)->next) { | 418 | for (o = g->fixedgc; o != NULL; o = o->next) { |
| 419 | lua_assert(gch(o)->tt == LUA_TSHRSTR && isgray(o)); | 419 | lua_assert(o->tt == LUA_TSHRSTR && isgray(o)); |
| 420 | } | 420 | } |
| 421 | /* check 'allgc' list */ | 421 | /* check 'allgc' list */ |
| 422 | checkgray(g, g->allgc); | 422 | checkgray(g, g->allgc); |
| 423 | maybedead = (GCSatomic < g->gcstate && g->gcstate <= GCSswpallgc); | 423 | maybedead = (GCSatomic < g->gcstate && g->gcstate <= GCSswpallgc); |
| 424 | for (o = g->allgc; o != NULL; o = gch(o)->next) { | 424 | for (o = g->allgc; o != NULL; o = o->next) { |
| 425 | checkobject(g, o, maybedead); | 425 | checkobject(g, o, maybedead); |
| 426 | lua_assert(!tofinalize(o)); | 426 | lua_assert(!tofinalize(o)); |
| 427 | } | 427 | } |
| 428 | /* check 'finobj' list */ | 428 | /* check 'finobj' list */ |
| 429 | checkgray(g, g->finobj); | 429 | checkgray(g, g->finobj); |
| 430 | for (o = g->finobj; o != NULL; o = gch(o)->next) { | 430 | for (o = g->finobj; o != NULL; o = o->next) { |
| 431 | checkobject(g, o, 0); | 431 | checkobject(g, o, 0); |
| 432 | lua_assert(tofinalize(o)); | 432 | lua_assert(tofinalize(o)); |
| 433 | lua_assert(gch(o)->tt == LUA_TUSERDATA || gch(o)->tt == LUA_TTABLE); | 433 | lua_assert(o->tt == LUA_TUSERDATA || o->tt == LUA_TTABLE); |
| 434 | } | 434 | } |
| 435 | /* check 'tobefnz' list */ | 435 | /* check 'tobefnz' list */ |
| 436 | checkgray(g, g->tobefnz); | 436 | checkgray(g, g->tobefnz); |
| 437 | for (o = g->tobefnz; o != NULL; o = gch(o)->next) { | 437 | for (o = g->tobefnz; o != NULL; o = o->next) { |
| 438 | checkobject(g, o, 0); | 438 | checkobject(g, o, 0); |
| 439 | lua_assert(tofinalize(o)); | 439 | lua_assert(tofinalize(o)); |
| 440 | lua_assert(gch(o)->tt == LUA_TUSERDATA || gch(o)->tt == LUA_TTABLE); | 440 | lua_assert(o->tt == LUA_TUSERDATA || o->tt == LUA_TTABLE); |
| 441 | } | 441 | } |
| 442 | return 0; | 442 | return 0; |
| 443 | } | 443 | } |
