4#include "internal/gc.h"
6#if (SIZEOF_UINT64_T == SIZEOF_VALUE)
7#define SIZEOF_SHAPE_T 4
8#define SHAPE_IN_BASIC_FLAGS 1
9typedef uint32_t attr_index_t;
11#define SIZEOF_SHAPE_T 2
12#define SHAPE_IN_BASIC_FLAGS 0
13typedef uint16_t attr_index_t;
16#define MAX_IVARS (attr_index_t)(-1)
18#if SIZEOF_SHAPE_T == 4
19typedef uint32_t shape_id_t;
20# define SHAPE_ID_NUM_BITS 32
22typedef uint16_t shape_id_t;
23# define SHAPE_ID_NUM_BITS 16
26# define SHAPE_MASK (((uintptr_t)1 << SHAPE_ID_NUM_BITS) - 1)
27# define SHAPE_FLAG_MASK (((VALUE)-1) >> SHAPE_ID_NUM_BITS)
29# define SHAPE_FLAG_SHIFT ((SIZEOF_VALUE * 8) - SHAPE_ID_NUM_BITS)
31# define SHAPE_BITMAP_SIZE 16384
33# define SHAPE_MAX_VARIATIONS 8
35# define MAX_SHAPE_ID (SHAPE_MASK - 1)
36# define INVALID_SHAPE_ID SHAPE_MASK
37# define ROOT_SHAPE_ID 0x0
39# define SPECIAL_CONST_SHAPE_ID (SIZE_POOL_COUNT * 2)
40# define OBJ_TOO_COMPLEX_SHAPE_ID (SPECIAL_CONST_SHAPE_ID + 1)
45 attr_index_t next_iv_index;
48 uint8_t size_pool_index;
58 SHAPE_CAPACITY_CHANGE,
59 SHAPE_INITIAL_CAPACITY,
61 SHAPE_OBJ_TOO_COMPLEX,
64#if SHAPE_IN_BASIC_FLAGS
65static inline shape_id_t
66RBASIC_SHAPE_ID(
VALUE obj)
69 return (shape_id_t)(SHAPE_MASK & ((
RBASIC(obj)->flags) >> SHAPE_FLAG_SHIFT));
73RBASIC_SET_SHAPE_ID(
VALUE obj, shape_id_t shape_id)
77 RBASIC(obj)->flags &= SHAPE_FLAG_MASK;
78 RBASIC(obj)->flags |= ((
VALUE)(shape_id) << SHAPE_FLAG_SHIFT);
81static inline shape_id_t
82ROBJECT_SHAPE_ID(
VALUE obj)
85 return RBASIC_SHAPE_ID(obj);
89ROBJECT_SET_SHAPE_ID(
VALUE obj, shape_id_t shape_id)
92 RBASIC_SET_SHAPE_ID(obj, shape_id);
95static inline shape_id_t
96RCLASS_SHAPE_ID(
VALUE obj)
99 return RBASIC_SHAPE_ID(obj);
104static inline shape_id_t
105ROBJECT_SHAPE_ID(
VALUE obj)
108 return (shape_id_t)(SHAPE_MASK & (
RBASIC(obj)->flags >> SHAPE_FLAG_SHIFT));
112ROBJECT_SET_SHAPE_ID(
VALUE obj, shape_id_t shape_id)
114 RBASIC(obj)->flags &= SHAPE_FLAG_MASK;
115 RBASIC(obj)->flags |= ((
VALUE)(shape_id) << SHAPE_FLAG_SHIFT);
118MJIT_SYMBOL_EXPORT_BEGIN
119shape_id_t rb_rclass_shape_id(
VALUE obj);
120MJIT_SYMBOL_EXPORT_END
122static inline shape_id_t RCLASS_SHAPE_ID(
VALUE obj)
124 return rb_rclass_shape_id(obj);
131uint8_t rb_shape_id_num_bits(
void);
132int32_t rb_shape_id_offset(
void);
134rb_shape_t* rb_shape_get_shape_by_id_without_assertion(shape_id_t shape_id);
137MJIT_SYMBOL_EXPORT_BEGIN
138rb_shape_t* rb_shape_get_shape_by_id(shape_id_t shape_id);
139shape_id_t rb_shape_get_shape_id(
VALUE obj);
141bool rb_shape_get_iv_index(
rb_shape_t * shape,
ID id, attr_index_t * value);
142bool rb_shape_obj_too_complex(
VALUE obj);
143MJIT_SYMBOL_EXPORT_END
147int rb_shape_frozen_shape_p(
rb_shape_t* shape);
148void rb_shape_transition_shape_frozen(
VALUE obj);
155static inline uint32_t
156ROBJECT_IV_CAPACITY(
VALUE obj)
161 RUBY_ASSERT(ROBJECT_SHAPE_ID(obj) != OBJ_TOO_COMPLEX_SHAPE_ID);
162 return rb_shape_get_shape_by_id(ROBJECT_SHAPE_ID(obj))->capacity;
166ROBJECT_IV_HASH(
VALUE obj)
169 RUBY_ASSERT(ROBJECT_SHAPE_ID(obj) == OBJ_TOO_COMPLEX_SHAPE_ID);
177 RUBY_ASSERT(ROBJECT_SHAPE_ID(obj) == OBJ_TOO_COMPLEX_SHAPE_ID);
181size_t rb_id_table_size(
const struct rb_id_table *tbl);
183static inline uint32_t
184ROBJECT_IV_COUNT(
VALUE obj)
186 if (ROBJECT_SHAPE_ID(obj) == OBJ_TOO_COMPLEX_SHAPE_ID) {
187 return (uint32_t)rb_id_table_size(ROBJECT_IV_HASH(obj));
191 RUBY_ASSERT(ROBJECT_SHAPE_ID(obj) != OBJ_TOO_COMPLEX_SHAPE_ID);
192 return rb_shape_get_shape_by_id(ROBJECT_SHAPE_ID(obj))->next_iv_index;
196static inline uint32_t
197RBASIC_IV_COUNT(
VALUE obj)
199 return rb_shape_get_shape_by_id(rb_shape_get_shape_id(obj))->next_iv_index;
202static inline uint32_t
203RCLASS_IV_COUNT(
VALUE obj)
206 uint32_t ivc = rb_shape_get_shape_by_id(RCLASS_SHAPE_ID(obj))->next_iv_index;
211rb_shape_t * rb_shape_alloc_with_size_pool_index(
ID edge_name,
rb_shape_t * parent, uint8_t size_pool_index);
212rb_shape_t * rb_shape_alloc_with_parent_id(
ID edge_name, shape_id_t parent_id);
216bool rb_shape_set_shape_id(
VALUE obj, shape_id_t shape_id);
219VALUE rb_shape_flags_mask(
void);
220void rb_shape_set_too_complex(
VALUE obj);
223RUBY_SYMBOL_EXPORT_BEGIN
224typedef void each_shape_callback(
rb_shape_t * shape,
void *data);
225void rb_shape_each_shape(each_shape_callback callback,
void *data);
227size_t rb_shape_edges_count(
rb_shape_t *shape);
230RUBY_SYMBOL_EXPORT_END
#define RUBY_ASSERT(expr)
Asserts that the given expression is truthy if and only if RUBY_DEBUG is truthy.
#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.
uintptr_t VALUE
Type that represents a Ruby object.
uintptr_t ID
Type that represents a Ruby identifier such as a variable name.