1 // Copyright 2020 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef INCLUDE_CPPGC_INTERNAL_LOGGING_H_ 6 #define INCLUDE_CPPGC_INTERNAL_LOGGING_H_ 7 8 #include "cppgc/source-location.h" 9 #include "v8config.h" // NOLINT(build/include_directory) 10 11 namespace cppgc { 12 namespace internal { 13 14 void V8_EXPORT DCheckImpl(const char*, 15 const SourceLocation& = SourceLocation::Current()); 16 [[noreturn]] void V8_EXPORT 17 FatalImpl(const char*, const SourceLocation& = SourceLocation::Current()); 18 19 // Used to ignore -Wunused-variable. 20 template <typename> 21 struct EatParams {}; 22 23 #if defined(DEBUG) 24 #define CPPGC_DCHECK_MSG(condition, message) \ 25 do { \ 26 if (V8_UNLIKELY(!(condition))) { \ 27 ::cppgc::internal::DCheckImpl(message); \ 28 } \ 29 } while (false) 30 #else // !defined(DEBUG) 31 #define CPPGC_DCHECK_MSG(condition, message) \ 32 (static_cast<void>(::cppgc::internal::EatParams<decltype( \ 33 static_cast<void>(condition), message)>{})) 34 #endif // !defined(DEBUG) 35 36 #define CPPGC_DCHECK(condition) CPPGC_DCHECK_MSG(condition, #condition) 37 38 #define CPPGC_CHECK_MSG(condition, message) \ 39 do { \ 40 if (V8_UNLIKELY(!(condition))) { \ 41 ::cppgc::internal::FatalImpl(message); \ 42 } \ 43 } while (false) 44 45 #define CPPGC_CHECK(condition) CPPGC_CHECK_MSG(condition, #condition) 46 47 } // namespace internal 48 } // namespace cppgc 49 50 #endif // INCLUDE_CPPGC_INTERNAL_LOGGING_H_ 51