// 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 "platform/globals.h"
#include "vm/os.h"
#include "vm/profiler.h"

namespace dart {

bool DynamicAssertionHelper::failed_ = false;

void DynamicAssertionHelper::Fail(const char* format, ...) {
  // 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.
  va_list arguments;
  va_start(arguments, format);
  vsnprintf(buffer + file_and_line_length,
            sizeof(buffer) - file_and_line_length, format, arguments);
  va_end(arguments);

  // Print the buffer on stderr and/or syslog.
  OS::PrintErr("%s\n", buffer);

  // In case of failed assertions, abort right away. Otherwise, wait
  // until the program is exiting before producing a non-zero exit
  // code through abort.
  if (kind_ == ASSERT) {
    NOT_IN_PRODUCT(Profiler::DumpStackTrace());
    OS::Abort();
  }
  failed_ = true;
}

}  // namespace dart
