diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2025-02-20 10:09:04 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2025-02-20 10:09:04 -0300 |
| commit | e5f4927a0b97015d4c22bc22fbf80fb2c11ca7cc (patch) | |
| tree | e1eb9c4c8f5c66fdd81506fcc94a02ed0e96a48d | |
| parent | cd38fe8cf3b0f54dcc1d4a21a7a9cb585c46a43e (diff) | |
| download | lua-e5f4927a0b97015d4c22bc22fbf80fb2c11ca7cc.tar.gz lua-e5f4927a0b97015d4c22bc22fbf80fb2c11ca7cc.tar.bz2 lua-e5f4927a0b97015d4c22bc22fbf80fb2c11ca7cc.zip | |
Array sizes in undump changed from unsigned to int
Array sizes are always int and are dumped as int, so there is no reason
to read them back as unsigned.
| -rw-r--r-- | lmem.h | 3 | ||||
| -rw-r--r-- | lundump.c | 57 |
2 files changed, 27 insertions, 33 deletions
| @@ -57,7 +57,8 @@ | |||
| 57 | #define luaM_freearray(L, b, n) luaM_free_(L, (b), (n)*sizeof(*(b))) | 57 | #define luaM_freearray(L, b, n) luaM_free_(L, (b), (n)*sizeof(*(b))) |
| 58 | 58 | ||
| 59 | #define luaM_new(L,t) cast(t*, luaM_malloc_(L, sizeof(t), 0)) | 59 | #define luaM_new(L,t) cast(t*, luaM_malloc_(L, sizeof(t), 0)) |
| 60 | #define luaM_newvector(L,n,t) cast(t*, luaM_malloc_(L, (n)*sizeof(t), 0)) | 60 | #define luaM_newvector(L,n,t) \ |
| 61 | cast(t*, luaM_malloc_(L, cast_sizet(n)*sizeof(t), 0)) | ||
| 61 | #define luaM_newvectorchecked(L,n,t) \ | 62 | #define luaM_newvectorchecked(L,n,t) \ |
| 62 | (luaM_checksize(L,n,sizeof(t)), luaM_newvector(L,n,t)) | 63 | (luaM_checksize(L,n,sizeof(t)), luaM_newvector(L,n,t)) |
| 63 | 64 | ||
| @@ -52,7 +52,7 @@ static l_noret error (LoadState *S, const char *why) { | |||
| 52 | ** All high-level loads go through loadVector; you can change it to | 52 | ** All high-level loads go through loadVector; you can change it to |
| 53 | ** adapt to the endianness of the input | 53 | ** adapt to the endianness of the input |
| 54 | */ | 54 | */ |
| 55 | #define loadVector(S,b,n) loadBlock(S,b,(n)*sizeof((b)[0])) | 55 | #define loadVector(S,b,n) loadBlock(S,b,cast_sizet(n)*sizeof((b)[0])) |
| 56 | 56 | ||
| 57 | static void loadBlock (LoadState *S, void *b, size_t size) { | 57 | static void loadBlock (LoadState *S, void *b, size_t size) { |
| 58 | if (luaZ_read(S->Z, b, size) != 0) | 58 | if (luaZ_read(S->Z, b, size) != 0) |
| @@ -71,7 +71,7 @@ static void loadAlign (LoadState *S, unsigned align) { | |||
| 71 | } | 71 | } |
| 72 | 72 | ||
| 73 | 73 | ||
| 74 | #define getaddr(S,n,t) cast(t *, getaddr_(S,(n) * sizeof(t))) | 74 | #define getaddr(S,n,t) cast(t *, getaddr_(S,cast_sizet(n) * sizeof(t))) |
| 75 | 75 | ||
| 76 | static const void *getaddr_ (LoadState *S, size_t size) { | 76 | static const void *getaddr_ (LoadState *S, size_t size) { |
| 77 | const void *block = luaZ_getaddr(S->Z, size); | 77 | const void *block = luaZ_getaddr(S->Z, size); |
| @@ -113,13 +113,6 @@ static size_t loadSize (LoadState *S) { | |||
| 113 | } | 113 | } |
| 114 | 114 | ||
| 115 | 115 | ||
| 116 | /* | ||
| 117 | ** Read an non-negative int */ | ||
| 118 | static unsigned loadUint (LoadState *S) { | ||
| 119 | return cast_uint(loadVarint(S, cast_sizet(INT_MAX))); | ||
| 120 | } | ||
| 121 | |||
| 122 | |||
| 123 | static int loadInt (LoadState *S) { | 116 | static int loadInt (LoadState *S) { |
| 124 | return cast_int(loadVarint(S, cast_sizet(INT_MAX))); | 117 | return cast_int(loadVarint(S, cast_sizet(INT_MAX))); |
| 125 | } | 118 | } |
| @@ -188,15 +181,15 @@ static void loadString (LoadState *S, Proto *p, TString **sl) { | |||
| 188 | 181 | ||
| 189 | 182 | ||
| 190 | static void loadCode (LoadState *S, Proto *f) { | 183 | static void loadCode (LoadState *S, Proto *f) { |
| 191 | unsigned n = loadUint(S); | 184 | int n = loadInt(S); |
| 192 | loadAlign(S, sizeof(f->code[0])); | 185 | loadAlign(S, sizeof(f->code[0])); |
| 193 | if (S->fixed) { | 186 | if (S->fixed) { |
| 194 | f->code = getaddr(S, n, Instruction); | 187 | f->code = getaddr(S, n, Instruction); |
| 195 | f->sizecode = cast_int(n); | 188 | f->sizecode = n; |
| 196 | } | 189 | } |
| 197 | else { | 190 | else { |
| 198 | f->code = luaM_newvectorchecked(S->L, n, Instruction); | 191 | f->code = luaM_newvectorchecked(S->L, n, Instruction); |
| 199 | f->sizecode = cast_int(n); | 192 | f->sizecode = n; |
| 200 | loadVector(S, f->code, n); | 193 | loadVector(S, f->code, n); |
| 201 | } | 194 | } |
| 202 | } | 195 | } |
| @@ -206,10 +199,10 @@ static void loadFunction(LoadState *S, Proto *f); | |||
| 206 | 199 | ||
| 207 | 200 | ||
| 208 | static void loadConstants (LoadState *S, Proto *f) { | 201 | static void loadConstants (LoadState *S, Proto *f) { |
| 209 | unsigned i; | 202 | int i; |
| 210 | unsigned n = loadUint(S); | 203 | int n = loadInt(S); |
| 211 | f->k = luaM_newvectorchecked(S->L, n, TValue); | 204 | f->k = luaM_newvectorchecked(S->L, n, TValue); |
| 212 | f->sizek = cast_int(n); | 205 | f->sizek = n; |
| 213 | for (i = 0; i < n; i++) | 206 | for (i = 0; i < n; i++) |
| 214 | setnilvalue(&f->k[i]); | 207 | setnilvalue(&f->k[i]); |
| 215 | for (i = 0; i < n; i++) { | 208 | for (i = 0; i < n; i++) { |
| @@ -248,10 +241,10 @@ static void loadConstants (LoadState *S, Proto *f) { | |||
| 248 | 241 | ||
| 249 | 242 | ||
| 250 | static void loadProtos (LoadState *S, Proto *f) { | 243 | static void loadProtos (LoadState *S, Proto *f) { |
| 251 | unsigned i; | 244 | int i; |
| 252 | unsigned n = loadUint(S); | 245 | int n = loadInt(S); |
| 253 | f->p = luaM_newvectorchecked(S->L, n, Proto *); | 246 | f->p = luaM_newvectorchecked(S->L, n, Proto *); |
| 254 | f->sizep = cast_int(n); | 247 | f->sizep = n; |
| 255 | for (i = 0; i < n; i++) | 248 | for (i = 0; i < n; i++) |
| 256 | f->p[i] = NULL; | 249 | f->p[i] = NULL; |
| 257 | for (i = 0; i < n; i++) { | 250 | for (i = 0; i < n; i++) { |
| @@ -269,10 +262,10 @@ static void loadProtos (LoadState *S, Proto *f) { | |||
| 269 | ** in that case all prototypes must be consistent for the GC. | 262 | ** in that case all prototypes must be consistent for the GC. |
| 270 | */ | 263 | */ |
| 271 | static void loadUpvalues (LoadState *S, Proto *f) { | 264 | static void loadUpvalues (LoadState *S, Proto *f) { |
| 272 | unsigned i; | 265 | int i; |
| 273 | unsigned n = loadUint(S); | 266 | int n = loadInt(S); |
| 274 | f->upvalues = luaM_newvectorchecked(S->L, n, Upvaldesc); | 267 | f->upvalues = luaM_newvectorchecked(S->L, n, Upvaldesc); |
| 275 | f->sizeupvalues = cast_int(n); | 268 | f->sizeupvalues = n; |
| 276 | for (i = 0; i < n; i++) /* make array valid for GC */ | 269 | for (i = 0; i < n; i++) /* make array valid for GC */ |
| 277 | f->upvalues[i].name = NULL; | 270 | f->upvalues[i].name = NULL; |
| 278 | for (i = 0; i < n; i++) { /* following calls can raise errors */ | 271 | for (i = 0; i < n; i++) { /* following calls can raise errors */ |
| @@ -284,33 +277,33 @@ static void loadUpvalues (LoadState *S, Proto *f) { | |||
| 284 | 277 | ||
| 285 | 278 | ||
| 286 | static void loadDebug (LoadState *S, Proto *f) { | 279 | static void loadDebug (LoadState *S, Proto *f) { |
| 287 | unsigned i; | 280 | int i; |
| 288 | unsigned n = loadUint(S); | 281 | int n = loadInt(S); |
| 289 | if (S->fixed) { | 282 | if (S->fixed) { |
| 290 | f->lineinfo = getaddr(S, n, ls_byte); | 283 | f->lineinfo = getaddr(S, n, ls_byte); |
| 291 | f->sizelineinfo = cast_int(n); | 284 | f->sizelineinfo = n; |
| 292 | } | 285 | } |
| 293 | else { | 286 | else { |
| 294 | f->lineinfo = luaM_newvectorchecked(S->L, n, ls_byte); | 287 | f->lineinfo = luaM_newvectorchecked(S->L, n, ls_byte); |
| 295 | f->sizelineinfo = cast_int(n); | 288 | f->sizelineinfo = n; |
| 296 | loadVector(S, f->lineinfo, n); | 289 | loadVector(S, f->lineinfo, n); |
| 297 | } | 290 | } |
| 298 | n = loadUint(S); | 291 | n = loadInt(S); |
| 299 | if (n > 0) { | 292 | if (n > 0) { |
| 300 | loadAlign(S, sizeof(int)); | 293 | loadAlign(S, sizeof(int)); |
| 301 | if (S->fixed) { | 294 | if (S->fixed) { |
| 302 | f->abslineinfo = getaddr(S, n, AbsLineInfo); | 295 | f->abslineinfo = getaddr(S, n, AbsLineInfo); |
| 303 | f->sizeabslineinfo = cast_int(n); | 296 | f->sizeabslineinfo = n; |
| 304 | } | 297 | } |
| 305 | else { | 298 | else { |
| 306 | f->abslineinfo = luaM_newvectorchecked(S->L, n, AbsLineInfo); | 299 | f->abslineinfo = luaM_newvectorchecked(S->L, n, AbsLineInfo); |
| 307 | f->sizeabslineinfo = cast_int(n); | 300 | f->sizeabslineinfo = n; |
| 308 | loadVector(S, f->abslineinfo, n); | 301 | loadVector(S, f->abslineinfo, n); |
| 309 | } | 302 | } |
| 310 | } | 303 | } |
| 311 | n = loadUint(S); | 304 | n = loadInt(S); |
| 312 | f->locvars = luaM_newvectorchecked(S->L, n, LocVar); | 305 | f->locvars = luaM_newvectorchecked(S->L, n, LocVar); |
| 313 | f->sizelocvars = cast_int(n); | 306 | f->sizelocvars = n; |
| 314 | for (i = 0; i < n; i++) | 307 | for (i = 0; i < n; i++) |
| 315 | f->locvars[i].varname = NULL; | 308 | f->locvars[i].varname = NULL; |
| 316 | for (i = 0; i < n; i++) { | 309 | for (i = 0; i < n; i++) { |
| @@ -318,9 +311,9 @@ static void loadDebug (LoadState *S, Proto *f) { | |||
| 318 | f->locvars[i].startpc = loadInt(S); | 311 | f->locvars[i].startpc = loadInt(S); |
| 319 | f->locvars[i].endpc = loadInt(S); | 312 | f->locvars[i].endpc = loadInt(S); |
| 320 | } | 313 | } |
| 321 | n = loadUint(S); | 314 | n = loadInt(S); |
| 322 | if (n != 0) /* does it have debug information? */ | 315 | if (n != 0) /* does it have debug information? */ |
| 323 | n = cast_uint(f->sizeupvalues); /* must be this many */ | 316 | n = f->sizeupvalues; /* must be this many */ |
| 324 | for (i = 0; i < n; i++) | 317 | for (i = 0; i < n; i++) |
| 325 | loadString(S, f, &f->upvalues[i].name); | 318 | loadString(S, f, &f->upvalues[i].name); |
| 326 | } | 319 | } |
