|
Ruby 3.5.0dev (2025-10-25 revision c6d1458421796786d26e084b48a0a4a7e3b40867)
|
#include "ruby/internal/config.h"#include <stdarg.h>#include "defines.h"#include "ruby/internal/abi.h"#include "ruby/internal/anyargs.h"#include "ruby/internal/arithmetic.h"#include "ruby/internal/core.h"#include "ruby/internal/ctype.h"#include "ruby/internal/dllexport.h"#include "ruby/internal/error.h"#include "ruby/internal/eval.h"#include "ruby/internal/event.h"#include "ruby/internal/fl_type.h"#include "ruby/internal/gc.h"#include "ruby/internal/glob.h"#include "ruby/internal/globals.h"#include "ruby/internal/has/warning.h"#include "ruby/internal/interpreter.h"#include "ruby/internal/iterator.h"#include "ruby/internal/memory.h"#include "ruby/internal/method.h"#include "ruby/internal/module.h"#include "ruby/internal/newobj.h"#include "ruby/internal/scan_args.h"#include "ruby/internal/special_consts.h"#include "ruby/internal/symbol.h"#include "ruby/internal/value.h"#include "ruby/internal/value_type.h"#include "ruby/internal/variable.h"#include "ruby/assert.h"#include "ruby/backward/2/assume.h"#include "ruby/backward/2/inttypes.h"#include "ruby/backward/2/limits.h"#include "ruby/intern.h"#include <errno.h>#include "ruby/subst.h"#include "ruby/backward.h"

