| // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| #include "platform/assert.h" |
| |
| #include "include/dart_api.h" |
| #include "platform/globals.h" |
| #include "platform/syslog.h" |
| |
| #if defined(DART_HOST_OS_ANDROID) |
| extern "C" __attribute__((weak)) void android_set_abort_message(const char*); |
| #endif // defined(DART_HOST_OS_ANDROID) |
| |
| namespace dart { |
| |
| bool Expect::failed_ = false; |
| |
| void DynamicAssertionHelper::Print(const char* format, |
| va_list arguments, |
| bool will_abort /* = false */) const { |
| // Take only the last 1KB of the file name if it is longer. |
| const intptr_t file_len = strlen(file_); |
| const intptr_t file_offset = (file_len > (1 * KB)) ? file_len - (1 * KB) : 0; |
| const char* file = file_ + file_offset; |
| |
| // Print the file and line number into the buffer. |
| char buffer[4 * KB]; |
| MSAN_UNPOISON(buffer, sizeof(buffer)); |
| intptr_t file_and_line_length = |
| snprintf(buffer, sizeof(buffer), "%s: %d: error: ", file, line_); |
| |
| // Print the error message into the buffer. |
| vsnprintf(buffer + file_and_line_length, |
| sizeof(buffer) - file_and_line_length, format, arguments); |
| |
| // Print the buffer on stderr and/or syslog. |
| Syslog::PrintErr("%s\n", buffer); |
| #if defined(DART_HOST_OS_ANDROID) |
| if (will_abort && (&android_set_abort_message != nullptr)) { |
| android_set_abort_message(buffer); |
| } |
| #endif // defined(DART_HOST_OS_ANDROID) |
| } |
| |
| void Assert::Fail(const char* format, ...) const { |
| va_list arguments; |
| va_start(arguments, format); |
| Print(format, arguments, /*will_abort=*/true); |
| va_end(arguments); |
| |
| // Abort right away. |
| Dart_DumpNativeStackTrace(NULL); |
| Dart_PrepareToAbort(); |
| abort(); |
| } |
| |
| void Expect::Fail(const char* format, ...) const { |
| va_list arguments; |
| va_start(arguments, format); |
| Print(format, arguments); |
| va_end(arguments); |
| |
| // Wait until the program is exiting before producing a non-zero exit |
| // code through abort. |
| failed_ = true; |
| } |
| |
| } // namespace dart |