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