Ruby
3.4.0dev (2024-12-06 revision 892c46283a5ea4179500d951c9d4866c0051f27b)
|
#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. More... | |
#define | FilePathStringValue(v) ((v) = rb_get_path(v)) |
This macro actually does the same thing as FilePathValue now. More... | |
#define | RUBY_VM 1 /* YARV */ |
#define | HAVE_NATIVETHREAD |
#define | InitVM(ext) {void InitVM_##ext(void);InitVM_##ext();} |
This macro is for internal use. More... | |
Functions | |
VALUE | rb_get_path (VALUE obj) |
Converts an object to a path. More... | |
VALUE | rb_get_path_no_checksafe (VALUE) |
const char * | rb_class2name (VALUE klass) |
Queries the name of the passed class. More... | |
const char * | rb_obj_classname (VALUE obj) |
Queries the name of the class of the passed object. More... | |
void | rb_p (VALUE obj) |
Inspects an object. More... | |
VALUE | rb_equal (VALUE lhs, VALUE rhs) |
This function is an optimised version of calling #== . More... | |
VALUE | rb_require (const char *feature) |
Identical to rb_require_string(), except it takes C's string instead of Ruby's. More... | |
int | ruby_native_thread_p (void) |
Queries if the thread which calls this function is a ruby's thread. More... | |
int | ruby_snprintf (char *str, size_t n, char const *fmt,...) |
Our own locale-insensitive version of snprintf(3) . More... | |
int | ruby_vsnprintf (char *str, size_t n, char const *fmt, va_list ap) |
Identical to ruby_snprintf(), except it takes a va_list . More... | |
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 . More... | |
#define | errno (*rb_errno_ptr()) |
Ractor-aware version of errno . More... | |
int | rb_errno (void) |
Identical to system errno . More... | |
void | rb_errno_set (int err) |
Set the errno. More... | |
int * | rb_errno_ptr (void) |
The location of errno More... | |
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. More... | |
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 |
Exists here for backwards compatibility only. You can safely forget about it.
#define InitVM | ( | ext | ) | {void InitVM_##ext(void);InitVM_##ext();} |
#define RUBY_VM 1 /* YARV */ |
Exists here for backwards compatibility only. You can safely forget about it.
#define USE_SYMBOL_AS_METHOD_NAME 1 |
Exists here for backwards compatibility only. You can safely forget about it.
const char* rb_class2name | ( | VALUE | klass | ) |
Queries the name of the passed class.
[in] | klass | An instance of a class. |
klass
. Definition at line 418 of file variable.c.
Referenced by rb_obj_classname(), and rb_profile_frame_classpath().
int rb_errno | ( | void | ) |
Identical to system errno
.
errno
number. Definition at line 2149 of file eval.c.
Referenced by rb_nogvl().
int* rb_errno_ptr | ( | void | ) |
void rb_errno_set | ( | int | err | ) |
Set the errno.
err | New errno . |
errno
is now set to err
. Definition at line 2155 of file eval.c.
Referenced by rb_nogvl().
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. |
Definition at line 246 of file file.c.
Referenced by rb_find_file(), rb_find_file_ext(), and rb_get_path_no_checksafe().
The part that did "no_checksafe" was deleted. It remains here because of no harm.
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 427 of file variable.c.
Referenced by rb_Hash().
|
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. |
RUBY_Qtrue | The feature is loaded for the first time. |
RUBY_Qfalse | The feature has already been loaded. |
$"
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. |
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.) 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.)