| 770 | |
| 771 | |
| 772 | static void freeobj (lua_State *L, GCObject *o) { |
| 773 | switch (o->tt) { |
| 774 | case LUA_VPROTO: |
| 775 | luaF_freeproto(L, gco2p(o)); |
| 776 | break; |
| 777 | case LUA_VUPVAL: |
| 778 | freeupval(L, gco2upv(o)); |
| 779 | break; |
| 780 | case LUA_VLCL: { |
| 781 | LClosure *cl = gco2lcl(o); |
| 782 | luaM_freemem(L, cl, sizeLclosure(cl->nupvalues)); |
| 783 | break; |
| 784 | } |
| 785 | case LUA_VCCL: { |
| 786 | CClosure *cl = gco2ccl(o); |
| 787 | luaM_freemem(L, cl, sizeCclosure(cl->nupvalues)); |
| 788 | break; |
| 789 | } |
| 790 | case LUA_VTABLE: |
| 791 | luaH_free(L, gco2t(o)); |
| 792 | break; |
| 793 | case LUA_VTHREAD: |
| 794 | luaE_freethread(L, gco2th(o)); |
| 795 | break; |
| 796 | case LUA_VUSERDATA: { |
| 797 | Udata *u = gco2u(o); |
| 798 | luaM_freemem(L, o, sizeudata(u->nuvalue, u->len)); |
| 799 | break; |
| 800 | } |
| 801 | case LUA_VSHRSTR: { |
| 802 | TString *ts = gco2ts(o); |
| 803 | luaS_remove(L, ts); /* remove it from hash table */ |
| 804 | luaM_freemem(L, ts, sizelstring(ts->shrlen)); |
| 805 | break; |
| 806 | } |
| 807 | case LUA_VLNGSTR: { |
| 808 | TString *ts = gco2ts(o); |
| 809 | luaM_freemem(L, ts, sizelstring(ts->u.lnglen)); |
| 810 | break; |
| 811 | } |
| 812 | default: lua_assert(0); |
| 813 | } |
| 814 | } |
| 815 | |
| 816 | |
| 817 | /* |
no test coverage detected