mirror of
https://github.com/lua/lua
synced 2025-04-14 00:42:53 +03:00
A few changes in tests about number of bits in integers
- The preprocessor must work with at least 'long', and therefore must do shifts of up to 31 bits correctly. - Whenever possible, use unsigned types in shifts.
This commit is contained in:
parent
49c42f3615
commit
279c3a6961
@ -15,10 +15,6 @@
|
||||
#include "lua.h"
|
||||
|
||||
|
||||
/* minimum number of bits in an integer */
|
||||
#define LUAI_BITSINT (LUAI_IS32INT ? 32 : 16)
|
||||
|
||||
|
||||
/*
|
||||
** 'lu_mem' and 'l_mem' are unsigned/signed integers big enough to count
|
||||
** the total memory used by Lua (in bytes). Usually, 'size_t' and
|
||||
|
@ -266,7 +266,7 @@ static int math_type (lua_State *L) {
|
||||
|
||||
/* try to find an integer type with at least 64 bits */
|
||||
|
||||
#if (LONG_MAX >> 31 >> 31) >= 1
|
||||
#if (ULONG_MAX >> 31 >> 31) >= 3
|
||||
|
||||
/* 'long' has at least 64 bits */
|
||||
#define Rand64 unsigned long
|
||||
@ -276,7 +276,7 @@ static int math_type (lua_State *L) {
|
||||
/* there is a 'long long' type (which must have at least 64 bits) */
|
||||
#define Rand64 unsigned long long
|
||||
|
||||
#elif (LUA_MAXINTEGER >> 31 >> 31) >= 1
|
||||
#elif (LUA_MAXINTEGER >> 30 >> 30) >= 7
|
||||
|
||||
/* 'lua_Integer' has at least 64 bits */
|
||||
#define Rand64 lua_Unsigned
|
||||
@ -347,7 +347,7 @@ static lua_Number I2d (Rand64 x) {
|
||||
#else /* no 'Rand64' }{ */
|
||||
|
||||
/* get an integer with at least 32 bits */
|
||||
#if (INT_MAX >> 30) >= 1
|
||||
#if LUAI_IS32INT
|
||||
typedef unsigned int lu_int32;
|
||||
#else
|
||||
typedef unsigned long lu_int32;
|
||||
@ -538,7 +538,7 @@ static lua_Unsigned project (lua_Unsigned ran, lua_Unsigned n,
|
||||
lim |= (lim >> 4);
|
||||
lim |= (lim >> 8);
|
||||
lim |= (lim >> 16);
|
||||
#if (LUA_MAXINTEGER >> 30 >> 1) > 0
|
||||
#if (LUA_MAXINTEGER >> 30) >= 3
|
||||
lim |= (lim >> 32); /* integer type has more than 32 bits */
|
||||
#endif
|
||||
}
|
||||
|
16
lopcodes.h
16
lopcodes.h
@ -57,12 +57,18 @@ enum OpMode {iABC, iABx, iAsBx, iAx, isJ}; /* basic instruction formats */
|
||||
|
||||
#define POS_sJ POS_A
|
||||
|
||||
|
||||
/*
|
||||
** limits for opcode arguments.
|
||||
** we use (signed) int to manipulate most arguments,
|
||||
** so they must fit in LUAI_BITSINT-1 bits (-1 for sign)
|
||||
** we use (signed) 'int' to manipulate most arguments,
|
||||
** so they must fit in ints.
|
||||
*/
|
||||
#if SIZE_Bx < LUAI_BITSINT-1
|
||||
|
||||
/* Check whether type 'int' has at least 'b' bits ('b' < 32) */
|
||||
#define L_INTHASBITS(b) ((UINT_MAX >> ((b) - 1)) >= 1)
|
||||
|
||||
|
||||
#if L_INTHASBITS(SIZE_Bx)
|
||||
#define MAXARG_Bx ((1<<SIZE_Bx)-1)
|
||||
#else
|
||||
#define MAXARG_Bx MAX_INT
|
||||
@ -71,13 +77,13 @@ enum OpMode {iABC, iABx, iAsBx, iAx, isJ}; /* basic instruction formats */
|
||||
#define OFFSET_sBx (MAXARG_Bx>>1) /* 'sBx' is signed */
|
||||
|
||||
|
||||
#if SIZE_Ax < LUAI_BITSINT-1
|
||||
#if L_INTHASBITS(SIZE_Ax)
|
||||
#define MAXARG_Ax ((1<<SIZE_Ax)-1)
|
||||
#else
|
||||
#define MAXARG_Ax MAX_INT
|
||||
#endif
|
||||
|
||||
#if SIZE_sJ < LUAI_BITSINT-1
|
||||
#if L_INTHASBITS(SIZE_sJ)
|
||||
#define MAXARG_sJ ((1 << SIZE_sJ) - 1)
|
||||
#else
|
||||
#define MAXARG_sJ MAX_INT
|
||||
|
4
ltable.c
4
ltable.c
@ -214,8 +214,8 @@ LUAI_FUNC unsigned int luaH_realasize (const Table *t) {
|
||||
size |= (size >> 4);
|
||||
size |= (size >> 8);
|
||||
size |= (size >> 16);
|
||||
#if (INT_MAX >> 30 >> 1) > 0
|
||||
size |= (size >> 32); /* int has more than 32 bits */
|
||||
#if (UINT_MAX >> 30) > 3
|
||||
size |= (size >> 32); /* unsigned int has more than 32 bits */
|
||||
#endif
|
||||
size++;
|
||||
lua_assert(ispow2(size) && size/2 < t->alimit && t->alimit < size);
|
||||
|
@ -87,9 +87,8 @@
|
||||
|
||||
/*
|
||||
@@ LUAI_IS32INT is true iff 'int' has (at least) 32 bits.
|
||||
** (the use of two shifts avoids undefined shifts)
|
||||
*/
|
||||
#define LUAI_IS32INT (((UINT_MAX >> 15) >> 15) >= 3)
|
||||
#define LUAI_IS32INT ((UINT_MAX >> 30) >= 3)
|
||||
|
||||
/* }================================================================== */
|
||||
|
||||
|
@ -28,7 +28,7 @@
|
||||
/*
|
||||
** Integer type for decoded UTF-8 values; MAXUTF needs 31 bits.
|
||||
*/
|
||||
#if ((UINT_MAX >> 15) >> 15) >= 1
|
||||
#if (UINT_MAX >> 30) >= 1
|
||||
typedef unsigned int utfint;
|
||||
#else
|
||||
typedef unsigned long utfint;
|
||||
|
Loading…
x
Reference in New Issue
Block a user