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 | } |