diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2024-07-27 13:32:59 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2024-07-27 13:32:59 -0300 |
commit | 0acd55898d0aaae8dbc14c8a1bc1e3bdffc8701b (patch) | |
tree | 0ac634fed90877130b1f102bf4075af999de2158 /lobject.c | |
parent | 15231d4fb2f6984b25e0353ff46eda1a180b686d (diff) | |
download | lua-0acd55898d0aaae8dbc14c8a1bc1e3bdffc8701b.tar.gz lua-0acd55898d0aaae8dbc14c8a1bc1e3bdffc8701b.tar.bz2 lua-0acd55898d0aaae8dbc14c8a1bc1e3bdffc8701b.zip |
Added gcc option '-Wconversion'
No warnings for standard numerical types. Still pending alternative
numerical types.
Diffstat (limited to 'lobject.c')
-rw-r--r-- | lobject.c | 68 |
1 files changed, 36 insertions, 32 deletions
@@ -32,7 +32,7 @@ | |||
32 | /* | 32 | /* |
33 | ** Computes ceil(log2(x)) | 33 | ** Computes ceil(log2(x)) |
34 | */ | 34 | */ |
35 | int luaO_ceillog2 (unsigned int x) { | 35 | lu_byte luaO_ceillog2 (unsigned int x) { |
36 | static const lu_byte log_2[256] = { /* log_2[i - 1] = ceil(log2(i)) */ | 36 | static const lu_byte log_2[256] = { /* log_2[i - 1] = ceil(log2(i)) */ |
37 | 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, | 37 | 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, |
38 | 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, | 38 | 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, |
@@ -46,7 +46,7 @@ int luaO_ceillog2 (unsigned int x) { | |||
46 | int l = 0; | 46 | int l = 0; |
47 | x--; | 47 | x--; |
48 | while (x >= 256) { l += 8; x >>= 8; } | 48 | while (x >= 256) { l += 8; x >>= 8; } |
49 | return l + log_2[x]; | 49 | return cast_byte(l + log_2[x]); |
50 | } | 50 | } |
51 | 51 | ||
52 | /* | 52 | /* |
@@ -57,16 +57,19 @@ int luaO_ceillog2 (unsigned int x) { | |||
57 | ** to signal that. So, the real value is (1xxxx) * 2^(eeee - 7 - 1) if | 57 | ** to signal that. So, the real value is (1xxxx) * 2^(eeee - 7 - 1) if |
58 | ** eeee != 0, and (xxxx) * 2^-7 otherwise (subnormal numbers). | 58 | ** eeee != 0, and (xxxx) * 2^-7 otherwise (subnormal numbers). |
59 | */ | 59 | */ |
60 | unsigned int luaO_codeparam (unsigned int p) { | 60 | lu_byte luaO_codeparam (unsigned int p) { |
61 | if (p >= (cast(lu_mem, 0x1F) << (0xF - 7 - 1)) * 100u) /* overflow? */ | 61 | if (p >= (cast(lu_mem, 0x1F) << (0xF - 7 - 1)) * 100u) /* overflow? */ |
62 | return 0xFF; /* return maximum value */ | 62 | return 0xFF; /* return maximum value */ |
63 | else { | 63 | else { |
64 | p = (cast(l_uint32, p) * 128 + 99) / 100; /* round up the division */ | 64 | p = (cast(l_uint32, p) * 128 + 99) / 100; /* round up the division */ |
65 | if (p < 0x10) /* subnormal number? */ | 65 | if (p < 0x10) { /* subnormal number? */ |
66 | return p; /* exponent bits are already zero; nothing else to do */ | 66 | /* exponent bits are already zero; nothing else to do */ |
67 | else { | 67 | return cast_byte(p); |
68 | int log = luaO_ceillog2(p + 1) - 5; /* preserve 5 bits */ | 68 | } |
69 | return ((p >> log) - 0x10) | ((log + 1) << 4); | 69 | else { /* p >= 0x10 implies ceil(log2(p + 1)) >= 5 */ |
70 | /* preserve 5 bits in 'p' */ | ||
71 | unsigned log = luaO_ceillog2(p + 1) - 5u; | ||
72 | return cast_byte(((p >> log) - 0x10) | ((log + 1) << 4)); | ||
70 | } | 73 | } |
71 | } | 74 | } |
72 | } | 75 | } |
@@ -81,7 +84,7 @@ unsigned int luaO_codeparam (unsigned int p) { | |||
81 | ** more significant bits, as long as the multiplication does not | 84 | ** more significant bits, as long as the multiplication does not |
82 | ** overflow, so we check which order is best. | 85 | ** overflow, so we check which order is best. |
83 | */ | 86 | */ |
84 | l_obj luaO_applyparam (unsigned int p, l_obj x) { | 87 | l_obj luaO_applyparam (lu_byte p, l_obj x) { |
85 | unsigned int m = p & 0xF; /* mantissa */ | 88 | unsigned int m = p & 0xF; /* mantissa */ |
86 | int e = (p >> 4); /* exponent */ | 89 | int e = (p >> 4); /* exponent */ |
87 | if (e > 0) { /* normalized? */ | 90 | if (e > 0) { /* normalized? */ |
@@ -189,9 +192,9 @@ void luaO_arith (lua_State *L, int op, const TValue *p1, const TValue *p2, | |||
189 | } | 192 | } |
190 | 193 | ||
191 | 194 | ||
192 | int luaO_hexavalue (int c) { | 195 | lu_byte luaO_hexavalue (int c) { |
193 | if (lisdigit(c)) return c - '0'; | 196 | if (lisdigit(c)) return cast_byte(c - '0'); |
194 | else return (ltolower(c) - 'a') + 10; | 197 | else return cast_byte((ltolower(c) - 'a') + 10); |
195 | } | 198 | } |
196 | 199 | ||
197 | 200 | ||
@@ -349,7 +352,7 @@ static const char *l_str2int (const char *s, lua_Integer *result) { | |||
349 | int d = *s - '0'; | 352 | int d = *s - '0'; |
350 | if (a >= MAXBY10 && (a > MAXBY10 || d > MAXLASTD + neg)) /* overflow? */ | 353 | if (a >= MAXBY10 && (a > MAXBY10 || d > MAXLASTD + neg)) /* overflow? */ |
351 | return NULL; /* do not accept it (as integer) */ | 354 | return NULL; /* do not accept it (as integer) */ |
352 | a = a * 10 + d; | 355 | a = a * 10 + cast_uint(d); |
353 | empty = 0; | 356 | empty = 0; |
354 | } | 357 | } |
355 | } | 358 | } |
@@ -373,7 +376,7 @@ size_t luaO_str2num (const char *s, TValue *o) { | |||
373 | } | 376 | } |
374 | else | 377 | else |
375 | return 0; /* conversion failed */ | 378 | return 0; /* conversion failed */ |
376 | return (e - s) + 1; /* success; return string size */ | 379 | return ct_diff2sz(e - s) + 1; /* success; return string size */ |
377 | } | 380 | } |
378 | 381 | ||
379 | 382 | ||
@@ -409,7 +412,7 @@ int luaO_utf8esc (char *buff, unsigned long x) { | |||
409 | /* | 412 | /* |
410 | ** Convert a number object to a string, adding it to a buffer | 413 | ** Convert a number object to a string, adding it to a buffer |
411 | */ | 414 | */ |
412 | static int tostringbuff (TValue *obj, char *buff) { | 415 | static unsigned tostringbuff (TValue *obj, char *buff) { |
413 | int len; | 416 | int len; |
414 | lua_assert(ttisnumber(obj)); | 417 | lua_assert(ttisnumber(obj)); |
415 | if (ttisinteger(obj)) | 418 | if (ttisinteger(obj)) |
@@ -421,7 +424,7 @@ static int tostringbuff (TValue *obj, char *buff) { | |||
421 | buff[len++] = '0'; /* adds '.0' to result */ | 424 | buff[len++] = '0'; /* adds '.0' to result */ |
422 | } | 425 | } |
423 | } | 426 | } |
424 | return len; | 427 | return cast_uint(len); |
425 | } | 428 | } |
426 | 429 | ||
427 | 430 | ||
@@ -430,7 +433,7 @@ static int tostringbuff (TValue *obj, char *buff) { | |||
430 | */ | 433 | */ |
431 | void luaO_tostring (lua_State *L, TValue *obj) { | 434 | void luaO_tostring (lua_State *L, TValue *obj) { |
432 | char buff[MAXNUMBER2STR]; | 435 | char buff[MAXNUMBER2STR]; |
433 | int len = tostringbuff(obj, buff); | 436 | unsigned len = tostringbuff(obj, buff); |
434 | setsvalue(L, obj, luaS_newlstr(L, buff, len)); | 437 | setsvalue(L, obj, luaS_newlstr(L, buff, len)); |
435 | } | 438 | } |
436 | 439 | ||
@@ -448,13 +451,13 @@ void luaO_tostring (lua_State *L, TValue *obj) { | |||
448 | ** (LUA_IDSIZE + MAXNUMBER2STR) + a minimal space for basic messages, | 451 | ** (LUA_IDSIZE + MAXNUMBER2STR) + a minimal space for basic messages, |
449 | ** so that 'luaG_addinfo' can work directly on the buffer. | 452 | ** so that 'luaG_addinfo' can work directly on the buffer. |
450 | */ | 453 | */ |
451 | #define BUFVFS (LUA_IDSIZE + MAXNUMBER2STR + 95) | 454 | #define BUFVFS cast_uint(LUA_IDSIZE + MAXNUMBER2STR + 95) |
452 | 455 | ||
453 | /* buffer used by 'luaO_pushvfstring' */ | 456 | /* buffer used by 'luaO_pushvfstring' */ |
454 | typedef struct BuffFS { | 457 | typedef struct BuffFS { |
455 | lua_State *L; | 458 | lua_State *L; |
456 | int pushed; /* true if there is a part of the result on the stack */ | 459 | int pushed; /* true if there is a part of the result on the stack */ |
457 | int blen; /* length of partial string in 'space' */ | 460 | unsigned blen; /* length of partial string in 'space' */ |
458 | char space[BUFVFS]; /* holds last part of the result */ | 461 | char space[BUFVFS]; /* holds last part of the result */ |
459 | } BuffFS; | 462 | } BuffFS; |
460 | 463 | ||
@@ -492,7 +495,7 @@ static void clearbuff (BuffFS *buff) { | |||
492 | ** Get a space of size 'sz' in the buffer. If buffer has not enough | 495 | ** Get a space of size 'sz' in the buffer. If buffer has not enough |
493 | ** space, empty it. 'sz' must fit in an empty buffer. | 496 | ** space, empty it. 'sz' must fit in an empty buffer. |
494 | */ | 497 | */ |
495 | static char *getbuff (BuffFS *buff, int sz) { | 498 | static char *getbuff (BuffFS *buff, unsigned sz) { |
496 | lua_assert(buff->blen <= BUFVFS); lua_assert(sz <= BUFVFS); | 499 | lua_assert(buff->blen <= BUFVFS); lua_assert(sz <= BUFVFS); |
497 | if (sz > BUFVFS - buff->blen) /* not enough space? */ | 500 | if (sz > BUFVFS - buff->blen) /* not enough space? */ |
498 | clearbuff(buff); | 501 | clearbuff(buff); |
@@ -509,9 +512,9 @@ static char *getbuff (BuffFS *buff, int sz) { | |||
509 | */ | 512 | */ |
510 | static void addstr2buff (BuffFS *buff, const char *str, size_t slen) { | 513 | static void addstr2buff (BuffFS *buff, const char *str, size_t slen) { |
511 | if (slen <= BUFVFS) { /* does string fit into buffer? */ | 514 | if (slen <= BUFVFS) { /* does string fit into buffer? */ |
512 | char *bf = getbuff(buff, cast_int(slen)); | 515 | char *bf = getbuff(buff, cast_uint(slen)); |
513 | memcpy(bf, str, slen); /* add string to buffer */ | 516 | memcpy(bf, str, slen); /* add string to buffer */ |
514 | addsize(buff, cast_int(slen)); | 517 | addsize(buff, cast_uint(slen)); |
515 | } | 518 | } |
516 | else { /* string larger than buffer */ | 519 | else { /* string larger than buffer */ |
517 | clearbuff(buff); /* string comes after buffer's content */ | 520 | clearbuff(buff); /* string comes after buffer's content */ |
@@ -525,7 +528,7 @@ static void addstr2buff (BuffFS *buff, const char *str, size_t slen) { | |||
525 | */ | 528 | */ |
526 | static void addnum2buff (BuffFS *buff, TValue *num) { | 529 | static void addnum2buff (BuffFS *buff, TValue *num) { |
527 | char *numbuff = getbuff(buff, MAXNUMBER2STR); | 530 | char *numbuff = getbuff(buff, MAXNUMBER2STR); |
528 | int len = tostringbuff(num, numbuff); /* format number into 'numbuff' */ | 531 | unsigned len = tostringbuff(num, numbuff); /* format number into 'numbuff' */ |
529 | addsize(buff, len); | 532 | addsize(buff, len); |
530 | } | 533 | } |
531 | 534 | ||
@@ -537,10 +540,10 @@ static void addnum2buff (BuffFS *buff, TValue *num) { | |||
537 | const char *luaO_pushvfstring (lua_State *L, const char *fmt, va_list argp) { | 540 | const char *luaO_pushvfstring (lua_State *L, const char *fmt, va_list argp) { |
538 | BuffFS buff; /* holds last part of the result */ | 541 | BuffFS buff; /* holds last part of the result */ |
539 | const char *e; /* points to next '%' */ | 542 | const char *e; /* points to next '%' */ |
540 | buff.pushed = buff.blen = 0; | 543 | buff.pushed = 0; buff.blen = 0; |
541 | buff.L = L; | 544 | buff.L = L; |
542 | while ((e = strchr(fmt, '%')) != NULL) { | 545 | while ((e = strchr(fmt, '%')) != NULL) { |
543 | addstr2buff(&buff, fmt, e - fmt); /* add 'fmt' up to '%' */ | 546 | addstr2buff(&buff, fmt, ct_diff2sz(e - fmt)); /* add 'fmt' up to '%' */ |
544 | switch (*(e + 1)) { /* conversion specifier */ | 547 | switch (*(e + 1)) { /* conversion specifier */ |
545 | case 's': { /* zero-terminated string */ | 548 | case 's': { /* zero-terminated string */ |
546 | const char *s = va_arg(argp, char *); | 549 | const char *s = va_arg(argp, char *); |
@@ -549,7 +552,7 @@ const char *luaO_pushvfstring (lua_State *L, const char *fmt, va_list argp) { | |||
549 | break; | 552 | break; |
550 | } | 553 | } |
551 | case 'c': { /* an 'int' as a character */ | 554 | case 'c': { /* an 'int' as a character */ |
552 | char c = cast_uchar(va_arg(argp, int)); | 555 | char c = cast_char(va_arg(argp, int)); |
553 | addstr2buff(&buff, &c, sizeof(char)); | 556 | addstr2buff(&buff, &c, sizeof(char)); |
554 | break; | 557 | break; |
555 | } | 558 | } |
@@ -572,17 +575,17 @@ const char *luaO_pushvfstring (lua_State *L, const char *fmt, va_list argp) { | |||
572 | break; | 575 | break; |
573 | } | 576 | } |
574 | case 'p': { /* a pointer */ | 577 | case 'p': { /* a pointer */ |
575 | const int sz = 3 * sizeof(void*) + 8; /* enough space for '%p' */ | 578 | const unsigned sz = 3 * sizeof(void*) + 8; /* enough space for '%p' */ |
576 | char *bf = getbuff(&buff, sz); | 579 | char *bf = getbuff(&buff, sz); |
577 | void *p = va_arg(argp, void *); | 580 | void *p = va_arg(argp, void *); |
578 | int len = lua_pointer2str(bf, sz, p); | 581 | int len = lua_pointer2str(bf, sz, p); |
579 | addsize(&buff, len); | 582 | addsize(&buff, cast_uint(len)); |
580 | break; | 583 | break; |
581 | } | 584 | } |
582 | case 'U': { /* a 'long' as a UTF-8 sequence */ | 585 | case 'U': { /* an 'unsigned long' as a UTF-8 sequence */ |
583 | char bf[UTF8BUFFSZ]; | 586 | char bf[UTF8BUFFSZ]; |
584 | int len = luaO_utf8esc(bf, va_arg(argp, long)); | 587 | int len = luaO_utf8esc(bf, va_arg(argp, unsigned long)); |
585 | addstr2buff(&buff, bf + UTF8BUFFSZ - len, len); | 588 | addstr2buff(&buff, bf + UTF8BUFFSZ - len, cast_uint(len)); |
586 | break; | 589 | break; |
587 | } | 590 | } |
588 | case '%': { | 591 | case '%': { |
@@ -648,7 +651,8 @@ void luaO_chunkid (char *out, const char *source, size_t srclen) { | |||
648 | addstr(out, source, srclen); /* keep it */ | 651 | addstr(out, source, srclen); /* keep it */ |
649 | } | 652 | } |
650 | else { | 653 | else { |
651 | if (nl != NULL) srclen = nl - source; /* stop at first newline */ | 654 | if (nl != NULL) |
655 | srclen = ct_diff2sz(nl - source); /* stop at first newline */ | ||
652 | if (srclen > bufflen) srclen = bufflen; | 656 | if (srclen > bufflen) srclen = bufflen; |
653 | addstr(out, source, srclen); | 657 | addstr(out, source, srclen); |
654 | addstr(out, RETS, LL(RETS)); | 658 | addstr(out, RETS, LL(RETS)); |