Ruby 3.1.3p185 (2022-11-24 revision 1a6b16756e0ba6b95ab71a441357ed5484e33498)
|
Defines enum ruby_fl_type. More...
#include "ruby/internal/config.h"
#include "ruby/internal/attr/artificial.h"
#include "ruby/internal/attr/deprecated.h"
#include "ruby/internal/attr/flag_enum.h"
#include "ruby/internal/attr/forceinline.h"
#include "ruby/internal/attr/noalias.h"
#include "ruby/internal/attr/pure.h"
#include "ruby/internal/cast.h"
#include "ruby/internal/compiler_since.h"
#include "ruby/internal/core/rbasic.h"
#include "ruby/internal/dllexport.h"
#include "ruby/internal/has/extension.h"
#include "ruby/internal/special_consts.h"
#include "ruby/internal/stdbool.h"
#include "ruby/internal/value.h"
#include "ruby/internal/value_type.h"
#include "ruby/assert.h"
#include "ruby/defines.h"
Go to the source code of this file.
Enumerations | |
enum | ruby_fl_ushift { RUBY_FL_USHIFT = 12 } |
This is an enum because GDB wants it (rather than a macro). More... | |
enum | ruby_fl_type { RUBY_FL_WB_PROTECTED = (1<<5) , RUBY_FL_PROMOTED0 = (1<<5) , RUBY_FL_PROMOTED1 = (1<<6) , RUBY_FL_PROMOTED = RUBY_FL_PROMOTED0 | RUBY_FL_PROMOTED1 , RUBY_FL_FINALIZE = (1<<7) , RUBY_FL_SHAREABLE = (1<<8) , RUBY_FL_SEEN_OBJ_ID = (1<<9) , RUBY_FL_EXIVAR = (1<<10) , RUBY_FL_FREEZE = (1<<11) , RUBY_FL_USER0 = (1<<(RUBY_FL_USHIFT+0)) , RUBY_FL_USER1 = (1<<(RUBY_FL_USHIFT+1)) , RUBY_FL_USER2 = (1<<(RUBY_FL_USHIFT+2)) , RUBY_FL_USER3 = (1<<(RUBY_FL_USHIFT+3)) , RUBY_FL_USER4 = (1<<(RUBY_FL_USHIFT+4)) , RUBY_FL_USER5 = (1<<(RUBY_FL_USHIFT+5)) , RUBY_FL_USER6 = (1<<(RUBY_FL_USHIFT+6)) , RUBY_FL_USER7 = (1<<(RUBY_FL_USHIFT+7)) , RUBY_FL_USER8 = (1<<(RUBY_FL_USHIFT+8)) , RUBY_FL_USER9 = (1<<(RUBY_FL_USHIFT+9)) , RUBY_FL_USER10 = (1<<(RUBY_FL_USHIFT+10)) , RUBY_FL_USER11 = (1<<(RUBY_FL_USHIFT+11)) , RUBY_FL_USER12 = (1<<(RUBY_FL_USHIFT+12)) , RUBY_FL_USER13 = (1<<(RUBY_FL_USHIFT+13)) , RUBY_FL_USER14 = (1<<(RUBY_FL_USHIFT+14)) , RUBY_FL_USER15 = (1<<(RUBY_FL_USHIFT+15)) , RUBY_FL_USER16 = (1<<(RUBY_FL_USHIFT+16)) , RUBY_FL_USER17 = (1<<(RUBY_FL_USHIFT+17)) , RUBY_FL_USER18 = (1<<(RUBY_FL_USHIFT+18)) , RUBY_FL_USER19 = (1<<(RUBY_FL_USHIFT+19)) , RUBY_ELTS_SHARED = RUBY_FL_USER2 , RUBY_FL_SINGLETON = RUBY_FL_USER0 , RUBY_FL_WB_PROTECTED = (1<<5) , RUBY_FL_PROMOTED0 = (1<<5) , RUBY_FL_PROMOTED1 = (1<<6) , RUBY_FL_PROMOTED = RUBY_FL_PROMOTED0 | RUBY_FL_PROMOTED1 , RUBY_FL_FINALIZE = (1<<7) , RUBY_FL_TAINT = (1<<8) , RUBY_FL_SHAREABLE = (1<<8) , RUBY_FL_UNTRUSTED = (1<<8) , RUBY_FL_SEEN_OBJ_ID = (1<<9) , RUBY_FL_EXIVAR = (1<<10) , RUBY_FL_FREEZE = (1<<11) , RUBY_FL_USER0 = (1<<(RUBY_FL_USHIFT+ 0 )) , RUBY_FL_USER1 = (1<<(RUBY_FL_USHIFT+ 1 )) , RUBY_FL_USER2 = (1<<(RUBY_FL_USHIFT+ 2 )) , RUBY_FL_USER3 = (1<<(RUBY_FL_USHIFT+ 3 )) , RUBY_FL_USER4 = (1<<(RUBY_FL_USHIFT+ 4 )) , RUBY_FL_USER5 = (1<<(RUBY_FL_USHIFT+ 5 )) , RUBY_FL_USER6 = (1<<(RUBY_FL_USHIFT+ 6 )) , RUBY_FL_USER7 = (1<<(RUBY_FL_USHIFT+ 7 )) , RUBY_FL_USER8 = (1<<(RUBY_FL_USHIFT+ 8 )) , RUBY_FL_USER9 = (1<<(RUBY_FL_USHIFT+ 9 )) , RUBY_FL_USER10 = (1<<(RUBY_FL_USHIFT+ 10 )) , RUBY_FL_USER11 = (1<<(RUBY_FL_USHIFT+ 11 )) , RUBY_FL_USER12 = (1<<(RUBY_FL_USHIFT+ 12 )) , RUBY_FL_USER13 = (1<<(RUBY_FL_USHIFT+ 13 )) , RUBY_FL_USER14 = (1<<(RUBY_FL_USHIFT+ 14 )) , RUBY_FL_USER15 = (1<<(RUBY_FL_USHIFT+ 15 )) , RUBY_FL_USER16 = (1<<(RUBY_FL_USHIFT+ 16 )) , RUBY_FL_USER17 = (1<<(RUBY_FL_USHIFT+ 17 )) , RUBY_FL_USER18 = (1<<(RUBY_FL_USHIFT+ 18 )) , RUBY_FL_USER19 = (1<<(RUBY_FL_USHIFT+ 19 )) , RUBY_ELTS_SHARED = RUBY_FL_USER2 , RUBY_FL_SINGLETON = RUBY_FL_USER0 } |
The flags. More... | |
enum | { RUBY_FL_DUPPED = (int)RUBY_T_MASK | (int)RUBY_FL_EXIVAR } |
Functions | |
void | rb_obj_infect (VALUE victim, VALUE carrier) |
void | rb_freeze_singleton_class (VALUE klass) |
This is an implementation detail of RB_OBJ_FREEZE(). More... | |
static bool | RB_FL_ABLE (VALUE obj) |
Checks if the object is flaggable. More... | |
static VALUE | RB_FL_TEST_RAW (VALUE obj, VALUE flags) |
This is an implenentation detail of RB_FL_TEST(). More... | |
static VALUE | RB_FL_TEST (VALUE obj, VALUE flags) |
Tests if the given flag(s) are set or not. More... | |
static bool | RB_FL_ANY_RAW (VALUE obj, VALUE flags) |
This is an implenentation detail of RB_FL_ANY(). More... | |
static bool | RB_FL_ANY (VALUE obj, VALUE flags) |
Identical to RB_FL_TEST(), except it returns bool. More... | |
static bool | RB_FL_ALL_RAW (VALUE obj, VALUE flags) |
This is an implenentation detail of RB_FL_ALL(). More... | |
static bool | RB_FL_ALL (VALUE obj, VALUE flags) |
Identical to RB_FL_ANY(), except it mandates all passed flags be set. More... | |
static void | RB_FL_SET_RAW (VALUE obj, VALUE flags) |
This is an implenentation detail of RB_FL_SET(). More... | |
static void | RB_FL_SET (VALUE obj, VALUE flags) |
Sets the given flag(s). More... | |
static void | RB_FL_UNSET_RAW (VALUE obj, VALUE flags) |
This is an implenentation detail of RB_FL_UNSET(). More... | |
static void | RB_FL_UNSET (VALUE obj, VALUE flags) |
Clears the given flag(s). More... | |
static void | RB_FL_REVERSE_RAW (VALUE obj, VALUE flags) |
This is an implenentation detail of RB_FL_REVERSE(). More... | |
static void | RB_FL_REVERSE (VALUE obj, VALUE flags) |
Reverses the flags. More... | |
static bool | RB_OBJ_TAINTABLE (VALUE obj) |
static VALUE | RB_OBJ_TAINTED_RAW (VALUE obj) |
static bool | RB_OBJ_TAINTED (VALUE obj) |
static void | RB_OBJ_TAINT_RAW (VALUE obj) |
static void | RB_OBJ_TAINT (VALUE obj) |
static void | RB_OBJ_INFECT_RAW (VALUE dst, VALUE src) |
static void | RB_OBJ_INFECT (VALUE dst, VALUE src) |
static VALUE | RB_OBJ_FROZEN_RAW (VALUE obj) |
This is an implenentation detail of RB_OBJ_FROZEN(). More... | |
static bool | RB_OBJ_FROZEN (VALUE obj) |
Checks if an object is frozen. More... | |
static void | RB_OBJ_FREEZE_RAW (VALUE obj) |
This is an implenentation detail of RB_OBJ_FREEZE(). More... | |
static void | rb_obj_freeze_inline (VALUE x) |
Prevents further modifications to the given object. More... | |
Defines enum ruby_fl_type.
RBIMPL
or rbimpl
are implementation details. Don't take them as canon. They could rapidly appear then vanish. The name (path) of this header file is also an implementation detail. Do not expect it to persist at the place it is now. Developers are free to move it anywhere anytime at will. __VA_ARGS__
is always available. We assume C99 for ruby itself but we don't assume languages of extension libraries. They could be written in C++98. Definition in file fl_type.h.
#define RB_OBJ_FREEZE rb_obj_freeze_inline |
Just another name of rb_obj_freeze_inline.
#define RBIMPL_FL_USER_N | ( | n | ) | RUBY_FL_USER##n = (1<<(RUBY_FL_USHIFT+n)) |
anonymous enum |
Enumerator | |
---|---|
RUBY_FL_DUPPED |
|
enum ruby_fl_type |
The flags.
Each ruby objects have their own characteristics apart from their classes. For instance whether an object is frozen or not is not controlled by its class. This is the type that represents such properties.
FL_USER
terminology: the "user" here does not necessarily mean only you. For instance struct RString instances use these bits to cache their encodings etc. Devs discussed about this topic, reached their consensus that RUBY_T_DATA is the only valid data structure that can use these bits; other data structures including RUBY_T_OBJECT use these bits for their own purpose. See also https://bugs.ruby-lang.org/issues/18059 Enumerator | |
---|---|
RUBY_FL_WB_PROTECTED |
|
RUBY_FL_PROMOTED0 | This flag has something to do with our garbage collector. These days ruby objects are "generational". There are those who are young and those who are old. Young objects are prone to die; monitored relatively extensively by the garbage collector. OTOH old objects tend to live longer. They are relatively rarely considered. This flag is set when a object experienced promotion i.e. survived a garbage collection. |
RUBY_FL_PROMOTED1 | This flag has something to do with our garbage collector. These days ruby objects are "generational". There are those who are young and those who are old. Young objects are prone to die; monitored relatively extensively by the garbage collector. OTOH old objects tend to live longer. They are relatively rarely considered. This flag is set when a object experienced two promotions i.e. survived garbage collections twice. |
RUBY_FL_PROMOTED | This flag has something to do with our garbage collector. These days ruby objects are "generational". There are those who are young and those who are old. Young objects are prone to die; monitored relatively extensively by the garbage collector. OTOH old objects tend to live longer. They are relatively rarely considered. This flag is set when a object experienced promotions i.e. survived more than one garbage collections. |
RUBY_FL_FINALIZE | This flag has something to do with finalisers. A ruby object can have its finaliser, which is another object that evaluates when the target object is about to die. This flag is used to denote that there is an attached finaliser. |
RUBY_FL_TAINT |
|
RUBY_FL_SHAREABLE | This flag has something to do with Ractor. Multiple Ractors run without protecting each other. Sharing an object among Ractors are basically dangerous, disabled by default. This flag is used to bypass that restriction. Of course, you have to manually prevent race conditions then. This flag needs deep understanding of multithreaded programming. You would better not use it. |
RUBY_FL_UNTRUSTED |
|
RUBY_FL_SEEN_OBJ_ID | This flag has something to do with object IDs. Unlike in the old days, an object's object ID (that a user can query using |
RUBY_FL_EXIVAR | This flag has something to do with instance variables. 3rd parties need not know, but there are several ways to store an object's instance variables. Objects with this flag use so-called "generic" backend storage. This distinction is purely an implementation detail. People need not be aware of this working behind-the-scene. |
RUBY_FL_FREEZE | This flag has something to do with data immutability. When this flag is set an object is considered "frozen". No modification are expected to happen beyond that point for the particular object. Immutability is basically considered to be a good property these days. Library authors are expected to obey. Test this bit before you touch a data structure.
|
RUBY_FL_USER0 | User-defined flag. |
RUBY_FL_USER1 | User-defined flag. |
RUBY_FL_USER2 | User-defined flag. |
RUBY_FL_USER3 | User-defined flag. |
RUBY_FL_USER4 | User-defined flag. |
RUBY_FL_USER5 | User-defined flag. |
RUBY_FL_USER6 | User-defined flag. |
RUBY_FL_USER7 | User-defined flag. |
RUBY_FL_USER8 | User-defined flag. |
RUBY_FL_USER9 | User-defined flag. |
RUBY_FL_USER10 | User-defined flag. |
RUBY_FL_USER11 | User-defined flag. |
RUBY_FL_USER12 | User-defined flag. |
RUBY_FL_USER13 | User-defined flag. |
RUBY_FL_USER14 | User-defined flag. |
RUBY_FL_USER15 | User-defined flag. |
RUBY_FL_USER16 | User-defined flag. |
RUBY_FL_USER17 | User-defined flag. |
RUBY_FL_USER18 | User-defined flag. |
RUBY_FL_USER19 | User-defined flag. |
RUBY_ELTS_SHARED | This flag has something to do with data structures. Over time, ruby evolved to reduce memory footprints. One of such attempt is so-called copy-on-write, which delays duplication of resources until ultimately necessary. Some data structures share this scheme. For example multiple instances of struct RArray could point identical memory region in common, as long as they don't differ. As people favour immutable style of programming than before, this situation is getting more and more common. Because such "shared" memory regions have nuanced ownership by nature, each structures need special care for them. This flag is used to distinguish such shared constructs. |
RUBY_FL_SINGLETON | This flag has something to do with an object's class. There are kind of classes called "singleton class", each of which have exactly one instance. What is interesting about singleton classes is that they are created after their instance were instantiated, like this: foo = Object.new # foo is an instance of Object...
bar = foo.singleton_class # foo is now an instance of bar.
Here as you see |
enum ruby_fl_ushift |
This is an enum because GDB wants it (rather than a macro).
People need not bother.
Enumerator | |
---|---|
RUBY_FL_USHIFT | Number of bits in ruby_fl_type that are not open to users. This is an implementation detail. Please ignore. |
|
static |
Checks if the object is flaggable.
There are some special cases (most notably RUBY_Qfalse) where appending a flag to an object is not possible. This function can detect that.
[in] | obj | Object in question |
true | It is flaggable. |
false | No it isn't. |
Definition at line 482 of file fl_type.h.
Referenced by RB_FL_REVERSE(), RB_FL_REVERSE_RAW(), RB_FL_SET(), RB_FL_SET_RAW(), RB_FL_TEST(), RB_FL_TEST_RAW(), RB_FL_UNSET(), RB_FL_UNSET_RAW(), rb_obj_freeze_inline(), RB_OBJ_FROZEN(), RB_OBJ_PROMOTED(), and RB_OBJ_PROMOTED_RAW().
Identical to RB_FL_ANY(), except it mandates all passed flags be set.
[in] | obj | Object in question. |
[in] | flags | A set of enum ruby_fl_type. |
true | The object has all of the flags set. |
false | The object lacks any of the flags. |
This is an implenentation detail of RB_FL_ALL().
3rd parties need not use this. Just always use RB_FL_ALL().
[in] | obj | Object in question. |
[in] | flags | A set of enum ruby_fl_type. |
true | The object has all of the flags set. |
false | The object lacks any of the flags. |
Identical to RB_FL_TEST(), except it returns bool.
[in] | obj | Object in question. |
[in] | flags | A set of enum ruby_fl_type. |
true | The object has any of the flags set. |
false | No it doesn't at all. |
This is an implenentation detail of RB_FL_ANY().
3rd parties need not use this. Just always use RB_FL_ANY().
[in] | obj | Object in question. |
[in] | flags | A set of enum ruby_fl_type. |
true | The object has any of the flags set. |
false | No it doesn't at all. |
Definition at line 556 of file fl_type.h.
Referenced by RARRAY_EMBED_LEN(), RARRAY_TRANSIENT_P(), rb_array_len(), RB_OBJ_PROMOTED_RAW(), ROBJECT_IVPTR(), ROBJECT_NUMIV(), and RSTRING_EMBED_LEN().
Reverses the flags.
This function is here mainly for symmetry on set/unset. Rarely used in practice.
[out] | obj | Object in question. |
[in] | flags | A set of enum ruby_fl_type. |
obj
has flags
reversed. This is an implenentation detail of RB_FL_REVERSE().
3rd parties need not use this. Just always use RB_FL_REVERSE().
[out] | obj | Object in question. |
[in] | flags | A set of enum ruby_fl_type. |
obj
has flags
cleared. Definition at line 759 of file fl_type.h.
Referenced by RB_FL_REVERSE().
Sets the given flag(s).
[out] | obj | Object in question. |
[in] | flags | A set of enum ruby_fl_type. |
obj
has flags
set. This is an implenentation detail of RB_FL_SET().
3rd parties need not use this. Just always use RB_FL_SET().
[out] | obj | Object in question. |
[in] | flags | A set of enum ruby_fl_type. |
obj
has flags
set. Definition at line 644 of file fl_type.h.
Referenced by RB_ENC_CODERANGE_SET(), RB_FL_SET(), and RB_OBJ_FREEZE_RAW().
Tests if the given flag(s) are set or not.
You can pass multiple flags at once:
[in] | obj | Object in question. |
[in] | flags | A set of enum ruby_fl_type. |
obj
's flags, masked by flags
. Definition at line 533 of file fl_type.h.
Referenced by RB_FL_ALL(), and RB_FL_ANY().
This is an implenentation detail of RB_FL_TEST().
3rd parties need not use this. Just always use RB_FL_TEST().
[in] | obj | Object in question. |
[in] | flags | A set of enum ruby_fl_type. |
obj
's flags, masked by flags
. Definition at line 507 of file fl_type.h.
Referenced by RB_ENC_CODERANGE(), RB_ENCODING_GET_INLINED(), RB_FL_ALL_RAW(), RB_FL_ANY_RAW(), RB_FL_TEST(), and RB_OBJ_FROZEN_RAW().
Clears the given flag(s).
[out] | obj | Object in question. |
[in] | flags | A set of enum ruby_fl_type. |
obj
has flags
cleard. This is an implenentation detail of RB_FL_UNSET().
3rd parties need not use this. Just always use RB_FL_UNSET().
[out] | obj | Object in question. |
[in] | flags | A set of enum ruby_fl_type. |
obj
has flags
cleared. Definition at line 704 of file fl_type.h.
Referenced by RB_ENC_CODERANGE_CLEAR(), RB_ENC_CODERANGE_SET(), and RB_FL_UNSET().
|
inlinestatic |
Prevents further modifications to the given object.
rb_eFrozenError shall be raised if modification is attempted.
[out] | x | Object in question. |
|
inlinestatic |
This is an implenentation detail of RB_OBJ_FREEZE().
3rd parties need not use this. Just always use RB_OBJ_FREEZE().
[out] | obj | Object in question. |
Definition at line 945 of file fl_type.h.
Referenced by rb_obj_freeze_inline().
|
inlinestatic |
Checks if an object is frozen.
[in] | obj | Object in question. |
true | Yes it is. |
false | No it isn't. |
Definition at line 927 of file fl_type.h.
Referenced by rb_check_frozen_inline().
This is an implenentation detail of RB_OBJ_FROZEN().
3rd parties need not use this. Just always use RB_OBJ_FROZEN().
[in] | obj | Object in question. |
RUBY_FL_FREEZE | Yes it is. |
0 | No it isn't. |
Definition at line 912 of file fl_type.h.
Referenced by RB_OBJ_FROZEN().
[in] | dst | Victim object. |
[in] | src | Infectant object. |
[in] | dst | Victim object. |
[in] | src | Infectant object. |
|
inlinestatic |
[in] | obj | Object in question. |
|
inlinestatic |
[in] | obj | Object in question. |
|
inlinestatic |
[in] | obj | Object in question. |
|
inlinestatic |
[in] | obj | Object in question. |
[in] | obj | Object in question. |