Ruby: include/ruby/internal/intern/error.h Source File

Ruby 3.4.8p72 (2025-12-17 revision 995b59f66677d44767ce9faac6957e5543617ff9)

error.h
Go to the documentation of this file.
1#ifndef RBIMPL_INTERN_ERROR_H /*-*-C++-*-vi:se ft=cpp:*/
2#define RBIMPL_INTERN_ERROR_H
23#include "ruby/internal/attr/format.h"
24#include "ruby/internal/attr/noreturn.h"
25#include "ruby/internal/dllexport.h"
26#include "ruby/internal/value.h"
27#include "ruby/internal/fl_type.h"
28#include "ruby/backward/2/assume.h"
29
35#define UNLIMITED_ARGUMENTS (-1)
36
37#define rb_exc_new2 rb_exc_new_cstr
38#define rb_exc_new3 rb_exc_new_str
41#define rb_check_arity rb_check_arity
44 RBIMPL_SYMBOL_EXPORT_BEGIN()
45
46/* error.c */
47
48
66 VALUE rb_exc_new(VALUE etype, const char *ptr, long len);
67
68 RBIMPL_ATTR_NONNULL(())
78 VALUE rb_exc_new_cstr(VALUE etype, const char *str);
79
89 VALUE rb_exc_new_str(VALUE etype, VALUE str);
90
91 RBIMPL_ATTR_NORETURN()
92 RBIMPL_ATTR_NONNULL((1))
93 RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 1, 2)
105void rb_loaderror(const char *fmt, ...);
106
107 RBIMPL_ATTR_NORETURN()
108 RBIMPL_ATTR_NONNULL((2))
109 RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 2, 3)
120void rb_loaderror_with_path(VALUE path, const char *fmt, ...);
121
122 RBIMPL_ATTR_NORETURN()
123 RBIMPL_ATTR_NONNULL((2))
124 RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 2, 3)
134void rb_name_error(ID name, const char *fmt, ...);
135
136 RBIMPL_ATTR_NORETURN()
137 RBIMPL_ATTR_NONNULL((2))
138 RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 2, 3)
147void rb_name_error_str(VALUE name, const char *fmt, ...);
148
149 RBIMPL_ATTR_NORETURN()
150 RBIMPL_ATTR_NONNULL((2))
151 RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 2, 3)
166void rb_frozen_error_raise(VALUE recv, const char *fmt, ...);
167
168 RBIMPL_ATTR_NORETURN()
169 RBIMPL_ATTR_NONNULL(())
179void rb_invalid_str(const char *str, const char *type);
180
181 RBIMPL_ATTR_NORETURN()
182 RBIMPL_ATTR_NONNULL(())
191void rb_error_frozen(const char *what);
192
193 RBIMPL_ATTR_NORETURN()
202void rb_error_frozen_object(VALUE what);
203
211void rb_check_frozen(VALUE obj);
212
223void rb_check_copyable(VALUE obj, VALUE orig);
224
225 RBIMPL_ATTR_NORETURN()
238void rb_error_arity(int argc, int min, int max);
239
240void rb_str_modify(VALUE str);
241
242 RBIMPL_SYMBOL_EXPORT_END()
243
249#define rb_check_frozen_internal rb_check_frozen
250
252static inline void
253rb_check_frozen_inline(VALUE obj)
254{
255 if (RB_UNLIKELY(RB_OBJ_FROZEN(obj))) {
256 rb_error_frozen_object(obj);
257 }
258
259 /* ref: internal CHILLED_STRING_P()
260 This is an implementation detail subject to change. */
261 if (RB_UNLIKELY(RB_TYPE_P(obj, T_STRING) && FL_TEST_RAW(obj, RUBY_FL_USER2 | RUBY_FL_USER3))) { // STR_CHILLED
262 rb_str_modify(obj);
263 }
264}
265
266/* rb_check_frozen() is available as a symbol, but have
267 * the inline version take priority for native consumers. */
268#define rb_check_frozen rb_check_frozen_inline
269
283static inline int
284rb_check_arity(int argc, int min, int max)
285{
286 if ((argc < min) || (max != UNLIMITED_ARGUMENTS && argc > max))
287 rb_error_arity(argc, min, max);
288 return argc;
289}
290
291#endif /* RBIMPL_INTERN_ERROR_H */
assume.h
Defines ASSUME / RB_LIKELY / UNREACHABLE.
dllexport.h
Tweaking visibility of C variables/functions.
RBIMPL_SYMBOL_EXPORT_END
#define RBIMPL_SYMBOL_EXPORT_END()
Counterpart of RBIMPL_SYMBOL_EXPORT_BEGIN.
Definition dllexport.h:74
RBIMPL_SYMBOL_EXPORT_BEGIN
#define RBIMPL_SYMBOL_EXPORT_BEGIN()
Shortcut macro equivalent to RUBY_SYMBOL_EXPORT_BEGIN extern "C" {.
Definition dllexport.h:65
fl_type.h
Defines enum ruby_fl_type.
RB_OBJ_FROZEN
static bool RB_OBJ_FROZEN(VALUE obj)
Checks if an object is frozen.
Definition fl_type.h:898
RUBY_FL_USER3
@ RUBY_FL_USER3
User-defined flag.
Definition fl_type.h:331
RUBY_FL_USER2
@ RUBY_FL_USER2
User-defined flag.
Definition fl_type.h:330
format.h
Defines RBIMPL_ATTR_FORMAT.
RBIMPL_ATTR_FORMAT
#define RBIMPL_ATTR_FORMAT(x, y, z)
Wraps (or simulates) __attribute__((format))
Definition format.h:29
T_STRING
#define T_STRING
Old name of RUBY_T_STRING.
Definition value_type.h:78
FL_TEST_RAW
#define FL_TEST_RAW
Old name of RB_FL_TEST_RAW.
Definition fl_type.h:132
rb_name_error
void rb_name_error(ID name, const char *fmt,...)
Raises an instance of rb_eNameError.
Definition error.c:2344
rb_check_copyable
void rb_check_copyable(VALUE obj, VALUE orig)
Ensures that the passed object can be initialize_copy relationship.
Definition error.c:4197
rb_error_frozen
void rb_error_frozen(const char *what)
Identical to rb_frozen_error_raise(), except its raising exception has a message like "can't modify f...
Definition error.c:4083
rb_name_error_str
void rb_name_error_str(VALUE name, const char *fmt,...)
Identical to rb_name_error(), except it takes a VALUE instead of ID.
Definition error.c:2359
rb_frozen_error_raise
void rb_frozen_error_raise(VALUE recv, const char *fmt,...)
Raises an instance of rb_eFrozenError.
Definition error.c:4089
rb_invalid_str
void rb_invalid_str(const char *str, const char *type)
Honestly I don't understand the name, but it raises an instance of rb_eArgError.
Definition error.c:2783
rb_exc_new
VALUE rb_exc_new(VALUE etype, const char *ptr, long len)
Creates an instance of the passed exception class.
Definition error.c:1468
rb_error_frozen_object
void rb_error_frozen_object(VALUE what)
Identical to rb_error_frozen(), except it takes arbitrary Ruby object instead of C's string.
Definition error.c:4129
rb_exc_new_str
VALUE rb_exc_new_str(VALUE etype, VALUE str)
Identical to rb_exc_new_cstr(), except it takes a Ruby's string instead of C's.
Definition error.c:1481
rb_loaderror
void rb_loaderror(const char *fmt,...)
Raises an instance of rb_eLoadError.
Definition error.c:3784
rb_loaderror_with_path
void rb_loaderror_with_path(VALUE path, const char *fmt,...)
Identical to rb_loaderror(), except it additionally takes which file is unable to load.
Definition error.c:3796
UNLIMITED_ARGUMENTS
#define UNLIMITED_ARGUMENTS
This macro is used in conjunction with rb_check_arity().
Definition error.h:35
rb_check_frozen_inline
static void rb_check_frozen_inline(VALUE obj)
Just another name of rb_check_frozen.
Definition error.h:253
rb_check_arity
static int rb_check_arity(int argc, int min, int max)
Ensures that the passed integer is in the passed range.
Definition error.h:284
rb_exc_new_cstr
#define rb_exc_new_cstr(exc, str)
Identical to rb_exc_new(), except it assumes the passed pointer is a pointer to a C string.
Definition string.h:1670
len
int len
Length of the buffer.
Definition io.h:8
RBIMPL_ATTR_NONNULL
#define RBIMPL_ATTR_NONNULL(list)
Wraps (or simulates) __attribute__((nonnull))
Definition nonnull.h:30
noreturn.h
Defines RBIMPL_ATTR_NORETURN.
RBIMPL_ATTR_NORETURN
#define RBIMPL_ATTR_NORETURN()
Wraps (or simulates) [[noreturn]]
Definition noreturn.h:38
value.h
Defines VALUE and ID.
ID
uintptr_t ID
Type that represents a Ruby identifier such as a variable name.
Definition value.h:52
VALUE
uintptr_t VALUE
Type that represents a Ruby object.
Definition value.h:40
RB_TYPE_P
static bool RB_TYPE_P(VALUE obj, enum ruby_value_type t)
Queries if the given object is of given type.
Definition value_type.h:376