Go to the source code of this file.
Macros | |
| #define | USE_SYMBOL_AS_METHOD_NAME 1 |
| #define | FilePathValue(v) (RB_GC_GUARD(v) = rb_get_path(v)) |
| Ensures that the parameter object is a path. | |
| #define | FilePathStringValue(v) ((v) = rb_get_path(v)) |
| This macro actually does the same thing as FilePathValue now. | |
| #define | RUBY_VM 1 /* YARV */ |
| #define | HAVE_NATIVETHREAD |
| #define | InitVM(ext) {void InitVM_##ext(void);InitVM_##ext();} |
| This macro is for internal use. | |
| #define | RUBY__ASAN_DEFAULT_OPTIONS |
| #define | RUBY_GLOBAL_SETUP |
| #define | ruby_start_main(main, argc, argv) main(argc, argv) |
Functions | |
| VALUE | rb_get_path (VALUE obj) |
| Converts an object to a path. | |
| VALUE | rb_get_path_no_checksafe (VALUE) |
| const char * | rb_class2name (VALUE klass) |
| Queries the name of the passed class. | |
| const char * | rb_obj_classname (VALUE obj) |
| Queries the name of the class of the passed object. | |
| void | rb_p (VALUE obj) |
| Inspects an object. | |
| VALUE | rb_equal (VALUE lhs, VALUE rhs) |
This function is an optimised version of calling #==. | |
| VALUE | rb_require (const char *feature) |
| Identical to rb_require_string(), except it takes C's string instead of Ruby's. | |
| int | ruby_native_thread_p (void) |
| Queries if the thread which calls this function is a ruby's thread. | |
| int | ruby_snprintf (char *str, size_t n, char const *fmt,...) |
Our own locale-insensitive version of snprintf(3). | |
| int | ruby_vsnprintf (char *str, size_t n, char const *fmt, va_list ap) |
Identical to ruby_snprintf(), except it takes a va_list. | |
Errno handling routines for userland threads | |
Soooo this The ultimate reason is because Ruby now has N:M threads implemented. Threads of that sort change their context in user land. A function can be "transferred" between threads in middle of their executions. Let us for instance consider: This function (if ran under our Ractor) could change its running thread at the foo(int): # @foo(int)
push rbp
push r14
push rbx
mov ebx, edi
call __errno_location@PLT
mov r14, rax
mov ebp, dword ptr [rax]
mov edi, ebx
call close@PLT
mov dword ptr [r14], ebp
pop rbx
pop r14
pop rbp
ret
Notice how With the foo(int): # @foo(int)
push rbp
push rbx
push rax
mov ebx, edi
call rb_errno_ptr()@PLT
mov ebp, dword ptr [rax]
mov edi, ebx
call close@PLT
call rb_errno_ptr()@PLT
mov dword ptr [rax], ebp
add rsp, 8
pop rbx
pop rbp
ret
Which fixes the problem. | |
| #define | rb_orig_errno errno |
System-provided original errno. | |
| #define | errno (*rb_errno_ptr()) |
Ractor-aware version of errno. | |
| int | rb_errno (void) |
Identical to system errno. | |
| void | rb_errno_set (int err) |
| Set the errno. | |
| int * | rb_errno_ptr (void) |
The location of errno | |
| static int * | rb_orig_errno_ptr (void) |
| Not sure if it is necessary for extension libraries but this is where the "bare" errno is located. | |
Definition in file ruby.h.
| #define errno (*rb_errno_ptr()) |
| #define FilePathStringValue | ( | v | ) | ((v) = rb_get_path(v)) |
This macro actually does the same thing as FilePathValue now.
The "String" part indicates that this is for when a string is treated like a pathname, rather than the actual pathname on the file systems. For examples: Dir.fnmatch?, File.join, File.basename, etc.
| #define FilePathValue | ( | v | ) | (RB_GC_GUARD(v) = rb_get_path(v)) |
| #define HAVE_NATIVETHREAD |
| #define InitVM | ( | ext | ) | {void InitVM_##ext(void);InitVM_##ext();} |
| #define RUBY_GLOBAL_SETUP |
| #define ruby_start_main | ( | main, | |
| argc, | |||
| argv | |||
| ) | main(argc, argv) |
| #define RUBY_VM 1 /* YARV */ |
| #define USE_SYMBOL_AS_METHOD_NAME 1 |
| const char * rb_class2name | ( | VALUE | klass | ) |
Queries the name of the passed class.
| [in] | klass | An instance of a class. |
klass. Definition at line 506 of file variable.c.
Referenced by rb_class2name(), rb_obj_classname(), and rb_profile_frame_classpath().
| int rb_errno | ( | void | ) |
| int * rb_errno_ptr | ( | void | ) |
| void rb_errno_set | ( | int | err | ) |
Converts an object to a path.
It first tries #to_path method if any, then falls back to #to_str method.
| [in] | obj | Arbitrary ruby object. |
| rb_eArgError | `obj` contains a NUL byte. |
| rb_eTypeError | `obj` is not path-ish. |
| rb_eEncCompatError | No encoding conversion from `obj` to path. |
| const char * rb_obj_classname | ( | VALUE | obj | ) |
Queries the name of the class of the passed object.
| [in] | obj | Arbitrary ruby object. |
obj. Definition at line 515 of file variable.c.
Referenced by rb_Hash(), and rb_obj_classname().
|
inlinestatic |
Not sure if it is necessary for extension libraries but this is where the "bare" errno is located.
errno. Definition at line 381 of file ruby.h.
Referenced by rb_errno(), rb_errno_ptr(), and rb_errno_set().
| void rb_p | ( | VALUE | obj | ) |
| VALUE rb_require | ( | const char * | feature | ) |
Identical to rb_require_string(), except it takes C's string instead of Ruby's.
| [in] | feature | Name of a feature, e.g. "json". |
| rb_eLoadError | No such feature. |
| rb_eRuntimeError | `$"` is frozen; unable to push. @retval RUBY_Qtrue The feature is loaded for the first time. @retval RUBY_Qfalse The feature has already been loaded. @post <tt>\$" is updated. |
| int ruby_native_thread_p | ( | void | ) |
Queries if the thread which calls this function is a ruby's thread.
"Ruby's" in this context is a thread created using one of our APIs like rb_thread_create(). There are distinctions between ruby's and other threads. For instance calling ruby methods are allowed only from inside of a ruby's thread.
| 1 | The current thread is a Ruby's thread. |
| 0 | The current thread is a random thread from outside of Ruby. |
Definition at line 5768 of file thread.c.
Referenced by ruby_native_thread_p().
| int ruby_snprintf | ( | char * | str, |
| size_t | n, | ||
| char const * | fmt, | ||
| ... | |||
| ) |
Our own locale-insensitive version of snprintf(3).
It can also be seen as a routine identical to rb_sprintf(), except it writes back to the passed buffer instead of allocating a new Ruby object.
| [out] | str | Return buffer |
| [in] | n | Number of bytes of str. |
| [in] | fmt | A printf-like format specifier. |
| [in] | ... | Variadic number of contents to format. |
str, if n was large enough. Comparing this to n can give you insights that the buffer is too small or too big. Especially passing 0 to n gives you the exact number of bytes necessary to hold the result string without writing anything to anywhere. str holds up to n-1 bytes of formatted contents (and the terminating NUL character.) Definition at line 1041 of file sprintf.c.
Referenced by ruby_snprintf().
| int ruby_vsnprintf | ( | char * | str, |
| size_t | n, | ||
| char const * | fmt, | ||
| va_list | ap | ||
| ) |
Identical to ruby_snprintf(), except it takes a va_list.
It can also be seen as a routine identical to rb_vsprintf(), except it writes back to the passed buffer instead of allocating a new Ruby object.
| [out] | str | Return buffer |
| [in] | n | Number of bytes of str. |
| [in] | fmt | A printf-like format specifier. |
| [in] | ap | Contents to format. |
str, if n was large enough. Comparing this to n can give you insights that the buffer is too small or too big. Especially passing 0 to n gives you the exact number of bytes necessary to hold the result string without writing anything to anywhere. str holds up to n-1 bytes of formatted contents (and the terminating NUL character.) Definition at line 1014 of file sprintf.c.
Referenced by ruby_vsnprintf().