diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2024-11-15 12:04:53 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2024-11-15 12:04:53 -0300 |
commit | a4762b6ffe74f5878882ef238d37bfa92d90e418 (patch) | |
tree | 4f52a82641838a318e6270522d9e7f83ccab388d /lgc.c | |
parent | d4247befa18a7911c56e7110154ad73574cd6648 (diff) | |
download | lua-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.c | 39 |
1 files changed, 26 insertions, 13 deletions
@@ -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 | ||
113 | static size_t objsize (GCObject *o) { | 113 | static 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 | */ |
329 | static void reallymarkobject (global_State *g, GCObject *o) { | 340 | static 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 | ||
805 | static void freeobj (lua_State *L, GCObject *o) { | 816 | static 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 | } |