summaryrefslogtreecommitdiff
path: root/shape.h
diff options
context:
space:
mode:
authorJohn Hawthorn <john@hawthorn.email>2025-05-14 11:06:46 -0700
committerJean Boussier <jean.boussier@gmail.com>2025-05-26 10:31:54 +0200
commitf483befd9065d159d3a944b87fe26179c5373c30 (patch)
treef1a5c935f88b726b1bd79c71dd53417c08118651 /shape.h
parent2295384a5a89cd4acfbec27b19a671bd5301a757 (diff)
Add shape_id to RBasic under 32 bit
This makes `RBobject` `4B` larger on 32 bit systems but simplifies the implementation a lot. [Feature #21353] Co-authored-by: Jean Boussier <byroot@ruby-lang.org>
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/13341
Diffstat (limited to 'shape.h')
-rw-r--r--shape.h61
1 files changed, 11 insertions, 50 deletions
diff --git a/shape.h b/shape.h
index ed28f1c80b..0acb4a5f70 100644
--- a/shape.h
+++ b/shape.h
@@ -6,7 +6,6 @@
#if (SIZEOF_UINT64_T <= SIZEOF_VALUE)
#define SIZEOF_SHAPE_T 4
-#define SHAPE_IN_BASIC_FLAGS 1
typedef uint32_t attr_index_t;
typedef uint32_t shape_id_t;
# define SHAPE_ID_NUM_BITS 32
@@ -14,7 +13,6 @@ typedef uint32_t shape_id_t;
#else
#define SIZEOF_SHAPE_T 2
-#define SHAPE_IN_BASIC_FLAGS 0
typedef uint16_t attr_index_t;
typedef uint16_t shape_id_t;
# define SHAPE_ID_NUM_BITS 16
@@ -91,65 +89,30 @@ rb_current_shape_tree(void)
#define GET_SHAPE_TREE() rb_current_shape_tree()
static inline shape_id_t
-get_shape_id_from_flags(VALUE obj)
+RBASIC_SHAPE_ID(VALUE obj)
{
RUBY_ASSERT(!RB_SPECIAL_CONST_P(obj));
RUBY_ASSERT(!RB_TYPE_P(obj, T_IMEMO));
+#if RBASIC_SHAPE_ID_FIELD
+ return (shape_id_t)((RBASIC(obj)->shape_id));
+#else
return (shape_id_t)((RBASIC(obj)->flags) >> SHAPE_FLAG_SHIFT);
+#endif
}
static inline void
-set_shape_id_in_flags(VALUE obj, shape_id_t shape_id)
+RBASIC_SET_SHAPE_ID(VALUE obj, shape_id_t shape_id)
{
RUBY_ASSERT(!RB_SPECIAL_CONST_P(obj));
RUBY_ASSERT(!RB_TYPE_P(obj, T_IMEMO));
+#if RBASIC_SHAPE_ID_FIELD
+ RBASIC(obj)->shape_id = (VALUE)shape_id;
+#else
// Ractors are occupying the upper 32 bits of flags, but only in debug mode
// Object shapes are occupying top bits
RBASIC(obj)->flags &= SHAPE_FLAG_MASK;
RBASIC(obj)->flags |= ((VALUE)(shape_id) << SHAPE_FLAG_SHIFT);
-}
-
-
-#if SHAPE_IN_BASIC_FLAGS
-static inline shape_id_t
-RBASIC_SHAPE_ID(VALUE obj)
-{
- return get_shape_id_from_flags(obj);
-}
-
-static inline void
-RBASIC_SET_SHAPE_ID(VALUE obj, shape_id_t shape_id)
-{
- set_shape_id_in_flags(obj, shape_id);
-}
#endif
-
-static inline shape_id_t
-ROBJECT_SHAPE_ID(VALUE obj)
-{
- RBIMPL_ASSERT_TYPE(obj, RUBY_T_OBJECT);
- return get_shape_id_from_flags(obj);
-}
-
-static inline void
-ROBJECT_SET_SHAPE_ID(VALUE obj, shape_id_t shape_id)
-{
- RBIMPL_ASSERT_TYPE(obj, RUBY_T_OBJECT);
- set_shape_id_in_flags(obj, shape_id);
-}
-
-static inline shape_id_t
-RCLASS_SHAPE_ID(VALUE obj)
-{
- RUBY_ASSERT(RB_TYPE_P(obj, T_CLASS) || RB_TYPE_P(obj, T_MODULE));
- return get_shape_id_from_flags(obj);
-}
-
-static inline void
-RCLASS_SET_SHAPE_ID(VALUE obj, shape_id_t shape_id)
-{
- RUBY_ASSERT(RB_TYPE_P(obj, T_CLASS) || RB_TYPE_P(obj, T_MODULE));
- set_shape_id_in_flags(obj, shape_id);
}
#define RSHAPE rb_shape_lookup
@@ -203,7 +166,7 @@ ROBJECT_FIELDS_CAPACITY(VALUE obj)
// Asking for capacity doesn't make sense when the object is using
// a hash table for storing instance variables
RUBY_ASSERT(!rb_shape_obj_too_complex_p(obj));
- return RSHAPE(ROBJECT_SHAPE_ID(obj))->capacity;
+ return RSHAPE(RBASIC_SHAPE_ID(obj))->capacity;
}
static inline st_table *
@@ -222,8 +185,6 @@ ROBJECT_SET_FIELDS_HASH(VALUE obj, const st_table *tbl)
ROBJECT(obj)->as.heap.fields = (VALUE *)tbl;
}
-size_t rb_id_table_size(const struct rb_id_table *tbl);
-
static inline uint32_t
ROBJECT_FIELDS_COUNT(VALUE obj)
{
@@ -233,7 +194,7 @@ ROBJECT_FIELDS_COUNT(VALUE obj)
else {
RBIMPL_ASSERT_TYPE(obj, RUBY_T_OBJECT);
RUBY_ASSERT(!rb_shape_obj_too_complex_p(obj));
- return RSHAPE(ROBJECT_SHAPE_ID(obj))->next_field_index;
+ return RSHAPE(RBASIC_SHAPE_ID(obj))->next_field_index;
}
}