18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2003, 2006, 2007 Apple Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef WTF_Assertions_h 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define WTF_Assertions_h 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project no namespaces because this file has to be includable from C and Objective-C 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Note, this file uses many GCC extensions, but it should be compatible with 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project C, Objective C, C++, and Objective C++. 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project For non-debug builds, everything is disabled by default. 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Defining any of the symbols explicitly prevents this from having any effect. 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project MSVC7 note: variadic macro support was added in MSVC8, so for now we disable 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project those macros in MSVC7. For more info, see the MSDN document on variadic 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project macros here: 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project http://msdn2.microsoft.com/en-us/library/ms177415(VS.80).aspx 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/ 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Platform.h" 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <stddef.h> 48e14391e94c850b8bd03680c23b38978db68687a8John Reck 49e14391e94c850b8bd03680c23b38978db68687a8John Reck#if !COMPILER(MSVC) 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <inttypes.h> 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 53d0825bca7fe65beaee391d30da42e937db621564Steve Block#if OS(SYMBIAN) 54231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <e32def.h> 55231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <e32debug.h> 56231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif 57231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 58ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#if PLATFORM(BREWMP) 594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include <AEEError.h> 604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include <AEEdbg.h> 61ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#endif 62ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef NDEBUG 64dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/* Disable ASSERT* macros in release mode. */ 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define ASSERTIONS_DISABLED_DEFAULT 1 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define ASSERTIONS_DISABLED_DEFAULT 0 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 7021939df44de1705786c545cd1bf519d47250322dBen Murdoch#if COMPILER(MSVC7_OR_LOWER) || COMPILER(WINSCW) 71d0825bca7fe65beaee391d30da42e937db621564Steve Block#define HAVE_VARIADIC_MACRO 0 72d0825bca7fe65beaee391d30da42e937db621564Steve Block#else 73d0825bca7fe65beaee391d30da42e937db621564Steve Block#define HAVE_VARIADIC_MACRO 1 74d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 75d0825bca7fe65beaee391d30da42e937db621564Steve Block 762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#ifndef BACKTRACE_DISABLED 772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#define BACKTRACE_DISABLED ASSERTIONS_DISABLED_DEFAULT 782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif 792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef ASSERT_DISABLED 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define ASSERT_DISABLED ASSERTIONS_DISABLED_DEFAULT 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 84d0825bca7fe65beaee391d30da42e937db621564Steve Block#ifndef ASSERT_MSG_DISABLED 85d0825bca7fe65beaee391d30da42e937db621564Steve Block#if HAVE(VARIADIC_MACRO) 86d0825bca7fe65beaee391d30da42e937db621564Steve Block#define ASSERT_MSG_DISABLED ASSERTIONS_DISABLED_DEFAULT 87d0825bca7fe65beaee391d30da42e937db621564Steve Block#else 88d0825bca7fe65beaee391d30da42e937db621564Steve Block#define ASSERT_MSG_DISABLED 1 89d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 90d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 91d0825bca7fe65beaee391d30da42e937db621564Steve Block 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef ASSERT_ARG_DISABLED 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define ASSERT_ARG_DISABLED ASSERTIONS_DISABLED_DEFAULT 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef FATAL_DISABLED 97d0825bca7fe65beaee391d30da42e937db621564Steve Block#if HAVE(VARIADIC_MACRO) 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define FATAL_DISABLED ASSERTIONS_DISABLED_DEFAULT 99d0825bca7fe65beaee391d30da42e937db621564Steve Block#else 100d0825bca7fe65beaee391d30da42e937db621564Steve Block#define FATAL_DISABLED 1 101d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef ERROR_DISABLED 105d0825bca7fe65beaee391d30da42e937db621564Steve Block#if HAVE(VARIADIC_MACRO) 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define ERROR_DISABLED ASSERTIONS_DISABLED_DEFAULT 107d0825bca7fe65beaee391d30da42e937db621564Steve Block#else 108d0825bca7fe65beaee391d30da42e937db621564Steve Block#define ERROR_DISABLED 1 109d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef LOG_DISABLED 113d0825bca7fe65beaee391d30da42e937db621564Steve Block#if HAVE(VARIADIC_MACRO) 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define LOG_DISABLED ASSERTIONS_DISABLED_DEFAULT 115d0825bca7fe65beaee391d30da42e937db621564Steve Block#else 116d0825bca7fe65beaee391d30da42e937db621564Steve Block#define LOG_DISABLED 1 117d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if COMPILER(GCC) 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define WTF_PRETTY_FUNCTION __PRETTY_FUNCTION__ 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define WTF_PRETTY_FUNCTION __FUNCTION__ 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* WTF logging functions can process %@ in the format string to log a NSObject* but the printf format attribute 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project emits a warning when %@ is used in the format string. Until <rdar://problem/5195437> is resolved we can't include 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project the attribute when being used from Objective-C code in case it decides to use %@. */ 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if COMPILER(GCC) && !defined(__OBJC__) 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define WTF_ATTRIBUTE_PRINTF(formatStringArgument, extraArguments) __attribute__((__format__(printf, formatStringArgument, extraArguments))) 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define WTF_ATTRIBUTE_PRINTF(formatStringArgument, extraArguments) 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* These helper functions are always declared, but not necessarily always defined if the corresponding function is disabled. */ 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef __cplusplus 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectextern "C" { 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projecttypedef enum { WTFLogChannelOff, WTFLogChannelOn } WTFLogChannelState; 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projecttypedef struct { 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned mask; 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const char *defaultName; 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WTFLogChannelState state; 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} WTFLogChannel; 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1492bde8e466a4451c7319e3a072d118917957d6554Steve BlockWTF_EXPORT_PRIVATE void WTFReportAssertionFailure(const char* file, int line, const char* function, const char* assertion); 1502bde8e466a4451c7319e3a072d118917957d6554Steve BlockWTF_EXPORT_PRIVATE void WTFReportAssertionFailureWithMessage(const char* file, int line, const char* function, const char* assertion, const char* format, ...) WTF_ATTRIBUTE_PRINTF(5, 6); 1512bde8e466a4451c7319e3a072d118917957d6554Steve BlockWTF_EXPORT_PRIVATE void WTFReportArgumentAssertionFailure(const char* file, int line, const char* function, const char* argName, const char* assertion); 1522bde8e466a4451c7319e3a072d118917957d6554Steve BlockWTF_EXPORT_PRIVATE void WTFReportBacktrace(); 1532bde8e466a4451c7319e3a072d118917957d6554Steve BlockWTF_EXPORT_PRIVATE void WTFReportFatalError(const char* file, int line, const char* function, const char* format, ...) WTF_ATTRIBUTE_PRINTF(4, 5); 1542bde8e466a4451c7319e3a072d118917957d6554Steve BlockWTF_EXPORT_PRIVATE void WTFReportError(const char* file, int line, const char* function, const char* format, ...) WTF_ATTRIBUTE_PRINTF(4, 5); 1552bde8e466a4451c7319e3a072d118917957d6554Steve BlockWTF_EXPORT_PRIVATE void WTFLog(WTFLogChannel*, const char* format, ...) WTF_ATTRIBUTE_PRINTF(2, 3); 1562bde8e466a4451c7319e3a072d118917957d6554Steve BlockWTF_EXPORT_PRIVATE void WTFLogVerbose(const char* file, int line, const char* function, WTFLogChannel*, const char* format, ...) WTF_ATTRIBUTE_PRINTF(5, 6); 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifdef __cplusplus 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 162dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/* CRASH() - Raises a fatal error resulting in program termination and triggering either the debugger or the crash reporter. 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 164dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Use CRASH() in response to known, unrecoverable errors like out-of-memory. 165dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Macro is enabled in both debug and release mode. 166dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block To test for unknown errors and verify assumptions, use ASSERT instead, to avoid impacting performance in release builds. 167dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 168dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Signals are ignored by the crash reporter on OS X so we must do better. 169dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block*/ 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef CRASH 171d0825bca7fe65beaee391d30da42e937db621564Steve Block#if OS(SYMBIAN) 172231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#define CRASH() do { \ 173231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block __DEBUGGER(); \ 174231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block User::Panic(_L("Webkit CRASH"),0); \ 175231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block } while(false) 176ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#elif PLATFORM(BREWMP) 177ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block#define CRASH() do { \ 1784576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang dbg_Message("WebKit CRASH", DBG_MSG_LEVEL_FATAL, __FILE__, __LINE__); \ 179ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block *(int *)(uintptr_t)0xbbadbeef = 0; \ 180ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block ((void(*)())0)(); /* More reliable, but doesn't say BBADBEEF */ \ 181ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block} while(false) 182231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#else 183635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#define CRASH() do { \ 1842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block WTFReportBacktrace(); \ 185635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *(int *)(uintptr_t)0xbbadbeef = 0; \ 186635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ((void(*)())0)(); /* More reliable, but doesn't say BBADBEEF */ \ 187635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} while(false) 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 189231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block/* BACKTRACE 1922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 1932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block Print a backtrace to the same location as ASSERT messages. 1942fc2651226baac27029e38c9d6ef883fa32084dbSteve Block*/ 1952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 1962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if BACKTRACE_DISABLED 1972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 1982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#define BACKTRACE() ((void)0) 1992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#else 2012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#define BACKTRACE() do { \ 2032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block WTFReportBacktrace(); \ 2042fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} while(false) 2052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 2062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif 2072fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 208dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/* ASSERT, ASSERT_NOT_REACHED, ASSERT_UNUSED 209dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 210dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block These macros are compiled out of release builds. 211dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Expressions inside them are evaluated in debug builds only. 212dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block*/ 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 214d0825bca7fe65beaee391d30da42e937db621564Steve Block#if OS(WINCE) && !PLATFORM(TORCHMOBILE) 215635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project/* FIXME: We include this here only to avoid a conflict with the ASSERT macro. */ 216635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <windows.h> 217635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#undef min 218635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#undef max 219635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#undef ERROR 220635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 221635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 222d0825bca7fe65beaee391d30da42e937db621564Steve Block#if OS(WINDOWS) || OS(SYMBIAN) 2230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/* FIXME: Change to use something other than ASSERT to avoid this conflict with the underlying platform */ 2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#undef ASSERT 2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2275e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#if PLATFORM(BREWMP) 2285e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block/* FIXME: We include this here only to avoid a conflict with the COMPILE_ASSERT macro. */ 2295e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include <AEEClassIDs.h> 2305e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 2315e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block/* FIXME: Change to use something other than COMPILE_ASSERT to avoid this conflict with the underlying platform */ 2325e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#undef COMPILE_ASSERT 2335e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#endif 2345e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ASSERT_DISABLED 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define ASSERT(assertion) ((void)0) 2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define ASSERT_NOT_REACHED() ((void)0) 2395ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 2405ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#if COMPILER(INTEL) && !OS(WINDOWS) || COMPILER(RVCT) 2415ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsentemplate<typename T> 2425ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monseninline void assertUnused(T& x) { (void)x; } 2435ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#define ASSERT_UNUSED(variable, assertion) (assertUnused(variable)) 2445ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#else 245635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#define ASSERT_UNUSED(variable, assertion) ((void)variable) 2465ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#endif 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else 2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define ASSERT(assertion) do \ 2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!(assertion)) { \ 2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WTFReportAssertionFailure(__FILE__, __LINE__, WTF_PRETTY_FUNCTION, #assertion); \ 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CRASH(); \ 2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } \ 2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectwhile (0) 256d0825bca7fe65beaee391d30da42e937db621564Steve Block 2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define ASSERT_NOT_REACHED() do { \ 2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WTFReportAssertionFailure(__FILE__, __LINE__, WTF_PRETTY_FUNCTION, 0); \ 2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CRASH(); \ 2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} while (0) 2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 262635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#define ASSERT_UNUSED(variable, assertion) ASSERT(assertion) 263635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 266d0825bca7fe65beaee391d30da42e937db621564Steve Block/* ASSERT_WITH_MESSAGE */ 267d0825bca7fe65beaee391d30da42e937db621564Steve Block 26821939df44de1705786c545cd1bf519d47250322dBen Murdoch#if COMPILER(MSVC7_OR_LOWER) 269d0825bca7fe65beaee391d30da42e937db621564Steve Block#define ASSERT_WITH_MESSAGE(assertion) ((void)0) 270d0825bca7fe65beaee391d30da42e937db621564Steve Block#elif COMPILER(WINSCW) 271d0825bca7fe65beaee391d30da42e937db621564Steve Block#define ASSERT_WITH_MESSAGE(assertion, arg...) ((void)0) 272d0825bca7fe65beaee391d30da42e937db621564Steve Block#elif ASSERT_MSG_DISABLED 273d0825bca7fe65beaee391d30da42e937db621564Steve Block#define ASSERT_WITH_MESSAGE(assertion, ...) ((void)0) 274d0825bca7fe65beaee391d30da42e937db621564Steve Block#else 275d0825bca7fe65beaee391d30da42e937db621564Steve Block#define ASSERT_WITH_MESSAGE(assertion, ...) do \ 276d0825bca7fe65beaee391d30da42e937db621564Steve Block if (!(assertion)) { \ 277d0825bca7fe65beaee391d30da42e937db621564Steve Block WTFReportAssertionFailureWithMessage(__FILE__, __LINE__, WTF_PRETTY_FUNCTION, #assertion, __VA_ARGS__); \ 278d0825bca7fe65beaee391d30da42e937db621564Steve Block CRASH(); \ 279d0825bca7fe65beaee391d30da42e937db621564Steve Block } \ 280d0825bca7fe65beaee391d30da42e937db621564Steve Blockwhile (0) 281d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 282d0825bca7fe65beaee391d30da42e937db621564Steve Block 283d0825bca7fe65beaee391d30da42e937db621564Steve Block 2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* ASSERT_ARG */ 2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ASSERT_ARG_DISABLED 2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define ASSERT_ARG(argName, assertion) ((void)0) 2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else 2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define ASSERT_ARG(argName, assertion) do \ 2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!(assertion)) { \ 2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WTFReportArgumentAssertionFailure(__FILE__, __LINE__, WTF_PRETTY_FUNCTION, #argName, #assertion); \ 2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CRASH(); \ 2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } \ 2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectwhile (0) 2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* COMPILE_ASSERT */ 3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef COMPILE_ASSERT 3038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#define COMPILE_ASSERT(exp, name) typedef int dummy##name [(exp) ? 1 : -1] 3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* FATAL */ 3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 30821939df44de1705786c545cd1bf519d47250322dBen Murdoch#if COMPILER(MSVC7_OR_LOWER) 3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define FATAL() ((void)0) 310d0825bca7fe65beaee391d30da42e937db621564Steve Block#elif COMPILER(WINSCW) 311d0825bca7fe65beaee391d30da42e937db621564Steve Block#define FATAL(arg...) ((void)0) 312d0825bca7fe65beaee391d30da42e937db621564Steve Block#elif FATAL_DISABLED 313d0825bca7fe65beaee391d30da42e937db621564Steve Block#define FATAL(...) ((void)0) 3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else 3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define FATAL(...) do { \ 3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WTFReportFatalError(__FILE__, __LINE__, WTF_PRETTY_FUNCTION, __VA_ARGS__); \ 3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CRASH(); \ 3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} while (0) 3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* LOG_ERROR */ 3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 32321939df44de1705786c545cd1bf519d47250322dBen Murdoch#if COMPILER(MSVC7_OR_LOWER) 3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define LOG_ERROR() ((void)0) 325d0825bca7fe65beaee391d30da42e937db621564Steve Block#elif COMPILER(WINSCW) 326d0825bca7fe65beaee391d30da42e937db621564Steve Block#define LOG_ERROR(arg...) ((void)0) 327d0825bca7fe65beaee391d30da42e937db621564Steve Block#elif ERROR_DISABLED 328d0825bca7fe65beaee391d30da42e937db621564Steve Block#define LOG_ERROR(...) ((void)0) 3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else 3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define LOG_ERROR(...) WTFReportError(__FILE__, __LINE__, WTF_PRETTY_FUNCTION, __VA_ARGS__) 3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* LOG */ 3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 33521939df44de1705786c545cd1bf519d47250322dBen Murdoch#if COMPILER(MSVC7_OR_LOWER) 3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define LOG() ((void)0) 337d0825bca7fe65beaee391d30da42e937db621564Steve Block#elif COMPILER(WINSCW) 338d0825bca7fe65beaee391d30da42e937db621564Steve Block#define LOG(arg...) ((void)0) 339d0825bca7fe65beaee391d30da42e937db621564Steve Block#elif LOG_DISABLED 340d0825bca7fe65beaee391d30da42e937db621564Steve Block#define LOG(channel, ...) ((void)0) 3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else 3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define LOG(channel, ...) WTFLog(&JOIN_LOG_CHANNEL_WITH_PREFIX(LOG_CHANNEL_PREFIX, channel), __VA_ARGS__) 3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define JOIN_LOG_CHANNEL_WITH_PREFIX(prefix, channel) JOIN_LOG_CHANNEL_WITH_PREFIX_LEVEL_2(prefix, channel) 3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define JOIN_LOG_CHANNEL_WITH_PREFIX_LEVEL_2(prefix, channel) prefix ## channel 3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* LOG_VERBOSE */ 3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 34921939df44de1705786c545cd1bf519d47250322dBen Murdoch#if COMPILER(MSVC7_OR_LOWER) 3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define LOG_VERBOSE(channel) ((void)0) 351d0825bca7fe65beaee391d30da42e937db621564Steve Block#elif COMPILER(WINSCW) 352d0825bca7fe65beaee391d30da42e937db621564Steve Block#define LOG_VERBOSE(channel, arg...) ((void)0) 353d0825bca7fe65beaee391d30da42e937db621564Steve Block#elif LOG_DISABLED 354d0825bca7fe65beaee391d30da42e937db621564Steve Block#define LOG_VERBOSE(channel, ...) ((void)0) 3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else 3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define LOG_VERBOSE(channel, ...) WTFLogVerbose(__FILE__, __LINE__, WTF_PRETTY_FUNCTION, &JOIN_LOG_CHANNEL_WITH_PREFIX(LOG_CHANNEL_PREFIX, channel), __VA_ARGS__) 3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif /* WTF_Assertions_h */ 360