18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2003, 2006, 2007 Apple Inc. All rights reserved. 30bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Copyright (C) 2007-2009 Torch Mobile, Inc. 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 272bde8e466a4451c7319e3a072d118917957d6554Steve Block// The vprintf_stderr_common function triggers this error in the Mac build. 282bde8e466a4451c7319e3a072d118917957d6554Steve Block// Feel free to remove this pragma if this file builds on Mac. 292bde8e466a4451c7319e3a072d118917957d6554Steve Block// According to http://gcc.gnu.org/onlinedocs/gcc-4.2.1/gcc/Diagnostic-Pragmas.html#Diagnostic-Pragmas 302bde8e466a4451c7319e3a072d118917957d6554Steve Block// we need to place this directive before any data or functions are defined. 312bde8e466a4451c7319e3a072d118917957d6554Steve Block#pragma GCC diagnostic ignored "-Wmissing-format-attribute" 322bde8e466a4451c7319e3a072d118917957d6554Steve Block 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Assertions.h" 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <stdio.h> 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <stdarg.h> 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <string.h> 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if PLATFORM(MAC) 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <CoreFoundation/CFString.h> 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 445ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#if COMPILER(MSVC) && !OS(WINCE) && !PLATFORM(BREWMP) 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef WINVER 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define WINVER 0x0500 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef _WIN32_WINNT 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define _WIN32_WINNT 0x0500 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <crtdbg.h> 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 54bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#if OS(WINDOWS) 55bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#include <windows.h> 560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 585ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#if PLATFORM(BREWMP) 594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang#include <AEEdbg.h> 605ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include <wtf/Vector.h> 615ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#endif 625ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 632fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if PLATFORM(MAC) 642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include <cxxabi.h> 652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include <dlfcn.h> 662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include <execinfo.h> 672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif 682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectextern "C" { 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 715ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#if PLATFORM(BREWMP) 725ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 735ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenstatic void printLog(const Vector<char>& buffer) 745ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{ 755ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // Each call to DBGPRINTF generates at most 128 bytes of output on the Windows SDK. 765ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // On Qualcomm chipset targets, DBGPRINTF() comes out the diag port (though this may change). 775ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // The length of each output string is constrained even more than on the Windows SDK. 785ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#if COMPILER(MSVC) 795ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen const int printBufferSize = 128; 805ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#else 815ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen const int printBufferSize = 32; 825ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#endif 835ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 845ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen char printBuffer[printBufferSize + 1]; 855ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen printBuffer[printBufferSize] = 0; // to guarantee null termination 865ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 875ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen const char* p = buffer.data(); 885ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen const char* end = buffer.data() + buffer.size(); 895ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen while (p < end) { 905ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen strncpy(printBuffer, p, printBufferSize); 914576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang dbg_Message(printBuffer, DBG_MSG_LEVEL_HIGH, __FILE__, __LINE__); 925ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen p += printBufferSize; 935ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen } 945ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen} 955ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 965ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#endif 975ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWTF_ATTRIBUTE_PRINTF(1, 0) 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void vprintf_stderr_common(const char* format, va_list args) 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if PLATFORM(MAC) 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (strstr(format, "%@")) { 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFStringRef cfFormat = CFStringCreateWithCString(NULL, format, kCFStringEncodingUTF8); 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFStringRef str = CFStringCreateWithFormatAndArguments(NULL, NULL, cfFormat, args); 1050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int length = CFStringGetMaximumSizeForEncoding(CFStringGetLength(str), kCFStringEncodingUTF8); 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project char* buffer = (char*)malloc(length + 1); 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFStringGetCString(str, buffer, length, kCFStringEncodingUTF8); 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fputs(buffer, stderr); 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project free(buffer); 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFRelease(str); 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CFRelease(cfFormat); 1162fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return; 1172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 1185ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#elif PLATFORM(BREWMP) 1195ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // When str is 0, the return value is the number of bytes needed 1205ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen // to accept the result including null termination. 1215ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen int size = vsnprintf(0, 0, format, args); 1225ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen if (size > 0) { 1235ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen Vector<char> buffer(size); 1245ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen vsnprintf(buffer.data(), size, format, args); 1255ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen printLog(buffer); 1265ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen } 1275ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 128bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen#elif HAVE(ISDEBUGGERPRESENT) 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (IsDebuggerPresent()) { 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project size_t size = 1024; 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project do { 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project char* buffer = (char*)malloc(size); 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (buffer == NULL) 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (_vsnprintf(buffer, size, format, args) != -1) { 139d0825bca7fe65beaee391d30da42e937db621564Steve Block#if OS(WINCE) 1400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // WinCE only supports wide chars 1410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch wchar_t* wideBuffer = (wchar_t*)malloc(size * sizeof(wchar_t)); 1420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (wideBuffer == NULL) 1430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 1440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch for (unsigned int i = 0; i < size; ++i) { 1450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (!(wideBuffer[i] = buffer[i])) 1460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch break; 1470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 1480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch OutputDebugStringW(wideBuffer); 1490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch free(wideBuffer); 1500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project OutputDebugStringA(buffer); 1520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project free(buffer); 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project break; 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project free(buffer); 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project size *= 2; 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } while (size > 1024); 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 162d0825bca7fe65beaee391d30da42e937db621564Steve Block#if OS(SYMBIAN) 163231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block vfprintf(stdout, format, args); 164231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#else 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project vfprintf(stderr, format, args); 166231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectWTF_ATTRIBUTE_PRINTF(1, 2) 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void printf_stderr_common(const char* format, ...) 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project va_list args; 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project va_start(args, format); 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project vprintf_stderr_common(format, args); 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project va_end(args); 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void printCallSite(const char* file, int line, const char* function) 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#if OS(WINDOWS) && !OS(WINCE) && defined(_DEBUG) 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project _CrtDbgReport(_CRT_WARN, file, line, NULL, "%s\n", function); 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else 1832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // By using this format, which matches the format used by MSVC for compiler errors, developers 1842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // using Visual Studio can double-click the file/line number in the Output Window to have the 1852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // editor navigate to that line of code. It seems fine for other developers, too. 1862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block printf_stderr_common("%s(%d) : %s\n", file, line, function); 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WTFReportAssertionFailure(const char* file, int line, const char* function, const char* assertion) 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (assertion) 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project printf_stderr_common("ASSERTION FAILED: %s\n", assertion); 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project printf_stderr_common("SHOULD NEVER BE REACHED\n"); 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project printCallSite(file, line, function); 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WTFReportAssertionFailureWithMessage(const char* file, int line, const char* function, const char* assertion, const char* format, ...) 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project printf_stderr_common("ASSERTION FAILED: "); 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project va_list args; 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project va_start(args, format); 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project vprintf_stderr_common(format, args); 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project va_end(args); 2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project printf_stderr_common("\n%s\n", assertion); 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project printCallSite(file, line, function); 2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WTFReportArgumentAssertionFailure(const char* file, int line, const char* function, const char* argName, const char* assertion) 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project printf_stderr_common("ARGUMENT BAD: %s, %s\n", argName, assertion); 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project printCallSite(file, line, function); 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2162fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid WTFReportBacktrace() 2172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{ 2182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if PLATFORM(MAC) 2192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block static const int maxFrames = 32; 2202fc2651226baac27029e38c9d6ef883fa32084dbSteve Block void* samples[maxFrames]; 2212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block int frames = backtrace(samples, maxFrames); 2222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 2232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block for (int i = 1; i < frames; ++i) { 2242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block void* pointer = samples[i]; 2252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 2262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // Try to get a symbol name from the dynamic linker. 2272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block Dl_info info; 2282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (dladdr(pointer, &info) && info.dli_sname) { 2292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block const char* mangledName = info.dli_sname; 2302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 2312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // Assume c++ & try to demangle the name. 2322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block char* demangledName = abi::__cxa_demangle(mangledName, 0, 0, 0); 2332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (demangledName) { 23481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch fprintf(stderr, "%-3d %s\n", i, demangledName); 2352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block free(demangledName); 2362fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } else 23781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch fprintf(stderr, "%-3d %s\n", i, mangledName); 2382fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } else 23981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch fprintf(stderr, "%-3d %p\n", i, pointer); 2402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block } 2412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#endif 2422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block} 2432fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WTFReportFatalError(const char* file, int line, const char* function, const char* format, ...) 2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project printf_stderr_common("FATAL ERROR: "); 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project va_list args; 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project va_start(args, format); 2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project vprintf_stderr_common(format, args); 2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project va_end(args); 2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project printf_stderr_common("\n"); 2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project printCallSite(file, line, function); 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WTFReportError(const char* file, int line, const char* function, const char* format, ...) 2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project printf_stderr_common("ERROR: "); 2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project va_list args; 2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project va_start(args, format); 2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project vprintf_stderr_common(format, args); 2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project va_end(args); 2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project printf_stderr_common("\n"); 2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project printCallSite(file, line, function); 2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WTFLog(WTFLogChannel* channel, const char* format, ...) 2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (channel->state != WTFLogChannelOn) 2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project va_list args; 2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project va_start(args, format); 2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project vprintf_stderr_common(format, args); 2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project va_end(args); 2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (format[strlen(format) - 1] != '\n') 2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project printf_stderr_common("\n"); 2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid WTFLogVerbose(const char* file, int line, const char* function, WTFLogChannel* channel, const char* format, ...) 2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (channel->state != WTFLogChannelOn) 2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project va_list args; 2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project va_start(args, format); 2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project vprintf_stderr_common(format, args); 2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project va_end(args); 2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (format[strlen(format) - 1] != '\n') 2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project printf_stderr_common("\n"); 2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project printCallSite(file, line, function); 2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // extern "C" 294