Home | History | Annotate | Download | only in src
      1 /*
      2 ** $Id: llimits.h,v 1.103 2013/02/20 14:08:56 roberto Exp $
      3 ** Limits, basic types, and some other `installation-dependent' definitions
      4 ** See Copyright Notice in lua.h
      5 */
      6 
      7 #ifndef llimits_h
      8 #define llimits_h
      9 
     10 
     11 #include <limits.h>
     12 #include <stddef.h>
     13 
     14 
     15 #include "lua.h"
     16 
     17 
     18 typedef unsigned LUA_INT32 lu_int32;
     19 
     20 typedef LUAI_UMEM lu_mem;
     21 
     22 typedef LUAI_MEM l_mem;
     23 
     24 
     25 
     26 /* chars used as small naturals (so that `char' is reserved for characters) */
     27 typedef unsigned char lu_byte;
     28 
     29 
     30 #define MAX_SIZET	((size_t)(~(size_t)0)-2)
     31 
     32 #define MAX_LUMEM	((lu_mem)(~(lu_mem)0)-2)
     33 
     34 #define MAX_LMEM	((l_mem) ((MAX_LUMEM >> 1) - 2))
     35 
     36 
     37 #define MAX_INT (INT_MAX-2)  /* maximum value of an int (-2 for safety) */
     38 
     39 /*
     40 ** conversion of pointer to integer
     41 ** this is for hashing only; there is no problem if the integer
     42 ** cannot hold the whole pointer value
     43 */
     44 #define IntPoint(p)  ((unsigned int)(lu_mem)(p))
     45 
     46 
     47 
     48 /* type to ensure maximum alignment */
     49 #if !defined(LUAI_USER_ALIGNMENT_T)
     50 #define LUAI_USER_ALIGNMENT_T	union { double u; void *s; long l; }
     51 #endif
     52 
     53 typedef LUAI_USER_ALIGNMENT_T L_Umaxalign;
     54 
     55 
     56 /* result of a `usual argument conversion' over lua_Number */
     57 typedef LUAI_UACNUMBER l_uacNumber;
     58 
     59 
     60 /* internal assertions for in-house debugging */
     61 #if defined(lua_assert)
     62 #define check_exp(c,e)		(lua_assert(c), (e))
     63 /* to avoid problems with conditions too long */
     64 #define lua_longassert(c)	{ if (!(c)) lua_assert(0); }
     65 #else
     66 #define lua_assert(c)		((void)0)
     67 #define check_exp(c,e)		(e)
     68 #define lua_longassert(c)	((void)0)
     69 #endif
     70 
     71 /*
     72 ** assertion for checking API calls
     73 */
     74 #if !defined(luai_apicheck)
     75 
     76 #if defined(LUA_USE_APICHECK)
     77 #include <assert.h>
     78 #define luai_apicheck(L,e)	assert(e)
     79 #else
     80 #define luai_apicheck(L,e)	lua_assert(e)
     81 #endif
     82 
     83 #endif
     84 
     85 #define api_check(l,e,msg)	luai_apicheck(l,(e) && msg)
     86 
     87 
     88 #if !defined(UNUSED)
     89 #define UNUSED(x)	((void)(x))	/* to avoid warnings */
     90 #endif
     91 
     92 
     93 #define cast(t, exp)	((t)(exp))
     94 
     95 #define cast_byte(i)	cast(lu_byte, (i))
     96 #define cast_num(i)	cast(lua_Number, (i))
     97 #define cast_int(i)	cast(int, (i))
     98 #define cast_uchar(i)	cast(unsigned char, (i))
     99 
    100 
    101 /*
    102 ** non-return type
    103 */
    104 #if defined(__GNUC__)
    105 #define l_noret		void __attribute__((noreturn))
    106 #elif defined(_MSC_VER)
    107 #define l_noret		void __declspec(noreturn)
    108 #else
    109 #define l_noret		void
    110 #endif
    111 
    112 
    113 
    114 /*
    115 ** maximum depth for nested C calls and syntactical nested non-terminals
    116 ** in a program. (Value must fit in an unsigned short int.)
    117 */
    118 #if !defined(LUAI_MAXCCALLS)
    119 #define LUAI_MAXCCALLS		200
    120 #endif
    121 
    122 /*
    123 ** maximum number of upvalues in a closure (both C and Lua). (Value
    124 ** must fit in an unsigned char.)
    125 */
    126 #define MAXUPVAL	UCHAR_MAX
    127 
    128 
    129 /*
    130 ** type for virtual-machine instructions
    131 ** must be an unsigned with (at least) 4 bytes (see details in lopcodes.h)
    132 */
    133 typedef lu_int32 Instruction;
    134 
    135 
    136 
    137 /* maximum stack for a Lua function */
    138 #define MAXSTACK	250
    139 
    140 
    141 
    142 /* minimum size for the string table (must be power of 2) */
    143 #if !defined(MINSTRTABSIZE)
    144 #define MINSTRTABSIZE	32
    145 #endif
    146 
    147 
    148 /* minimum size for string buffer */
    149 #if !defined(LUA_MINBUFFER)
    150 #define LUA_MINBUFFER	32
    151 #endif
    152 
    153 
    154 #if !defined(lua_lock)
    155 #define lua_lock(L)     ((void) 0)
    156 #define lua_unlock(L)   ((void) 0)
    157 #endif
    158 
    159 #if !defined(luai_threadyield)
    160 #define luai_threadyield(L)     {lua_unlock(L); lua_lock(L);}
    161 #endif
    162 
    163 
    164 /*
    165 ** these macros allow user-specific actions on threads when you defined
    166 ** LUAI_EXTRASPACE and need to do something extra when a thread is
    167 ** created/deleted/resumed/yielded.
    168 */
    169 #if !defined(luai_userstateopen)
    170 #define luai_userstateopen(L)		((void)L)
    171 #endif
    172 
    173 #if !defined(luai_userstateclose)
    174 #define luai_userstateclose(L)		((void)L)
    175 #endif
    176 
    177 #if !defined(luai_userstatethread)
    178 #define luai_userstatethread(L,L1)	((void)L)
    179 #endif
    180 
    181 #if !defined(luai_userstatefree)
    182 #define luai_userstatefree(L,L1)	((void)L)
    183 #endif
    184 
    185 #if !defined(luai_userstateresume)
    186 #define luai_userstateresume(L,n)       ((void)L)
    187 #endif
    188 
    189 #if !defined(luai_userstateyield)
    190 #define luai_userstateyield(L,n)        ((void)L)
    191 #endif
    192 
    193 /*
    194 ** lua_number2int is a macro to convert lua_Number to int.
    195 ** lua_number2integer is a macro to convert lua_Number to lua_Integer.
    196 ** lua_number2unsigned is a macro to convert a lua_Number to a lua_Unsigned.
    197 ** lua_unsigned2number is a macro to convert a lua_Unsigned to a lua_Number.
    198 ** luai_hashnum is a macro to hash a lua_Number value into an integer.
    199 ** The hash must be deterministic and give reasonable values for
    200 ** both small and large values (outside the range of integers).
    201 */
    202 
    203 #if defined(MS_ASMTRICK) || defined(LUA_MSASMTRICK)	/* { */
    204 /* trick with Microsoft assembler for X86 */
    205 
    206 #define lua_number2int(i,n)  __asm {__asm fld n   __asm fistp i}
    207 #define lua_number2integer(i,n)		lua_number2int(i, n)
    208 #define lua_number2unsigned(i,n)  \
    209   {__int64 l; __asm {__asm fld n   __asm fistp l} i = (unsigned int)l;}
    210 
    211 
    212 #elif defined(LUA_IEEE754TRICK)		/* }{ */
    213 /* the next trick should work on any machine using IEEE754 with
    214    a 32-bit int type */
    215 
    216 union luai_Cast { double l_d; LUA_INT32 l_p[2]; };
    217 
    218 #if !defined(LUA_IEEEENDIAN)	/* { */
    219 #define LUAI_EXTRAIEEE	\
    220   static const union luai_Cast ieeeendian = {-(33.0 + 6755399441055744.0)};
    221 #define LUA_IEEEENDIANLOC	(ieeeendian.l_p[1] == 33)
    222 #else
    223 #define LUA_IEEEENDIANLOC	LUA_IEEEENDIAN
    224 #define LUAI_EXTRAIEEE		/* empty */
    225 #endif				/* } */
    226 
    227 #define lua_number2int32(i,n,t) \
    228   { LUAI_EXTRAIEEE \
    229     volatile union luai_Cast u; u.l_d = (n) + 6755399441055744.0; \
    230     (i) = (t)u.l_p[LUA_IEEEENDIANLOC]; }
    231 
    232 #define luai_hashnum(i,n)  \
    233   { volatile union luai_Cast u; u.l_d = (n) + 1.0;  /* avoid -0 */ \
    234     (i) = u.l_p[0]; (i) += u.l_p[1]; }  /* add double bits for his hash */
    235 
    236 #define lua_number2int(i,n)		lua_number2int32(i, n, int)
    237 #define lua_number2unsigned(i,n)	lua_number2int32(i, n, lua_Unsigned)
    238 
    239 /* the trick can be expanded to lua_Integer when it is a 32-bit value */
    240 #if defined(LUA_IEEELL)
    241 #define lua_number2integer(i,n)		lua_number2int32(i, n, lua_Integer)
    242 #endif
    243 
    244 #endif				/* } */
    245 
    246 
    247 /* the following definitions always work, but may be slow */
    248 
    249 #if !defined(lua_number2int)
    250 #define lua_number2int(i,n)	((i)=(int)(n))
    251 #endif
    252 
    253 #if !defined(lua_number2integer)
    254 #define lua_number2integer(i,n)	((i)=(lua_Integer)(n))
    255 #endif
    256 
    257 #if !defined(lua_number2unsigned)	/* { */
    258 /* the following definition assures proper modulo behavior */
    259 #if defined(LUA_NUMBER_DOUBLE) || defined(LUA_NUMBER_FLOAT)
    260 #include <math.h>
    261 #define SUPUNSIGNED	((lua_Number)(~(lua_Unsigned)0) + 1)
    262 #define lua_number2unsigned(i,n)  \
    263 	((i)=(lua_Unsigned)((n) - floor((n)/SUPUNSIGNED)*SUPUNSIGNED))
    264 #else
    265 #define lua_number2unsigned(i,n)	((i)=(lua_Unsigned)(n))
    266 #endif
    267 #endif				/* } */
    268 
    269 
    270 #if !defined(lua_unsigned2number)
    271 /* on several machines, coercion from unsigned to double is slow,
    272    so it may be worth to avoid */
    273 #define lua_unsigned2number(u)  \
    274     (((u) <= (lua_Unsigned)INT_MAX) ? (lua_Number)(int)(u) : (lua_Number)(u))
    275 #endif
    276 
    277 
    278 
    279 #if defined(ltable_c) && !defined(luai_hashnum)
    280 
    281 #include <float.h>
    282 #include <math.h>
    283 
    284 #define luai_hashnum(i,n) { int e;  \
    285   n = l_mathop(frexp)(n, &e) * (lua_Number)(INT_MAX - DBL_MAX_EXP);  \
    286   lua_number2int(i, n); i += e; }
    287 
    288 #endif
    289 
    290 
    291 
    292 /*
    293 ** macro to control inclusion of some hard tests on stack reallocation
    294 */
    295 #if !defined(HARDSTACKTESTS)
    296 #define condmovestack(L)	((void)0)
    297 #else
    298 /* realloc stack keeping its size */
    299 #define condmovestack(L)	luaD_reallocstack((L), (L)->stacksize)
    300 #endif
    301 
    302 #if !defined(HARDMEMTESTS)
    303 #define condchangemem(L)	condmovestack(L)
    304 #else
    305 #define condchangemem(L)  \
    306 	((void)(!(G(L)->gcrunning) || (luaC_fullgc(L, 0), 1)))
    307 #endif
    308 
    309 #endif
    310