summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gc.c2
-rw-r--r--object.c2
-rw-r--r--shape.c18
-rw-r--r--shape.h38
-rw-r--r--variable.c41
5 files changed, 65 insertions, 36 deletions
diff --git a/gc.c b/gc.c
index 26cf554d82..ad386893da 100644
--- a/gc.c
+++ b/gc.c
@@ -1894,7 +1894,7 @@ object_id0(VALUE obj)
{
VALUE id = Qfalse;
- if (rb_shape_has_object_id(rb_obj_shape(obj))) {
+ if (rb_shape_id_has_object_id(RBASIC_SHAPE_ID(obj))) {
shape_id_t object_id_shape_id = rb_shape_transition_object_id(obj);
id = rb_obj_field_get(obj, object_id_shape_id);
RUBY_ASSERT(id, "object_id missing");
diff --git a/object.c b/object.c
index d49ffd96d6..ffe1c74ee3 100644
--- a/object.c
+++ b/object.c
@@ -128,7 +128,7 @@ rb_class_allocate_instance(VALUE klass)
T_OBJECT | ROBJECT_EMBED | (RGENGC_WB_PROTECTED_OBJECT ? FL_WB_PROTECTED : 0), size, 0);
VALUE obj = (VALUE)o;
- RUBY_ASSERT(rb_obj_shape(obj)->type == SHAPE_ROOT);
+ RUBY_ASSERT(RSHAPE_TYPE_P(RBASIC_SHAPE_ID(obj), SHAPE_ROOT));
RBASIC_SET_SHAPE_ID(obj, rb_shape_root(rb_gc_heap_id_for_size(size)));
diff --git a/shape.c b/shape.c
index 20ff0d305b..02d23668a2 100644
--- a/shape.c
+++ b/shape.c
@@ -372,6 +372,12 @@ rb_shape_depth(shape_id_t shape_id)
return depth;
}
+static inline rb_shape_t *
+obj_shape(VALUE obj)
+{
+ return RSHAPE(rb_obj_shape_id(obj));
+}
+
static rb_shape_t *
shape_alloc(void)
{
@@ -676,7 +682,7 @@ shape_transition_too_complex(rb_shape_t *original_shape)
shape_id_t
rb_shape_transition_complex(VALUE obj)
{
- rb_shape_t *original_shape = rb_obj_shape(obj);
+ rb_shape_t *original_shape = obj_shape(obj);
return rb_shape_id(shape_transition_too_complex(original_shape));
}
@@ -695,7 +701,7 @@ rb_shape_id_has_object_id(shape_id_t shape_id)
shape_id_t
rb_shape_transition_object_id(VALUE obj)
{
- rb_shape_t* shape = rb_obj_shape(obj);
+ rb_shape_t* shape = obj_shape(obj);
RUBY_ASSERT(shape);
if (shape->flags & SHAPE_FL_HAS_OBJECT_ID) {
@@ -817,13 +823,13 @@ shape_get_next(rb_shape_t *shape, VALUE obj, ID id, bool emit_warnings)
shape_id_t
rb_shape_transition_add_ivar(VALUE obj, ID id)
{
- return rb_shape_id(shape_get_next(rb_obj_shape(obj), obj, id, true));
+ return rb_shape_id(shape_get_next(obj_shape(obj), obj, id, true));
}
shape_id_t
rb_shape_transition_add_ivar_no_warnings(VALUE obj, ID id)
{
- return rb_shape_id(shape_get_next(rb_obj_shape(obj), obj, id, false));
+ return rb_shape_id(shape_get_next(obj_shape(obj), obj, id, false));
}
// Same as rb_shape_get_iv_index, but uses a provided valid shape id and index
@@ -1085,7 +1091,7 @@ rb_shape_copy_complex_ivars(VALUE dest, VALUE obj, shape_id_t src_shape_id, st_t
RUBY_FUNC_EXPORTED bool
rb_shape_obj_too_complex_p(VALUE obj)
{
- return rb_shape_too_complex_p(rb_obj_shape(obj));
+ return rb_shape_too_complex_p(obj_shape(obj));
}
bool
@@ -1248,7 +1254,7 @@ rb_shape_parent(VALUE self)
static VALUE
rb_shape_debug_shape(VALUE self, VALUE obj)
{
- return rb_shape_t_to_rb_cShape(rb_obj_shape(obj));
+ return rb_shape_t_to_rb_cShape(obj_shape(obj));
}
static VALUE
diff --git a/shape.h b/shape.h
index 017a27ef15..9608f0775f 100644
--- a/shape.h
+++ b/shape.h
@@ -143,12 +143,6 @@ shape_id_t rb_shape_rebuild(shape_id_t initial_shape_id, shape_id_t dest_shape_i
void rb_shape_copy_fields(VALUE dest, VALUE *dest_buf, shape_id_t dest_shape_id, VALUE src, VALUE *src_buf, shape_id_t src_shape_id);
void rb_shape_copy_complex_ivars(VALUE dest, VALUE obj, shape_id_t src_shape_id, st_table *fields_table);
-static inline rb_shape_t *
-rb_obj_shape(VALUE obj)
-{
- return RSHAPE(rb_obj_shape_id(obj));
-}
-
static inline bool
rb_shape_id_canonical_p(shape_id_t shape_id)
{
@@ -161,6 +155,36 @@ rb_shape_root(size_t heap_id)
return (shape_id_t)(heap_id + FIRST_T_OBJECT_SHAPE_ID);
}
+static inline bool
+RSHAPE_TYPE_P(shape_id_t shape_id, enum shape_type type)
+{
+ return RSHAPE(shape_id)->type == type;
+}
+
+static inline attr_index_t
+RSHAPE_CAPACITY(shape_id_t shape_id)
+{
+ return RSHAPE(shape_id)->capacity;
+}
+
+static inline attr_index_t
+RSHAPE_LEN(shape_id_t shape_id)
+{
+ return RSHAPE(shape_id)->next_field_index;
+}
+
+static inline attr_index_t
+RSHAPE_INDEX(shape_id_t shape_id)
+{
+ return RSHAPE_LEN(shape_id) - 1;
+}
+
+static inline ID
+RSHAPE_EDGE_NAME(shape_id_t shape_id)
+{
+ return RSHAPE(shape_id)->edge_name;
+}
+
static inline uint32_t
ROBJECT_FIELDS_CAPACITY(VALUE obj)
{
@@ -213,7 +237,7 @@ bool rb_shape_set_shape_id(VALUE obj, shape_id_t shape_id);
static inline bool
rb_shape_obj_has_id(VALUE obj)
{
- return rb_shape_has_object_id(rb_obj_shape(obj));
+ return rb_shape_id_has_object_id(RBASIC_SHAPE_ID(obj));
}
// For ext/objspace
diff --git a/variable.c b/variable.c
index 8ee3376de6..3dcea07707 100644
--- a/variable.c
+++ b/variable.c
@@ -1660,7 +1660,7 @@ rb_obj_init_too_complex(VALUE obj, st_table *table)
// This method is meant to be called on newly allocated object.
RUBY_ASSERT(!rb_shape_obj_too_complex_p(obj));
RUBY_ASSERT(rb_shape_id_canonical_p(RBASIC_SHAPE_ID(obj)));
- RUBY_ASSERT(rb_obj_shape(obj)->next_field_index == 0);
+ RUBY_ASSERT(RSHAPE_LEN(RBASIC_SHAPE_ID(obj)) == 0);
obj_transition_too_complex(obj, table);
}
@@ -1673,8 +1673,7 @@ rb_evict_fields_to_hash(VALUE obj)
RUBY_ASSERT(!rb_shape_obj_too_complex_p(obj));
- rb_shape_t *shape = rb_obj_shape(obj);
- st_table *table = st_init_numtable_with_size(shape->next_field_index);
+ st_table *table = st_init_numtable_with_size(RSHAPE_LEN(RBASIC_SHAPE_ID(obj)));
rb_obj_copy_fields_to_hash_table(obj, table);
obj_transition_too_complex(obj, table);
@@ -1771,28 +1770,28 @@ general_field_set(VALUE obj, shape_id_t target_shape_id, VALUE val, void *data,
void (*transition_too_complex_func)(VALUE, void *),
st_table *(*too_complex_table_func)(VALUE, void *))
{
- rb_shape_t *current_shape = rb_obj_shape(obj);
+ shape_id_t current_shape_id = RBASIC_SHAPE_ID(obj);
if (UNLIKELY(rb_shape_id_too_complex_p(target_shape_id))) {
- if (UNLIKELY(!rb_shape_too_complex_p(current_shape))) {
+ if (UNLIKELY(!rb_shape_id_too_complex_p(current_shape_id))) {
transition_too_complex_func(obj, data);
}
st_table *table = too_complex_table_func(obj, data);
- if (RSHAPE(target_shape_id)->next_field_index > current_shape->next_field_index) {
+ if (RSHAPE_LEN(target_shape_id) > RSHAPE_LEN(current_shape_id)) {
set_shape_id_func(obj, target_shape_id, data);
}
- st_insert(table, (st_data_t)RSHAPE(target_shape_id)->edge_name, (st_data_t)val);
+ st_insert(table, (st_data_t)RSHAPE_EDGE_NAME(target_shape_id), (st_data_t)val);
RB_OBJ_WRITTEN(obj, Qundef, val);
}
else {
- attr_index_t index = RSHAPE(target_shape_id)->next_field_index - 1;
- if (index >= current_shape->capacity) {
- shape_resize_fields_func(obj, current_shape->capacity, RSHAPE(target_shape_id)->capacity, data);
+ attr_index_t index = RSHAPE_INDEX(target_shape_id);
+ if (index >= RSHAPE_CAPACITY(current_shape_id)) {
+ shape_resize_fields_func(obj, RSHAPE_CAPACITY(current_shape_id), RSHAPE_CAPACITY(target_shape_id), data);
}
- if (RSHAPE(target_shape_id)->next_field_index > current_shape->next_field_index) {
+ if (RSHAPE_LEN(target_shape_id) > RSHAPE_LEN(current_shape_id)) {
set_shape_id_func(obj, target_shape_id, data);
}
@@ -2257,19 +2256,18 @@ obj_fields_each(VALUE obj, rb_ivar_foreach_callback_func *func, st_data_t arg, b
.ivar_only = ivar_only,
};
- rb_shape_t *shape = rb_obj_shape(obj);
- if (rb_shape_too_complex_p(shape)) {
+ shape_id_t shape_id = RBASIC_SHAPE_ID(obj);
+ if (rb_shape_id_too_complex_p(shape_id)) {
rb_st_foreach(ROBJECT_FIELDS_HASH(obj), each_hash_iv, (st_data_t)&itr_data);
}
else {
- iterate_over_shapes_with_callback(shape, func, &itr_data);
+ iterate_over_shapes_with_callback(RSHAPE(shape_id), func, &itr_data);
}
}
static void
gen_fields_each(VALUE obj, rb_ivar_foreach_callback_func *func, st_data_t arg, bool ivar_only)
{
- rb_shape_t *shape = rb_obj_shape(obj);
struct gen_fields_tbl *fields_tbl;
if (!rb_gen_fields_tbl_get(obj, 0, &fields_tbl)) return;
@@ -2281,11 +2279,12 @@ gen_fields_each(VALUE obj, rb_ivar_foreach_callback_func *func, st_data_t arg, b
.ivar_only = ivar_only,
};
- if (rb_shape_obj_too_complex_p(obj)) {
+ shape_id_t shape_id = RBASIC_SHAPE_ID(obj);
+ if (rb_shape_id_too_complex_p(shape_id)) {
rb_st_foreach(fields_tbl->as.complex.table, each_hash_iv, (st_data_t)&itr_data);
}
else {
- iterate_over_shapes_with_callback(shape, func, &itr_data);
+ iterate_over_shapes_with_callback(RSHAPE(shape_id), func, &itr_data);
}
}
@@ -2294,7 +2293,6 @@ class_fields_each(VALUE obj, rb_ivar_foreach_callback_func *func, st_data_t arg,
{
RUBY_ASSERT(RB_TYPE_P(obj, T_CLASS) || RB_TYPE_P(obj, T_MODULE));
- rb_shape_t *shape = rb_obj_shape(obj);
struct iv_itr_data itr_data = {
.obj = obj,
.arg = arg,
@@ -2302,11 +2300,12 @@ class_fields_each(VALUE obj, rb_ivar_foreach_callback_func *func, st_data_t arg,
.ivar_only = ivar_only,
};
- if (rb_shape_obj_too_complex_p(obj)) {
+ shape_id_t shape_id = RBASIC_SHAPE_ID(obj);
+ if (rb_shape_id_too_complex_p(shape_id)) {
rb_st_foreach(RCLASS_WRITABLE_FIELDS_HASH(obj), each_hash_iv, (st_data_t)&itr_data);
}
else {
- iterate_over_shapes_with_callback(shape, func, &itr_data);
+ iterate_over_shapes_with_callback(RSHAPE(shape_id), func, &itr_data);
}
}
@@ -4738,7 +4737,7 @@ rb_fields_tbl_copy(VALUE dst, VALUE src)
RUBY_ASSERT(rb_type(dst) == rb_type(src));
RUBY_ASSERT(RB_TYPE_P(dst, T_CLASS) || RB_TYPE_P(dst, T_MODULE));
- RUBY_ASSERT(rb_obj_shape(dst)->type == SHAPE_ROOT);
+ RUBY_ASSERT(RSHAPE_TYPE_P(RBASIC_SHAPE_ID(dst), SHAPE_ROOT));
RUBY_ASSERT(!RCLASS_PRIME_FIELDS(dst));
rb_ivar_foreach(src, tbl_copy_i, dst);