diff options
Diffstat (limited to 'lgc.c')
| -rw-r--r-- | lgc.c | 30 |
1 files changed, 19 insertions, 11 deletions
| @@ -301,7 +301,7 @@ static void reallymarkobject (global_State *g, GCObject *o) { | |||
| 301 | if (upisopen(uv)) | 301 | if (upisopen(uv)) |
| 302 | set2gray(uv); /* open upvalues are kept gray */ | 302 | set2gray(uv); /* open upvalues are kept gray */ |
| 303 | else | 303 | else |
| 304 | set2black(o); /* closed upvalues are visited here */ | 304 | set2black(uv); /* closed upvalues are visited here */ |
| 305 | markvalue(g, uv->v); /* mark its content */ | 305 | markvalue(g, uv->v); /* mark its content */ |
| 306 | break; | 306 | break; |
| 307 | } | 307 | } |
| @@ -309,7 +309,7 @@ static void reallymarkobject (global_State *g, GCObject *o) { | |||
| 309 | Udata *u = gco2u(o); | 309 | Udata *u = gco2u(o); |
| 310 | if (u->nuvalue == 0) { /* no user values? */ | 310 | if (u->nuvalue == 0) { /* no user values? */ |
| 311 | markobjectN(g, u->metatable); /* mark its metatable */ | 311 | markobjectN(g, u->metatable); /* mark its metatable */ |
| 312 | set2black(o); /* nothing else to mark */ | 312 | set2black(u); /* nothing else to mark */ |
| 313 | break; | 313 | break; |
| 314 | } | 314 | } |
| 315 | /* else... */ | 315 | /* else... */ |
| @@ -770,12 +770,16 @@ static void freeobj (lua_State *L, GCObject *o) { | |||
| 770 | case LUA_VUPVAL: | 770 | case LUA_VUPVAL: |
| 771 | freeupval(L, gco2upv(o)); | 771 | freeupval(L, gco2upv(o)); |
| 772 | break; | 772 | break; |
| 773 | case LUA_VLCL: | 773 | case LUA_VLCL: { |
| 774 | luaM_freemem(L, o, sizeLclosure(gco2lcl(o)->nupvalues)); | 774 | LClosure *cl = gco2lcl(o); |
| 775 | luaM_freemem(L, cl, sizeLclosure(cl->nupvalues)); | ||
| 775 | break; | 776 | break; |
| 776 | case LUA_VCCL: | 777 | } |
| 777 | luaM_freemem(L, o, sizeCclosure(gco2ccl(o)->nupvalues)); | 778 | case LUA_VCCL: { |
| 779 | CClosure *cl = gco2ccl(o); | ||
| 780 | luaM_freemem(L, cl, sizeCclosure(cl->nupvalues)); | ||
| 778 | break; | 781 | break; |
| 782 | } | ||
| 779 | case LUA_VTABLE: | 783 | case LUA_VTABLE: |
| 780 | luaH_free(L, gco2t(o)); | 784 | luaH_free(L, gco2t(o)); |
| 781 | break; | 785 | break; |
| @@ -787,13 +791,17 @@ static void freeobj (lua_State *L, GCObject *o) { | |||
| 787 | luaM_freemem(L, o, sizeudata(u->nuvalue, u->len)); | 791 | luaM_freemem(L, o, sizeudata(u->nuvalue, u->len)); |
| 788 | break; | 792 | break; |
| 789 | } | 793 | } |
| 790 | case LUA_VSHRSTR: | 794 | case LUA_VSHRSTR: { |
| 791 | luaS_remove(L, gco2ts(o)); /* remove it from hash table */ | 795 | TString *ts = gco2ts(o); |
| 792 | luaM_freemem(L, o, sizelstring(gco2ts(o)->shrlen)); | 796 | luaS_remove(L, ts); /* remove it from hash table */ |
| 797 | luaM_freemem(L, ts, sizelstring(ts->shrlen)); | ||
| 793 | break; | 798 | break; |
| 794 | case LUA_VLNGSTR: | 799 | } |
| 795 | luaM_freemem(L, o, sizelstring(gco2ts(o)->u.lnglen)); | 800 | case LUA_VLNGSTR: { |
| 801 | TString *ts = gco2ts(o); | ||
| 802 | luaM_freemem(L, ts, sizelstring(ts->u.lnglen)); | ||
| 796 | break; | 803 | break; |
| 804 | } | ||
| 797 | default: lua_assert(0); | 805 | default: lua_assert(0); |
| 798 | } | 806 | } |
| 799 | } | 807 | } |
