xref: /illumos-gate/usr/src/uts/common/fs/zfs/lua/llimits.h (revision dfc11533)
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