xref: /aosp_15_r20/external/lua/src/llimits.h (revision 088332b5b69e7ab13924864b272aabfc2509d2d5)
1*088332b5SXin Li /*
2*088332b5SXin Li ** $Id: llimits.h $
3*088332b5SXin Li ** Limits, basic types, and some other 'installation-dependent' definitions
4*088332b5SXin Li ** See Copyright Notice in lua.h
5*088332b5SXin Li */
6*088332b5SXin Li 
7*088332b5SXin Li #ifndef llimits_h
8*088332b5SXin Li #define llimits_h
9*088332b5SXin Li 
10*088332b5SXin Li 
11*088332b5SXin Li #include <limits.h>
12*088332b5SXin Li #include <stddef.h>
13*088332b5SXin Li 
14*088332b5SXin Li 
15*088332b5SXin Li #include "lua.h"
16*088332b5SXin Li 
17*088332b5SXin Li 
18*088332b5SXin Li /*
19*088332b5SXin Li ** 'lu_mem' and 'l_mem' are unsigned/signed integers big enough to count
20*088332b5SXin Li ** the total memory used by Lua (in bytes). Usually, 'size_t' and
21*088332b5SXin Li ** 'ptrdiff_t' should work, but we use 'long' for 16-bit machines.
22*088332b5SXin Li */
23*088332b5SXin Li #if defined(LUAI_MEM)		/* { external definitions? */
24*088332b5SXin Li typedef LUAI_UMEM lu_mem;
25*088332b5SXin Li typedef LUAI_MEM l_mem;
26*088332b5SXin Li #elif LUAI_IS32INT	/* }{ */
27*088332b5SXin Li typedef size_t lu_mem;
28*088332b5SXin Li typedef ptrdiff_t l_mem;
29*088332b5SXin Li #else  /* 16-bit ints */	/* }{ */
30*088332b5SXin Li typedef unsigned long lu_mem;
31*088332b5SXin Li typedef long l_mem;
32*088332b5SXin Li #endif				/* } */
33*088332b5SXin Li 
34*088332b5SXin Li 
35*088332b5SXin Li /* chars used as small naturals (so that 'char' is reserved for characters) */
36*088332b5SXin Li typedef unsigned char lu_byte;
37*088332b5SXin Li typedef signed char ls_byte;
38*088332b5SXin Li 
39*088332b5SXin Li 
40*088332b5SXin Li /* maximum value for size_t */
41*088332b5SXin Li #define MAX_SIZET	((size_t)(~(size_t)0))
42*088332b5SXin Li 
43*088332b5SXin Li /* maximum size visible for Lua (must be representable in a lua_Integer) */
44*088332b5SXin Li #define MAX_SIZE	(sizeof(size_t) < sizeof(lua_Integer) ? MAX_SIZET \
45*088332b5SXin Li                           : (size_t)(LUA_MAXINTEGER))
46*088332b5SXin Li 
47*088332b5SXin Li 
48*088332b5SXin Li #define MAX_LUMEM	((lu_mem)(~(lu_mem)0))
49*088332b5SXin Li 
50*088332b5SXin Li #define MAX_LMEM	((l_mem)(MAX_LUMEM >> 1))
51*088332b5SXin Li 
52*088332b5SXin Li 
53*088332b5SXin Li #define MAX_INT		INT_MAX  /* maximum value of an int */
54*088332b5SXin Li 
55*088332b5SXin Li 
56*088332b5SXin Li /*
57*088332b5SXin Li ** floor of the log2 of the maximum signed value for integral type 't'.
58*088332b5SXin Li ** (That is, maximum 'n' such that '2^n' fits in the given signed type.)
59*088332b5SXin Li */
60*088332b5SXin Li #define log2maxs(t)	(sizeof(t) * 8 - 2)
61*088332b5SXin Li 
62*088332b5SXin Li 
63*088332b5SXin Li /*
64*088332b5SXin Li ** test whether an unsigned value is a power of 2 (or zero)
65*088332b5SXin Li */
66*088332b5SXin Li #define ispow2(x)	(((x) & ((x) - 1)) == 0)
67*088332b5SXin Li 
68*088332b5SXin Li 
69*088332b5SXin Li /* number of chars of a literal string without the ending \0 */
70*088332b5SXin Li #define LL(x)   (sizeof(x)/sizeof(char) - 1)
71*088332b5SXin Li 
72*088332b5SXin Li 
73*088332b5SXin Li /*
74*088332b5SXin Li ** conversion of pointer to unsigned integer:
75*088332b5SXin Li ** this is for hashing only; there is no problem if the integer
76*088332b5SXin Li ** cannot hold the whole pointer value
77*088332b5SXin Li */
78*088332b5SXin Li #define point2uint(p)	((unsigned int)((size_t)(p) & UINT_MAX))
79*088332b5SXin Li 
80*088332b5SXin Li 
81*088332b5SXin Li 
82*088332b5SXin Li /* types of 'usual argument conversions' for lua_Number and lua_Integer */
83*088332b5SXin Li typedef LUAI_UACNUMBER l_uacNumber;
84*088332b5SXin Li typedef LUAI_UACINT l_uacInt;
85*088332b5SXin Li 
86*088332b5SXin Li 
87*088332b5SXin Li /*
88*088332b5SXin Li ** Internal assertions for in-house debugging
89*088332b5SXin Li */
90*088332b5SXin Li #if defined LUAI_ASSERT
91*088332b5SXin Li #undef NDEBUG
92*088332b5SXin Li #include <assert.h>
93*088332b5SXin Li #define lua_assert(c)           assert(c)
94*088332b5SXin Li #endif
95*088332b5SXin Li 
96*088332b5SXin Li #if defined(lua_assert)
97*088332b5SXin Li #define check_exp(c,e)		(lua_assert(c), (e))
98*088332b5SXin Li /* to avoid problems with conditions too long */
99*088332b5SXin Li #define lua_longassert(c)	((c) ? (void)0 : lua_assert(0))
100*088332b5SXin Li #else
101*088332b5SXin Li #define lua_assert(c)		((void)0)
102*088332b5SXin Li #define check_exp(c,e)		(e)
103*088332b5SXin Li #define lua_longassert(c)	((void)0)
104*088332b5SXin Li #endif
105*088332b5SXin Li 
106*088332b5SXin Li /*
107*088332b5SXin Li ** assertion for checking API calls
108*088332b5SXin Li */
109*088332b5SXin Li #if !defined(luai_apicheck)
110*088332b5SXin Li #define luai_apicheck(l,e)	((void)l, lua_assert(e))
111*088332b5SXin Li #endif
112*088332b5SXin Li 
113*088332b5SXin Li #define api_check(l,e,msg)	luai_apicheck(l,(e) && msg)
114*088332b5SXin Li 
115*088332b5SXin Li 
116*088332b5SXin Li /* macro to avoid warnings about unused variables */
117*088332b5SXin Li #if !defined(UNUSED)
118*088332b5SXin Li #define UNUSED(x)	((void)(x))
119*088332b5SXin Li #endif
120*088332b5SXin Li 
121*088332b5SXin Li 
122*088332b5SXin Li /* type casts (a macro highlights casts in the code) */
123*088332b5SXin Li #define cast(t, exp)	((t)(exp))
124*088332b5SXin Li 
125*088332b5SXin Li #define cast_void(i)	cast(void, (i))
126*088332b5SXin Li #define cast_voidp(i)	cast(void *, (i))
127*088332b5SXin Li #define cast_num(i)	cast(lua_Number, (i))
128*088332b5SXin Li #define cast_int(i)	cast(int, (i))
129*088332b5SXin Li #define cast_uint(i)	cast(unsigned int, (i))
130*088332b5SXin Li #define cast_byte(i)	cast(lu_byte, (i))
131*088332b5SXin Li #define cast_uchar(i)	cast(unsigned char, (i))
132*088332b5SXin Li #define cast_char(i)	cast(char, (i))
133*088332b5SXin Li #define cast_charp(i)	cast(char *, (i))
134*088332b5SXin Li #define cast_sizet(i)	cast(size_t, (i))
135*088332b5SXin Li 
136*088332b5SXin Li 
137*088332b5SXin Li /* cast a signed lua_Integer to lua_Unsigned */
138*088332b5SXin Li #if !defined(l_castS2U)
139*088332b5SXin Li #define l_castS2U(i)	((lua_Unsigned)(i))
140*088332b5SXin Li #endif
141*088332b5SXin Li 
142*088332b5SXin Li /*
143*088332b5SXin Li ** cast a lua_Unsigned to a signed lua_Integer; this cast is
144*088332b5SXin Li ** not strict ISO C, but two-complement architectures should
145*088332b5SXin Li ** work fine.
146*088332b5SXin Li */
147*088332b5SXin Li #if !defined(l_castU2S)
148*088332b5SXin Li #define l_castU2S(i)	((lua_Integer)(i))
149*088332b5SXin Li #endif
150*088332b5SXin Li 
151*088332b5SXin Li 
152*088332b5SXin Li /*
153*088332b5SXin Li ** macros to improve jump prediction (used mainly for error handling)
154*088332b5SXin Li */
155*088332b5SXin Li #if !defined(likely)
156*088332b5SXin Li 
157*088332b5SXin Li #if defined(__GNUC__)
158*088332b5SXin Li #define likely(x)	(__builtin_expect(((x) != 0), 1))
159*088332b5SXin Li #define unlikely(x)	(__builtin_expect(((x) != 0), 0))
160*088332b5SXin Li #else
161*088332b5SXin Li #define likely(x)	(x)
162*088332b5SXin Li #define unlikely(x)	(x)
163*088332b5SXin Li #endif
164*088332b5SXin Li 
165*088332b5SXin Li #endif
166*088332b5SXin Li 
167*088332b5SXin Li 
168*088332b5SXin Li /*
169*088332b5SXin Li ** non-return type
170*088332b5SXin Li */
171*088332b5SXin Li #if !defined(l_noret)
172*088332b5SXin Li 
173*088332b5SXin Li #if defined(__GNUC__)
174*088332b5SXin Li #define l_noret		void __attribute__((noreturn))
175*088332b5SXin Li #elif defined(_MSC_VER) && _MSC_VER >= 1200
176*088332b5SXin Li #define l_noret		void __declspec(noreturn)
177*088332b5SXin Li #else
178*088332b5SXin Li #define l_noret		void
179*088332b5SXin Li #endif
180*088332b5SXin Li 
181*088332b5SXin Li #endif
182*088332b5SXin Li 
183*088332b5SXin Li 
184*088332b5SXin Li /*
185*088332b5SXin Li ** type for virtual-machine instructions;
186*088332b5SXin Li ** must be an unsigned with (at least) 4 bytes (see details in lopcodes.h)
187*088332b5SXin Li */
188*088332b5SXin Li #if LUAI_IS32INT
189*088332b5SXin Li typedef unsigned int l_uint32;
190*088332b5SXin Li #else
191*088332b5SXin Li typedef unsigned long l_uint32;
192*088332b5SXin Li #endif
193*088332b5SXin Li 
194*088332b5SXin Li typedef l_uint32 Instruction;
195*088332b5SXin Li 
196*088332b5SXin Li 
197*088332b5SXin Li 
198*088332b5SXin Li /*
199*088332b5SXin Li ** Maximum length for short strings, that is, strings that are
200*088332b5SXin Li ** internalized. (Cannot be smaller than reserved words or tags for
201*088332b5SXin Li ** metamethods, as these strings must be internalized;
202*088332b5SXin Li ** #("function") = 8, #("__newindex") = 10.)
203*088332b5SXin Li */
204*088332b5SXin Li #if !defined(LUAI_MAXSHORTLEN)
205*088332b5SXin Li #define LUAI_MAXSHORTLEN	40
206*088332b5SXin Li #endif
207*088332b5SXin Li 
208*088332b5SXin Li 
209*088332b5SXin Li /*
210*088332b5SXin Li ** Initial size for the string table (must be power of 2).
211*088332b5SXin Li ** The Lua core alone registers ~50 strings (reserved words +
212*088332b5SXin Li ** metaevent keys + a few others). Libraries would typically add
213*088332b5SXin Li ** a few dozens more.
214*088332b5SXin Li */
215*088332b5SXin Li #if !defined(MINSTRTABSIZE)
216*088332b5SXin Li #define MINSTRTABSIZE	128
217*088332b5SXin Li #endif
218*088332b5SXin Li 
219*088332b5SXin Li 
220*088332b5SXin Li /*
221*088332b5SXin Li ** Size of cache for strings in the API. 'N' is the number of
222*088332b5SXin Li ** sets (better be a prime) and "M" is the size of each set (M == 1
223*088332b5SXin Li ** makes a direct cache.)
224*088332b5SXin Li */
225*088332b5SXin Li #if !defined(STRCACHE_N)
226*088332b5SXin Li #define STRCACHE_N		53
227*088332b5SXin Li #define STRCACHE_M		2
228*088332b5SXin Li #endif
229*088332b5SXin Li 
230*088332b5SXin Li 
231*088332b5SXin Li /* minimum size for string buffer */
232*088332b5SXin Li #if !defined(LUA_MINBUFFER)
233*088332b5SXin Li #define LUA_MINBUFFER	32
234*088332b5SXin Li #endif
235*088332b5SXin Li 
236*088332b5SXin Li 
237*088332b5SXin Li /*
238*088332b5SXin Li ** macros that are executed whenever program enters the Lua core
239*088332b5SXin Li ** ('lua_lock') and leaves the core ('lua_unlock')
240*088332b5SXin Li */
241*088332b5SXin Li #if !defined(lua_lock)
242*088332b5SXin Li #define lua_lock(L)	((void) 0)
243*088332b5SXin Li #define lua_unlock(L)	((void) 0)
244*088332b5SXin Li #endif
245*088332b5SXin Li 
246*088332b5SXin Li /*
247*088332b5SXin Li ** macro executed during Lua functions at points where the
248*088332b5SXin Li ** function can yield.
249*088332b5SXin Li */
250*088332b5SXin Li #if !defined(luai_threadyield)
251*088332b5SXin Li #define luai_threadyield(L)	{lua_unlock(L); lua_lock(L);}
252*088332b5SXin Li #endif
253*088332b5SXin Li 
254*088332b5SXin Li 
255*088332b5SXin Li /*
256*088332b5SXin Li ** these macros allow user-specific actions when a thread is
257*088332b5SXin Li ** created/deleted/resumed/yielded.
258*088332b5SXin Li */
259*088332b5SXin Li #if !defined(luai_userstateopen)
260*088332b5SXin Li #define luai_userstateopen(L)		((void)L)
261*088332b5SXin Li #endif
262*088332b5SXin Li 
263*088332b5SXin Li #if !defined(luai_userstateclose)
264*088332b5SXin Li #define luai_userstateclose(L)		((void)L)
265*088332b5SXin Li #endif
266*088332b5SXin Li 
267*088332b5SXin Li #if !defined(luai_userstatethread)
268*088332b5SXin Li #define luai_userstatethread(L,L1)	((void)L)
269*088332b5SXin Li #endif
270*088332b5SXin Li 
271*088332b5SXin Li #if !defined(luai_userstatefree)
272*088332b5SXin Li #define luai_userstatefree(L,L1)	((void)L)
273*088332b5SXin Li #endif
274*088332b5SXin Li 
275*088332b5SXin Li #if !defined(luai_userstateresume)
276*088332b5SXin Li #define luai_userstateresume(L,n)	((void)L)
277*088332b5SXin Li #endif
278*088332b5SXin Li 
279*088332b5SXin Li #if !defined(luai_userstateyield)
280*088332b5SXin Li #define luai_userstateyield(L,n)	((void)L)
281*088332b5SXin Li #endif
282*088332b5SXin Li 
283*088332b5SXin Li 
284*088332b5SXin Li 
285*088332b5SXin Li /*
286*088332b5SXin Li ** The luai_num* macros define the primitive operations over numbers.
287*088332b5SXin Li */
288*088332b5SXin Li 
289*088332b5SXin Li /* floor division (defined as 'floor(a/b)') */
290*088332b5SXin Li #if !defined(luai_numidiv)
291*088332b5SXin Li #define luai_numidiv(L,a,b)     ((void)L, l_floor(luai_numdiv(L,a,b)))
292*088332b5SXin Li #endif
293*088332b5SXin Li 
294*088332b5SXin Li /* float division */
295*088332b5SXin Li #if !defined(luai_numdiv)
296*088332b5SXin Li #define luai_numdiv(L,a,b)      ((a)/(b))
297*088332b5SXin Li #endif
298*088332b5SXin Li 
299*088332b5SXin Li /*
300*088332b5SXin Li ** modulo: defined as 'a - floor(a/b)*b'; the direct computation
301*088332b5SXin Li ** using this definition has several problems with rounding errors,
302*088332b5SXin Li ** so it is better to use 'fmod'. 'fmod' gives the result of
303*088332b5SXin Li ** 'a - trunc(a/b)*b', and therefore must be corrected when
304*088332b5SXin Li ** 'trunc(a/b) ~= floor(a/b)'. That happens when the division has a
305*088332b5SXin Li ** non-integer negative result: non-integer result is equivalent to
306*088332b5SXin Li ** a non-zero remainder 'm'; negative result is equivalent to 'a' and
307*088332b5SXin Li ** 'b' with different signs, or 'm' and 'b' with different signs
308*088332b5SXin Li ** (as the result 'm' of 'fmod' has the same sign of 'a').
309*088332b5SXin Li */
310*088332b5SXin Li #if !defined(luai_nummod)
311*088332b5SXin Li #define luai_nummod(L,a,b,m)  \
312*088332b5SXin Li   { (void)L; (m) = l_mathop(fmod)(a,b); \
313*088332b5SXin Li     if (((m) > 0) ? (b) < 0 : ((m) < 0 && (b) > 0)) (m) += (b); }
314*088332b5SXin Li #endif
315*088332b5SXin Li 
316*088332b5SXin Li /* exponentiation */
317*088332b5SXin Li #if !defined(luai_numpow)
318*088332b5SXin Li #define luai_numpow(L,a,b)      ((void)L, l_mathop(pow)(a,b))
319*088332b5SXin Li #endif
320*088332b5SXin Li 
321*088332b5SXin Li /* the others are quite standard operations */
322*088332b5SXin Li #if !defined(luai_numadd)
323*088332b5SXin Li #define luai_numadd(L,a,b)      ((a)+(b))
324*088332b5SXin Li #define luai_numsub(L,a,b)      ((a)-(b))
325*088332b5SXin Li #define luai_nummul(L,a,b)      ((a)*(b))
326*088332b5SXin Li #define luai_numunm(L,a)        (-(a))
327*088332b5SXin Li #define luai_numeq(a,b)         ((a)==(b))
328*088332b5SXin Li #define luai_numlt(a,b)         ((a)<(b))
329*088332b5SXin Li #define luai_numle(a,b)         ((a)<=(b))
330*088332b5SXin Li #define luai_numgt(a,b)         ((a)>(b))
331*088332b5SXin Li #define luai_numge(a,b)         ((a)>=(b))
332*088332b5SXin Li #define luai_numisnan(a)        (!luai_numeq((a), (a)))
333*088332b5SXin Li #endif
334*088332b5SXin Li 
335*088332b5SXin Li 
336*088332b5SXin Li 
337*088332b5SXin Li 
338*088332b5SXin Li 
339*088332b5SXin Li /*
340*088332b5SXin Li ** macro to control inclusion of some hard tests on stack reallocation
341*088332b5SXin Li */
342*088332b5SXin Li #if !defined(HARDSTACKTESTS)
343*088332b5SXin Li #define condmovestack(L,pre,pos)	((void)0)
344*088332b5SXin Li #else
345*088332b5SXin Li /* realloc stack keeping its size */
346*088332b5SXin Li #define condmovestack(L,pre,pos)  \
347*088332b5SXin Li   { int sz_ = (L)->stacksize; pre; luaD_reallocstack((L), sz_, 0); pos; }
348*088332b5SXin Li #endif
349*088332b5SXin Li 
350*088332b5SXin Li #if !defined(HARDMEMTESTS)
351*088332b5SXin Li #define condchangemem(L,pre,pos)	((void)0)
352*088332b5SXin Li #else
353*088332b5SXin Li #define condchangemem(L,pre,pos)  \
354*088332b5SXin Li 	{ if (G(L)->gcrunning) { pre; luaC_fullgc(L, 0); pos; } }
355*088332b5SXin Li #endif
356*088332b5SXin Li 
357*088332b5SXin Li #endif
358