aboutsummaryrefslogtreecommitdiff
path: root/lgc.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2024-11-15 12:04:53 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2024-11-15 12:04:53 -0300
commita4762b6ffe74f5878882ef238d37bfa92d90e418 (patch)
tree4f52a82641838a318e6270522d9e7f83ccab388d /lgc.c
parentd4247befa18a7911c56e7110154ad73574cd6648 (diff)
downloadlua-a4762b6ffe74f5878882ef238d37bfa92d90e418.tar.gz
lua-a4762b6ffe74f5878882ef238d37bfa92d90e418.tar.bz2
lua-a4762b6ffe74f5878882ef238d37bfa92d90e418.zip
'objsize' returns 'l_mem'
Sums of size_t may not fit in a size_t.
Diffstat (limited to 'lgc.c')
-rw-r--r--lgc.c39
1 files changed, 26 insertions, 13 deletions
diff --git a/lgc.c b/lgc.c
index e8b9ad5e..e4130bd5 100644
--- a/lgc.c
+++ b/lgc.c
@@ -110,43 +110,54 @@ static void entersweep (lua_State *L);
110#define gnodelast(h) gnode(h, cast_sizet(sizenode(h))) 110#define gnodelast(h) gnode(h, cast_sizet(sizenode(h)))
111 111
112 112
113static size_t objsize (GCObject *o) { 113static l_mem objsize (GCObject *o) {
114 lu_mem res;
114 switch (o->tt) { 115 switch (o->tt) {
115 case LUA_VTABLE: { 116 case LUA_VTABLE: {
116 return luaH_size(gco2t(o)); 117 res = luaH_size(gco2t(o));
118 break;
117 } 119 }
118 case LUA_VLCL: { 120 case LUA_VLCL: {
119 LClosure *cl = gco2lcl(o); 121 LClosure *cl = gco2lcl(o);
120 return sizeLclosure(cl->nupvalues); 122 res = sizeLclosure(cl->nupvalues);
123 break;
121 } 124 }
122 case LUA_VCCL: { 125 case LUA_VCCL: {
123 CClosure *cl = gco2ccl(o); 126 CClosure *cl = gco2ccl(o);
124 return sizeCclosure(cl->nupvalues); 127 res = sizeCclosure(cl->nupvalues);
128 break;
125 break; 129 break;
126 } 130 }
127 case LUA_VUSERDATA: { 131 case LUA_VUSERDATA: {
128 Udata *u = gco2u(o); 132 Udata *u = gco2u(o);
129 return sizeudata(u->nuvalue, u->len); 133 res = sizeudata(u->nuvalue, u->len);
134 break;
130 } 135 }
131 case LUA_VPROTO: { 136 case LUA_VPROTO: {
132 return luaF_protosize(gco2p(o)); 137 res = luaF_protosize(gco2p(o));
138 break;
133 } 139 }
134 case LUA_VTHREAD: { 140 case LUA_VTHREAD: {
135 return luaE_threadsize(gco2th(o)); 141 res = luaE_threadsize(gco2th(o));
142 break;
136 } 143 }
137 case LUA_VSHRSTR: { 144 case LUA_VSHRSTR: {
138 TString *ts = gco2ts(o); 145 TString *ts = gco2ts(o);
139 return sizestrshr(cast_uint(ts->shrlen)); 146 res = sizestrshr(cast_uint(ts->shrlen));
147 break;
140 } 148 }
141 case LUA_VLNGSTR: { 149 case LUA_VLNGSTR: {
142 TString *ts = gco2ts(o); 150 TString *ts = gco2ts(o);
143 return luaS_sizelngstr(ts->u.lnglen, ts->shrlen); 151 res = luaS_sizelngstr(ts->u.lnglen, ts->shrlen);
152 break;
144 } 153 }
145 case LUA_VUPVAL: { 154 case LUA_VUPVAL: {
146 return sizeof(UpVal); 155 res = sizeof(UpVal);
156 break;
147 } 157 }
148 default: lua_assert(0); return 0; 158 default: res = 0; lua_assert(0);
149 } 159 }
160 return cast(l_mem, res);
150} 161}
151 162
152 163
@@ -327,7 +338,7 @@ GCObject *luaC_newobj (lua_State *L, lu_byte tt, size_t sz) {
327** (only closures can), and a userdata's metatable must be a table. 338** (only closures can), and a userdata's metatable must be a table.
328*/ 339*/
329static void reallymarkobject (global_State *g, GCObject *o) { 340static void reallymarkobject (global_State *g, GCObject *o) {
330 g->GCmarked += cast(l_mem, objsize(o)); 341 g->GCmarked += objsize(o);
331 switch (o->tt) { 342 switch (o->tt) {
332 case LUA_VSHRSTR: 343 case LUA_VSHRSTR:
333 case LUA_VLNGSTR: { 344 case LUA_VLNGSTR: {
@@ -803,6 +814,7 @@ static void freeupval (lua_State *L, UpVal *uv) {
803 814
804 815
805static void freeobj (lua_State *L, GCObject *o) { 816static void freeobj (lua_State *L, GCObject *o) {
817 assert_code(l_mem newmem = gettotalbytes(G(L)) - objsize(o));
806 switch (o->tt) { 818 switch (o->tt) {
807 case LUA_VPROTO: 819 case LUA_VPROTO:
808 luaF_freeproto(L, gco2p(o)); 820 luaF_freeproto(L, gco2p(o));
@@ -846,6 +858,7 @@ static void freeobj (lua_State *L, GCObject *o) {
846 } 858 }
847 default: lua_assert(0); 859 default: lua_assert(0);
848 } 860 }
861 lua_assert(gettotalbytes(G(L)) == newmem);
849} 862}
850 863
851 864
@@ -1167,7 +1180,7 @@ static GCObject **sweepgen (lua_State *L, global_State *g, GCObject **p,
1167 lua_assert(age != G_OLD1); /* advanced in 'markold' */ 1180 lua_assert(age != G_OLD1); /* advanced in 'markold' */
1168 setage(curr, nextage[age]); 1181 setage(curr, nextage[age]);
1169 if (getage(curr) == G_OLD1) { 1182 if (getage(curr) == G_OLD1) {
1170 addedold += cast(l_mem, objsize(curr)); /* bytes becoming old */ 1183 addedold += objsize(curr); /* bytes becoming old */
1171 if (*pfirstold1 == NULL) 1184 if (*pfirstold1 == NULL)
1172 *pfirstold1 = curr; /* first OLD1 object in the list */ 1185 *pfirstold1 = curr; /* first OLD1 object in the list */
1173 } 1186 }