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