diff options
Diffstat (limited to 'src/lj_def.h')
-rw-r--r-- | src/lj_def.h | 56 |
1 files changed, 42 insertions, 14 deletions
diff --git a/src/lj_def.h b/src/lj_def.h index d09ebb10..b61297aa 100644 --- a/src/lj_def.h +++ b/src/lj_def.h | |||
@@ -46,10 +46,14 @@ typedef unsigned int uintptr_t; | |||
46 | #include <stdlib.h> | 46 | #include <stdlib.h> |
47 | 47 | ||
48 | /* Various VM limits. */ | 48 | /* Various VM limits. */ |
49 | #define LJ_MAX_MEM 0x7fffff00 /* Max. total memory allocation. */ | 49 | #define LJ_MAX_MEM32 0x7fffff00 /* Max. 32 bit memory allocation. */ |
50 | #define LJ_MAX_MEM64 ((uint64_t)1<<47) /* Max. 64 bit memory allocation. */ | ||
51 | /* Max. total memory allocation. */ | ||
52 | #define LJ_MAX_MEM (LJ_GC64 ? LJ_MAX_MEM64 : LJ_MAX_MEM32) | ||
50 | #define LJ_MAX_ALLOC LJ_MAX_MEM /* Max. individual allocation length. */ | 53 | #define LJ_MAX_ALLOC LJ_MAX_MEM /* Max. individual allocation length. */ |
51 | #define LJ_MAX_STR LJ_MAX_MEM /* Max. string length. */ | 54 | #define LJ_MAX_STR LJ_MAX_MEM32 /* Max. string length. */ |
52 | #define LJ_MAX_UDATA LJ_MAX_MEM /* Max. userdata length. */ | 55 | #define LJ_MAX_BUF LJ_MAX_MEM32 /* Max. buffer length. */ |
56 | #define LJ_MAX_UDATA LJ_MAX_MEM32 /* Max. userdata length. */ | ||
53 | 57 | ||
54 | #define LJ_MAX_STRTAB (1<<26) /* Max. string table size. */ | 58 | #define LJ_MAX_STRTAB (1<<26) /* Max. string table size. */ |
55 | #define LJ_MAX_HBITS 26 /* Max. hash bits. */ | 59 | #define LJ_MAX_HBITS 26 /* Max. hash bits. */ |
@@ -57,7 +61,7 @@ typedef unsigned int uintptr_t; | |||
57 | #define LJ_MAX_ASIZE ((1<<(LJ_MAX_ABITS-1))+1) /* Max. array part size. */ | 61 | #define LJ_MAX_ASIZE ((1<<(LJ_MAX_ABITS-1))+1) /* Max. array part size. */ |
58 | #define LJ_MAX_COLOSIZE 16 /* Max. elems for colocated array. */ | 62 | #define LJ_MAX_COLOSIZE 16 /* Max. elems for colocated array. */ |
59 | 63 | ||
60 | #define LJ_MAX_LINE LJ_MAX_MEM /* Max. source code line number. */ | 64 | #define LJ_MAX_LINE LJ_MAX_MEM32 /* Max. source code line number. */ |
61 | #define LJ_MAX_XLEVEL 200 /* Max. syntactic nesting level. */ | 65 | #define LJ_MAX_XLEVEL 200 /* Max. syntactic nesting level. */ |
62 | #define LJ_MAX_BCINS (1<<26) /* Max. # of bytecode instructions. */ | 66 | #define LJ_MAX_BCINS (1<<26) /* Max. # of bytecode instructions. */ |
63 | #define LJ_MAX_SLOTS 250 /* Max. # of slots in a Lua func. */ | 67 | #define LJ_MAX_SLOTS 250 /* Max. # of slots in a Lua func. */ |
@@ -65,7 +69,7 @@ typedef unsigned int uintptr_t; | |||
65 | #define LJ_MAX_UPVAL 60 /* Max. # of upvalues. */ | 69 | #define LJ_MAX_UPVAL 60 /* Max. # of upvalues. */ |
66 | 70 | ||
67 | #define LJ_MAX_IDXCHAIN 100 /* __index/__newindex chain limit. */ | 71 | #define LJ_MAX_IDXCHAIN 100 /* __index/__newindex chain limit. */ |
68 | #define LJ_STACK_EXTRA 5 /* Extra stack space (metamethods). */ | 72 | #define LJ_STACK_EXTRA (5+2*LJ_FR2) /* Extra stack space (metamethods). */ |
69 | 73 | ||
70 | #define LJ_NUM_CBPAGE 1 /* Number of FFI callback pages. */ | 74 | #define LJ_NUM_CBPAGE 1 /* Number of FFI callback pages. */ |
71 | 75 | ||
@@ -76,7 +80,6 @@ typedef unsigned int uintptr_t; | |||
76 | #define LJ_MIN_SBUF 32 /* Min. string buffer length. */ | 80 | #define LJ_MIN_SBUF 32 /* Min. string buffer length. */ |
77 | #define LJ_MIN_VECSZ 8 /* Min. size for growable vectors. */ | 81 | #define LJ_MIN_VECSZ 8 /* Min. size for growable vectors. */ |
78 | #define LJ_MIN_IRSZ 32 /* Min. size for growable IR. */ | 82 | #define LJ_MIN_IRSZ 32 /* Min. size for growable IR. */ |
79 | #define LJ_MIN_K64SZ 16 /* Min. size for chained K64Array. */ | ||
80 | 83 | ||
81 | /* JIT compiler limits. */ | 84 | /* JIT compiler limits. */ |
82 | #define LJ_MAX_JSLOTS 250 /* Max. # of stack slots for a trace. */ | 85 | #define LJ_MAX_JSLOTS 250 /* Max. # of stack slots for a trace. */ |
@@ -91,6 +94,9 @@ typedef unsigned int uintptr_t; | |||
91 | #define U64x(hi, lo) (((uint64_t)0x##hi << 32) + (uint64_t)0x##lo) | 94 | #define U64x(hi, lo) (((uint64_t)0x##hi << 32) + (uint64_t)0x##lo) |
92 | #define i32ptr(p) ((int32_t)(intptr_t)(void *)(p)) | 95 | #define i32ptr(p) ((int32_t)(intptr_t)(void *)(p)) |
93 | #define u32ptr(p) ((uint32_t)(intptr_t)(void *)(p)) | 96 | #define u32ptr(p) ((uint32_t)(intptr_t)(void *)(p)) |
97 | #define i64ptr(p) ((int64_t)(intptr_t)(void *)(p)) | ||
98 | #define u64ptr(p) ((uint64_t)(intptr_t)(void *)(p)) | ||
99 | #define igcptr(p) (LJ_GC64 ? i64ptr(p) : i32ptr(p)) | ||
94 | 100 | ||
95 | #define checki8(x) ((x) == (int32_t)(int8_t)(x)) | 101 | #define checki8(x) ((x) == (int32_t)(int8_t)(x)) |
96 | #define checku8(x) ((x) == (int32_t)(uint8_t)(x)) | 102 | #define checku8(x) ((x) == (int32_t)(uint8_t)(x)) |
@@ -98,7 +104,10 @@ typedef unsigned int uintptr_t; | |||
98 | #define checku16(x) ((x) == (int32_t)(uint16_t)(x)) | 104 | #define checku16(x) ((x) == (int32_t)(uint16_t)(x)) |
99 | #define checki32(x) ((x) == (int32_t)(x)) | 105 | #define checki32(x) ((x) == (int32_t)(x)) |
100 | #define checku32(x) ((x) == (uint32_t)(x)) | 106 | #define checku32(x) ((x) == (uint32_t)(x)) |
107 | #define checkptr31(x) (((uint64_t)(uintptr_t)(x) >> 31) == 0) | ||
101 | #define checkptr32(x) ((uintptr_t)(x) == (uint32_t)(uintptr_t)(x)) | 108 | #define checkptr32(x) ((uintptr_t)(x) == (uint32_t)(uintptr_t)(x)) |
109 | #define checkptr47(x) (((uint64_t)(uintptr_t)(x) >> 47) == 0) | ||
110 | #define checkptrGC(x) (LJ_GC64 ? checkptr47((x)) : LJ_64 ? checkptr31((x)) :1) | ||
102 | 111 | ||
103 | /* Every half-decent C compiler transforms this into a rotate instruction. */ | 112 | /* Every half-decent C compiler transforms this into a rotate instruction. */ |
104 | #define lj_rol(x, n) (((x)<<(n)) | ((x)>>(-(int)(n)&(8*sizeof(x)-1)))) | 113 | #define lj_rol(x, n) (((x)<<(n)) | ((x)>>(-(int)(n)&(8*sizeof(x)-1)))) |
@@ -111,7 +120,7 @@ typedef uintptr_t BloomFilter; | |||
111 | #define bloomset(b, x) ((b) |= bloombit((x))) | 120 | #define bloomset(b, x) ((b) |= bloombit((x))) |
112 | #define bloomtest(b, x) ((b) & bloombit((x))) | 121 | #define bloomtest(b, x) ((b) & bloombit((x))) |
113 | 122 | ||
114 | #if defined(__GNUC__) || defined(__psp2__) | 123 | #if defined(__GNUC__) || defined(__clang__) || defined(__psp2__) |
115 | 124 | ||
116 | #define LJ_NORET __attribute__((noreturn)) | 125 | #define LJ_NORET __attribute__((noreturn)) |
117 | #define LJ_ALIGN(n) __attribute__((aligned(n))) | 126 | #define LJ_ALIGN(n) __attribute__((aligned(n))) |
@@ -173,7 +182,7 @@ static LJ_AINLINE uint64_t lj_bswap64(uint64_t x) | |||
173 | { | 182 | { |
174 | return ((uint64_t)lj_bswap((uint32_t)x)<<32) | lj_bswap((uint32_t)(x>>32)); | 183 | return ((uint64_t)lj_bswap((uint32_t)x)<<32) | lj_bswap((uint32_t)(x>>32)); |
175 | } | 184 | } |
176 | #elif (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) | 185 | #elif (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) || __clang__ |
177 | static LJ_AINLINE uint32_t lj_bswap(uint32_t x) | 186 | static LJ_AINLINE uint32_t lj_bswap(uint32_t x) |
178 | { | 187 | { |
179 | return (uint32_t)__builtin_bswap32((int32_t)x); | 188 | return (uint32_t)__builtin_bswap32((int32_t)x); |
@@ -329,14 +338,28 @@ static LJ_AINLINE uint32_t lj_getu32(const void *v) | |||
329 | #define LJ_FUNCA_NORET LJ_FUNCA LJ_NORET | 338 | #define LJ_FUNCA_NORET LJ_FUNCA LJ_NORET |
330 | #define LJ_ASMF_NORET LJ_ASMF LJ_NORET | 339 | #define LJ_ASMF_NORET LJ_ASMF LJ_NORET |
331 | 340 | ||
332 | /* Runtime assertions. */ | 341 | /* Internal assertions. */ |
333 | #ifdef lua_assert | 342 | #if defined(LUA_USE_ASSERT) || defined(LUA_USE_APICHECK) |
334 | #define check_exp(c, e) (lua_assert(c), (e)) | 343 | #define lj_assert_check(g, c, ...) \ |
335 | #define api_check(l, e) lua_assert(e) | 344 | ((c) ? (void)0 : \ |
345 | (lj_assert_fail((g), __FILE__, __LINE__, __func__, __VA_ARGS__), 0)) | ||
346 | #define lj_checkapi(c, ...) lj_assert_check(G(L), (c), __VA_ARGS__) | ||
336 | #else | 347 | #else |
337 | #define lua_assert(c) ((void)0) | 348 | #define lj_checkapi(c, ...) ((void)L) |
349 | #endif | ||
350 | |||
351 | #ifdef LUA_USE_ASSERT | ||
352 | #define lj_assertG_(g, c, ...) lj_assert_check((g), (c), __VA_ARGS__) | ||
353 | #define lj_assertG(c, ...) lj_assert_check(g, (c), __VA_ARGS__) | ||
354 | #define lj_assertL(c, ...) lj_assert_check(G(L), (c), __VA_ARGS__) | ||
355 | #define lj_assertX(c, ...) lj_assert_check(NULL, (c), __VA_ARGS__) | ||
356 | #define check_exp(c, e) (lj_assertX((c), #c), (e)) | ||
357 | #else | ||
358 | #define lj_assertG_(g, c, ...) ((void)0) | ||
359 | #define lj_assertG(c, ...) ((void)g) | ||
360 | #define lj_assertL(c, ...) ((void)L) | ||
361 | #define lj_assertX(c, ...) ((void)0) | ||
338 | #define check_exp(c, e) (e) | 362 | #define check_exp(c, e) (e) |
339 | #define api_check luai_apicheck | ||
340 | #endif | 363 | #endif |
341 | 364 | ||
342 | /* Static assertions. */ | 365 | /* Static assertions. */ |
@@ -350,4 +373,9 @@ static LJ_AINLINE uint32_t lj_getu32(const void *v) | |||
350 | extern void LJ_ASSERT_NAME(__LINE__)(int STATIC_ASSERTION_FAILED[(cond)?1:-1]) | 373 | extern void LJ_ASSERT_NAME(__LINE__)(int STATIC_ASSERTION_FAILED[(cond)?1:-1]) |
351 | #endif | 374 | #endif |
352 | 375 | ||
376 | /* PRNG state. Need this here, details in lj_prng.h. */ | ||
377 | typedef struct PRNGState { | ||
378 | uint64_t u[4]; | ||
379 | } PRNGState; | ||
380 | |||
353 | #endif | 381 | #endif |