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