aboutsummaryrefslogtreecommitdiff
path: root/lgc.c
diff options
context:
space:
mode:
Diffstat (limited to 'lgc.c')
-rw-r--r--lgc.c30
1 files changed, 19 insertions, 11 deletions
diff --git a/lgc.c b/lgc.c
index 3b8d0ed6..03326df3 100644
--- a/lgc.c
+++ b/lgc.c
@@ -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}