diff options
Diffstat (limited to 'llimits.h')
-rw-r--r-- | llimits.h | 309 |
1 files changed, 309 insertions, 0 deletions
diff --git a/llimits.h b/llimits.h new file mode 100644 index 00000000..1b8c79bd --- /dev/null +++ b/llimits.h | |||
@@ -0,0 +1,309 @@ | |||
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 | ||