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