| //===--- Assert.cpp - Assertion failure reporting -------------------------===// |
| // |
| // This source file is part of the Swift.org open source project |
| // |
| // Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors |
| // Licensed under Apache License v2.0 with Runtime Library Exception |
| // |
| // See https://swift.org/LICENSE.txt for license information |
| // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "swift/Runtime/Config.h" |
| #include "swift/Runtime/Debug.h" |
| #include "../SwiftShims/AssertionReporting.h" |
| #include <cstdarg> |
| #include <cstdint> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <inttypes.h> |
| |
| using namespace swift; |
| |
| bool swift::_swift_reportFatalErrorsToDebugger = false; |
| |
| static int swift_asprintf(char **strp, const char *fmt, ...) { |
| va_list args; |
| va_start(args, fmt); |
| #if defined(_WIN32) |
| int len = _vscprintf(fmt, args); |
| if (len < 0) { |
| va_end(args); |
| return -1; |
| } |
| char *buffer = static_cast<char *>(malloc(len + 1)); |
| if (!buffer) { |
| va_end(args); |
| return -1; |
| } |
| int result = vsprintf(buffer, fmt, args); |
| if (result < 0) { |
| va_end(args); |
| free(buffer); |
| return -1; |
| } |
| *strp = buffer; |
| #else |
| int result = vasprintf(strp, fmt, args); |
| #endif |
| va_end(args); |
| return result; |
| } |
| |
| static void logPrefixAndMessageToDebugger( |
| const unsigned char *prefix, int prefixLength, |
| const unsigned char *message, int messageLength |
| ) { |
| if (!_swift_reportFatalErrorsToDebugger) |
| return; |
| |
| char *debuggerMessage; |
| if (messageLength) { |
| swift_asprintf(&debuggerMessage, "%.*s: %.*s", prefixLength, prefix, |
| messageLength, message); |
| } else { |
| swift_asprintf(&debuggerMessage, "%.*s", prefixLength, prefix); |
| } |
| reportToDebugger(RuntimeErrorFlagFatal, debuggerMessage); |
| free(debuggerMessage); |
| } |
| |
| void swift::_swift_stdlib_reportFatalErrorInFile( |
| const unsigned char *prefix, int prefixLength, |
| const unsigned char *message, int messageLength, |
| const unsigned char *file, int fileLength, |
| uint32_t line, |
| uint32_t flags |
| ) { |
| logPrefixAndMessageToDebugger(prefix, prefixLength, message, messageLength); |
| |
| char *log; |
| swift_asprintf( |
| &log, "%.*s: %.*s%sfile %.*s, line %" PRIu32 "\n", |
| prefixLength, prefix, |
| messageLength, message, |
| (messageLength ? ": " : ""), |
| fileLength, file, |
| line); |
| |
| swift_reportError(flags, log); |
| free(log); |
| } |
| |
| void swift::_swift_stdlib_reportFatalError( |
| const unsigned char *prefix, int prefixLength, |
| const unsigned char *message, int messageLength, |
| uint32_t flags |
| ) { |
| logPrefixAndMessageToDebugger(prefix, prefixLength, message, messageLength); |
| |
| char *log; |
| swift_asprintf( |
| &log, "%.*s: %.*s\n", |
| prefixLength, prefix, |
| messageLength, message); |
| |
| swift_reportError(flags, log); |
| free(log); |
| } |
| |
| void swift::_swift_stdlib_reportUnimplementedInitializerInFile( |
| const unsigned char *className, int classNameLength, |
| const unsigned char *initName, int initNameLength, |
| const unsigned char *file, int fileLength, |
| uint32_t line, uint32_t column, |
| uint32_t flags |
| ) { |
| char *log; |
| swift_asprintf( |
| &log, |
| "%.*s: %" PRIu32 ": %" PRIu32 ": fatal error: use of unimplemented " |
| "initializer '%.*s' for class '%.*s'\n", |
| fileLength, file, |
| line, column, |
| initNameLength, initName, |
| classNameLength, className); |
| |
| swift_reportError(flags, log); |
| free(log); |
| } |
| |
| void swift::_swift_stdlib_reportUnimplementedInitializer( |
| const unsigned char *className, int classNameLength, |
| const unsigned char *initName, int initNameLength, |
| uint32_t flags |
| ) { |
| char *log; |
| swift_asprintf( |
| &log, |
| "fatal error: use of unimplemented " |
| "initializer '%.*s' for class '%.*s'\n", |
| initNameLength, initName, |
| classNameLength, className); |
| |
| swift_reportError(flags, log); |
| free(log); |
| } |
| |