4 #include "internal/gc.h"
6 #if (SIZEOF_UINT64_T <= SIZEOF_VALUE)
8 #define SIZEOF_SHAPE_T 4
9 #define SHAPE_IN_BASIC_FLAGS 1
10 typedef uint32_t attr_index_t;
11 typedef uint32_t shape_id_t;
12 # define SHAPE_ID_NUM_BITS 32
16 #define SIZEOF_SHAPE_T 2
17 #define SHAPE_IN_BASIC_FLAGS 0
18 typedef uint16_t attr_index_t;
19 typedef uint16_t shape_id_t;
20 # define SHAPE_ID_NUM_BITS 16
24 typedef uint32_t redblack_id_t;
26 #define MAX_IVARS (attr_index_t)(-1)
28 # define SHAPE_MASK (((uintptr_t)1 << SHAPE_ID_NUM_BITS) - 1)
29 # define SHAPE_FLAG_MASK (((VALUE)-1) >> SHAPE_ID_NUM_BITS)
31 # define SHAPE_FLAG_SHIFT ((SIZEOF_VALUE * 8) - SHAPE_ID_NUM_BITS)
33 # define SHAPE_MAX_VARIATIONS 8
35 # define INVALID_SHAPE_ID SHAPE_MASK
36 # define ROOT_SHAPE_ID 0x0
38 # define SPECIAL_CONST_SHAPE_ID (ROOT_SHAPE_ID + 1)
39 # define OBJ_TOO_COMPLEX_SHAPE_ID (SPECIAL_CONST_SHAPE_ID + 1)
40 # define FIRST_T_OBJECT_SHAPE_ID (OBJ_TOO_COMPLEX_SHAPE_ID + 1)
47 attr_index_t next_iv_index;
69 SHAPE_OBJ_TOO_COMPLEX,
76 shape_id_t next_shape_id;
79 unsigned int cache_size;
84 rb_current_shape_tree(
void)
86 return rb_shape_tree_ptr;
88 #define GET_SHAPE_TREE() rb_current_shape_tree()
90 static inline shape_id_t
91 get_shape_id_from_flags(
VALUE obj)
94 return (shape_id_t)(SHAPE_MASK & ((
RBASIC(obj)->flags) >> SHAPE_FLAG_SHIFT));
98 set_shape_id_in_flags(
VALUE obj, shape_id_t shape_id)
102 RBASIC(obj)->flags &= SHAPE_FLAG_MASK;
103 RBASIC(obj)->flags |= ((
VALUE)(shape_id) << SHAPE_FLAG_SHIFT);
107 #if SHAPE_IN_BASIC_FLAGS
108 static inline shape_id_t
109 RBASIC_SHAPE_ID(
VALUE obj)
111 return get_shape_id_from_flags(obj);
115 RBASIC_SET_SHAPE_ID(
VALUE obj, shape_id_t shape_id)
117 set_shape_id_in_flags(obj, shape_id);
121 static inline shape_id_t
122 ROBJECT_SHAPE_ID(
VALUE obj)
125 return get_shape_id_from_flags(obj);
129 ROBJECT_SET_SHAPE_ID(
VALUE obj, shape_id_t shape_id)
132 set_shape_id_in_flags(obj, shape_id);
135 static inline shape_id_t
136 RCLASS_SHAPE_ID(
VALUE obj)
139 return get_shape_id_from_flags(obj);
143 RCLASS_SET_SHAPE_ID(
VALUE obj, shape_id_t shape_id)
146 set_shape_id_in_flags(obj, shape_id);
150 int32_t rb_shape_id_offset(
void);
154 RUBY_FUNC_EXPORTED
rb_shape_t *rb_shape_get_shape_by_id(shape_id_t shape_id);
155 RUBY_FUNC_EXPORTED shape_id_t rb_shape_get_shape_id(
VALUE obj);
157 bool rb_shape_get_iv_index(
rb_shape_t * shape,
ID id, attr_index_t * value);
158 bool rb_shape_get_iv_index_with_hint(shape_id_t shape_id,
ID id, attr_index_t * value, shape_id_t *shape_id_hint);
159 RUBY_FUNC_EXPORTED
bool rb_shape_obj_too_complex(
VALUE obj);
163 int rb_shape_frozen_shape_p(
rb_shape_t* shape);
171 static inline uint32_t
172 ROBJECT_IV_CAPACITY(
VALUE obj)
178 return rb_shape_get_shape_by_id(ROBJECT_SHAPE_ID(obj))->capacity;
182 ROBJECT_IV_HASH(
VALUE obj)
197 size_t rb_id_table_size(
const struct rb_id_table *tbl);
199 static inline uint32_t
200 ROBJECT_IV_COUNT(
VALUE obj)
202 if (rb_shape_obj_too_complex(obj)) {
203 return (uint32_t)rb_st_table_size(ROBJECT_IV_HASH(obj));
208 return rb_shape_get_shape_by_id(ROBJECT_SHAPE_ID(obj))->next_iv_index;
212 static inline uint32_t
213 RBASIC_IV_COUNT(
VALUE obj)
215 return rb_shape_get_shape_by_id(rb_shape_get_shape_id(obj))->next_iv_index;
220 bool rb_shape_set_shape_id(
VALUE obj, shape_id_t shape_id);
225 RUBY_SYMBOL_EXPORT_BEGIN
226 typedef void each_shape_callback(
rb_shape_t * shape,
void *data);
227 void rb_shape_each_shape(each_shape_callback callback,
void *data);
229 size_t rb_shape_edges_count(
rb_shape_t *shape);
232 RUBY_SYMBOL_EXPORT_END
#define RUBY_ASSERT(...)
Asserts that the given expression is truthy if and only if RUBY_DEBUG is truthy.
#define RUBY_EXTERN
Declaration of externally visible global variables.
#define T_MODULE
Old name of RUBY_T_MODULE.
#define T_CLASS
Old name of RUBY_T_CLASS.
VALUE type(ANYARGS)
ANYARGS-ed function type.
#define RBASIC(obj)
Convenient casting macro.
#define ROBJECT(obj)
Convenient casting macro.
static bool RB_SPECIAL_CONST_P(VALUE obj)
Checks if the given object is of enum ruby_special_consts.
uintptr_t ID
Type that represents a Ruby identifier such as a variable name.
uintptr_t VALUE
Type that represents a Ruby object.
static bool RB_TYPE_P(VALUE obj, enum ruby_value_type t)
Queries if the given object is of given type.