blob: c10484ca6de4416383e69d3cccc8a46e54067867 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "tonic/logging/dart_error.h"
#include <atomic>
#include "tonic/common/macros.h"
#include "tonic/converter/dart_converter.h"
namespace tonic {
namespace DartError {
const char kInvalidArgument[] = "Invalid argument.";
} // namespace DartError
namespace {
void DefaultLogUnhandledException(Dart_Handle, Dart_Handle) {}
std::atomic<DartError::UnhandledExceptionReporter> log_unhandled_exception =
DefaultLogUnhandledException;
void ReportUnhandledException(Dart_Handle exception_handle,
Dart_Handle stack_trace_handle) {
log_unhandled_exception.load()(exception_handle, stack_trace_handle);
}
} // namespace
void SetUnhandledExceptionReporter(
DartError::UnhandledExceptionReporter reporter) {
log_unhandled_exception.store(reporter);
}
bool CheckAndHandleError(Dart_Handle handle) {
// Specifically handle UnhandledExceptionErrors first. These exclude fatal
// errors that are shutting down the vm and compilation errors in source code.
if (Dart_IsUnhandledExceptionError(handle)) {
Dart_Handle exception_handle = Dart_ErrorGetException(handle);
Dart_Handle stack_trace_handle = Dart_ErrorGetStackTrace(handle);
ReportUnhandledException(exception_handle, stack_trace_handle);
return true;
} else if (Dart_IsError(handle)) {
tonic::Log("Dart Error: %s", Dart_GetError(handle));
return true;
} else {
return false;
}
}
DartErrorHandleType GetErrorHandleType(Dart_Handle handle) {
if (Dart_IsCompilationError(handle)) {
return kCompilationErrorType;
} else if (Dart_IsApiError(handle)) {
return kApiErrorType;
} else if (Dart_IsError(handle)) {
return kUnknownErrorType;
} else {
return kNoError;
}
}
int GetErrorExitCode(Dart_Handle handle) {
if (Dart_IsCompilationError(handle)) {
return 254; // dart::bin::kCompilationErrorExitCode
} else if (Dart_IsApiError(handle)) {
return 253; // dart::bin::kApiErrorExitCode
} else if (Dart_IsError(handle)) {
return 255; // dart::bin::kErrorExitCode
} else {
return 0;
}
}
} // namespace tonic