//===--- 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 #include #include #include #include using namespace swift; 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(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; } 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 ) { 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 ) { 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); }