5 #ifndef V8_BASE_MACROS_H_
6 #define V8_BASE_MACROS_H_
22 #define OFFSET_OF(type, field) \
23 (reinterpret_cast<intptr_t>(&(reinterpret_cast<type*>(4)->field)) - 4)
62 #define ARRAYSIZE_UNSAFE(a) \
63 ((sizeof(a) / sizeof(*(a))) / \
64 static_cast<size_t>(!(sizeof(a) % sizeof(*(a)))))
72 #define arraysize ARRAYSIZE_UNSAFE
86 #define arraysize(array) (sizeof(ArraySizeHelper(array)))
92 template <
typename T,
size_t N>
100 template <
typename T,
size_t N>
121 #if V8_HAS_CXX11_STATIC_ASSERT
124 #define COMPILE_ASSERT(expr, msg) static_assert(expr, #msg)
131 #define COMPILE_ASSERT(expr, msg) \
132 typedef CompileAssert<static_cast<bool>(expr)> \
133 msg[static_cast<bool>(expr) ? 1 : -1] ALLOW_UNUSED
232 template <
class Dest,
class Source>
234 COMPILE_ASSERT(
sizeof(Dest) ==
sizeof(Source), VerifySizesAreEqual);
237 memcpy(&dest, &source,
sizeof(dest));
244 #define DISALLOW_COPY_AND_ASSIGN(TypeName) \
245 TypeName(const TypeName&) V8_DELETE; \
246 void operator=(const TypeName&) V8_DELETE
255 #define DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \
256 TypeName() V8_DELETE; \
257 DISALLOW_COPY_AND_ASSIGN(TypeName)
261 #define INLINE(declarator) V8_INLINE declarator
262 #define NO_INLINE(declarator) V8_NOINLINE declarator
266 #define MUST_USE_RESULT WARN_UNUSED_RESULT
270 #if defined(__has_feature)
271 #if __has_feature(address_sanitizer)
272 #define V8_USE_ADDRESS_SANITIZER 1
277 #ifdef V8_USE_ADDRESS_SANITIZER
278 #define DISABLE_ASAN __attribute__((no_sanitize_address))
285 #define V8_IMMEDIATE_CRASH() __builtin_trap()
287 #define V8_IMMEDIATE_CRASH() ((void(*)())0)()
293 #if V8_HAS_CXX11_STATIC_ASSERT
294 #define STATIC_ASSERT(test) static_assert(test, #test)
303 #define SEMI_STATIC_JOIN(a, b) SEMI_STATIC_JOIN_HELPER(a, b)
304 #define SEMI_STATIC_JOIN_HELPER(a, b) a##b
311 #define STATIC_ASSERT(test) \
313 StaticAssertionHelper<sizeof(StaticAssertion<static_cast<bool>((test))>)> \
314 SEMI_STATIC_JOIN(__StaticAssertTypedef__, __LINE__) ALLOW_UNUSED
321 template <
typename T>
325 #define IS_POWER_OF_TWO(x) ((x) != 0 && (((x) & ((x) - 1)) == 0))
332 # define V8_UINT64_C(x) (x ## UI64)
333 # define V8_INT64_C(x) (x ## I64)
334 # if V8_HOST_ARCH_64_BIT
335 # define V8_INTPTR_C(x) (x ## I64)
336 # define V8_PTR_PREFIX "ll"
338 # define V8_INTPTR_C(x) (x)
339 # define V8_PTR_PREFIX ""
342 # define V8_UINT64_C(x) (x ## ULL)
343 # define V8_INT64_C(x) (x ## LL)
344 # define V8_INTPTR_C(x) (x ## LL)
345 # define V8_PTR_PREFIX "I64"
346 #elif V8_HOST_ARCH_64_BIT
348 # define V8_UINT64_C(x) (x ## ULL)
349 # define V8_INT64_C(x) (x ## LL)
351 # define V8_UINT64_C(x) (x ## UL)
352 # define V8_INT64_C(x) (x ## L)
354 # define V8_INTPTR_C(x) (x ## L)
355 # define V8_PTR_PREFIX "l"
357 # define V8_UINT64_C(x) (x ## ULL)
358 # define V8_INT64_C(x) (x ## LL)
359 # define V8_INTPTR_C(x) (x)
360 # define V8_PTR_PREFIX ""
363 #define V8PRIxPTR V8_PTR_PREFIX "x"
364 #define V8PRIdPTR V8_PTR_PREFIX "d"
365 #define V8PRIuPTR V8_PTR_PREFIX "u"
370 #define V8PRIxPTR "lx"
376 #define V8_2PART_UINT64_C(a, b) (((static_cast<uint64_t>(a) << 32) + 0x##b##u))
382 template <
typename T>
384 return x -
static_cast<T>(0);
391 template <
typename T>
393 return static_cast<T>(
static_cast<T>(0) + x);
398 template <
typename T>
406 template <
typename T>
408 return RoundDown<T>(
static_cast<T>(x + m - 1), m);
enable harmony numeric enable harmony object literal extensions true
#define DCHECK(condition)
Dest bit_cast(Source const &source)
char(& ArraySizeHelper(T(&array)[N]))[N]
#define IS_POWER_OF_TWO(x)
#define COMPILE_ASSERT(expr, msg)
T AddressFrom(intptr_t x)
T RoundDown(T x, intptr_t m)
T RoundUp(T x, intptr_t m)
#define T(name, string, precedence)