26 #include "ruby/internal/cast.h"
60 #if ! defined(RUBY_DEBUG)
61 # define RBIMPL_RUBY_DEBUG 0
62 #elif !!RUBY_DEBUG-1 < 0
63 # define RBIMPL_RUBY_DEBUG 0
65 # define RBIMPL_RUBY_DEBUG 1
74 # define RBIMPL_NDEBUG 1
76 # define RBIMPL_NDEBUG 0
85 #if defined(__DOXYGEN__)
91 # define RUBY_NDEBUG 1
93 #elif (RBIMPL_NDEBUG == 1) && (RBIMPL_RUBY_DEBUG == 0)
96 # define RUBY_NDEBUG 1
99 #elif (RBIMPL_NDEBUG == 0) && (RBIMPL_RUBY_DEBUG == 1)
101 # define RUBY_DEBUG 1
102 # define RUBY_NDEBUG 0
105 #elif (RBIMPL_NDEBUG == 0) && (RBIMPL_RUBY_DEBUG == 0)
107 # define RUBY_DEBUG 0
108 # define RUBY_NDEBUG 1
111 #elif (RBIMPL_NDEBUG == 1) && (RBIMPL_RUBY_DEBUG == 1)
113 # define RUBY_DEBUG 1
114 # define RUBY_NDEBUG 0
117 # if defined(_MSC_VER)
118 # pragma message("NDEBUG is ignored because RUBY_DEBUG>0.")
119 # elif defined(__GNUC__)
120 # pragma GCC warning "NDEBUG is ignored because RUBY_DEBUG>0."
122 # error NDEBUG is ignored because RUBY_DEBUG>0.
126 #undef RBIMPL_RUBY_DEBUG
129 #define RBIMPL_ASSERT_NOTHING RBIMPL_CAST((void)0)
134 void rb_assert_failure(const
char *file,
int line, const
char *name, const
char *expr);
137 #ifdef RUBY_FUNCTION_NAME_STRING
138 # define RBIMPL_ASSERT_FUNC RUBY_FUNCTION_NAME_STRING
140 # define RBIMPL_ASSERT_FUNC RBIMPL_CAST((const char *)0)
150 #define RUBY_ASSERT_FAIL(mesg) \
151 rb_assert_failure(__FILE__, __LINE__, RBIMPL_ASSERT_FUNC, mesg)
159 #define RUBY_ASSERT_MESG(expr, mesg) \
160 (RB_LIKELY(expr) ? RBIMPL_ASSERT_NOTHING : RUBY_ASSERT_FAIL(mesg))
167 #define RUBY_ASSERT_ALWAYS(expr) RUBY_ASSERT_MESG((expr), #expr)
175 # define RUBY_ASSERT(expr) RUBY_ASSERT_MESG((expr), #expr)
177 # define RUBY_ASSERT(expr) RBIMPL_ASSERT_NOTHING
190 # define RUBY_ASSERT_NDEBUG(expr) RBIMPL_ASSERT_NOTHING
192 # define RUBY_ASSERT_NDEBUG(expr) RUBY_ASSERT_MESG((expr), #expr)
200 # define RUBY_ASSERT_MESG_WHEN(cond, expr, mesg) RUBY_ASSERT_MESG((expr), (mesg))
202 # define RUBY_ASSERT_MESG_WHEN(cond, expr, mesg) \
203 ((cond) ? RUBY_ASSERT_MESG((expr), (mesg)) : RBIMPL_ASSERT_NOTHING)
213 #define RUBY_ASSERT_WHEN(cond, expr) RUBY_ASSERT_MESG_WHEN((cond), (expr), #expr)
221 # define RBIMPL_ASSERT_OR_ASSUME(expr) RUBY_ASSERT_ALWAYS(expr)
222 #elif RBIMPL_COMPILER_BEFORE(Clang, 7, 0, 0)
224 # define RBIMPL_ASSERT_OR_ASSUME(expr) RBIMPL_ASSERT_NOTHING
225 #elif defined(RUBY_ASSERT_NOASSUME)
227 # define RBIMPL_ASSERT_OR_ASSUME(expr) RBIMPL_ASSERT_NOTHING
228 #elif ! defined(RBIMPL_HAVE___ASSUME)
229 # define RBIMPL_ASSERT_OR_ASSUME(expr) RBIMPL_ASSERT_NOTHING
231 # define RBIMPL_ASSERT_OR_ASSUME(expr) RBIMPL_ASSUME(expr)
Defines ASSUME / RB_LIKELY / UNREACHABLE.
Defines RBIMPL_ATTR_COLD.
#define RBIMPL_ATTR_COLD()
Wraps (or simulates) __attribute__((cold))
Tweaking visibility of C variables/functions.
#define RBIMPL_SYMBOL_EXPORT_END()
Counterpart of RBIMPL_SYMBOL_EXPORT_BEGIN.
#define RBIMPL_SYMBOL_EXPORT_BEGIN()
Shortcut macro equivalent to RUBY_SYMBOL_EXPORT_BEGIN extern "C" {.
RBIMPL_ATTR_NORETURN() void rb_eof_error(void)
Utility function to raise rb_eEOFError.
Defines RBIMPL_ASSUME / RBIMPL_UNREACHABLE.
Defines RBIMPL_ATTR_NORETURN.