diff options
author | Jean Boussier <[email protected]> | 2025-04-21 16:16:07 +0900 |
---|---|---|
committer | Jean Boussier <[email protected]> | 2025-05-08 07:58:05 +0200 |
commit | f48e45d1e9c4412d5f3ee49241d0b9359651ce7c () | |
tree | 88e53f6ef5e926b87f6ab620ca6ff23bf15380f3 /shape.h | |
parent | d34c15054708c84e9d3305ede0752820b42ac498 (diff) |
Move `object_id` in object fields.
And get rid of the `obj_to_id_tbl` It's no longer needed, the `object_id` is now stored inline in the object alongside instance variables. We still need the inverse table in case `_id2ref` is invoked, but we lazily build it by walking the heap if that happens. The `object_id` concern is also no longer a GC implementation concern, but a generic implementation. Co-Authored-By: Matt Valentine-House <[email protected]>
Notes: Merged: https://.com/ruby/ruby/pull/13159
-rw-r--r-- | shape.h | 20 |
1 files changed, 16 insertions, 4 deletions
@@ -33,11 +33,13 @@ typedef uint32_t redblack_id_t; # define SHAPE_MAX_VARIATIONS 8 # define INVALID_SHAPE_ID SHAPE_MASK -# define ROOT_SHAPE_ID 0x0 -# define SPECIAL_CONST_SHAPE_ID (ROOT_SHAPE_ID + 1) -# define OBJ_TOO_COMPLEX_SHAPE_ID (SPECIAL_CONST_SHAPE_ID + 1) -# define FIRST_T_OBJECT_SHAPE_ID (OBJ_TOO_COMPLEX_SHAPE_ID + 1) typedef struct redblack_node redblack_node_t; @@ -65,6 +67,7 @@ struct redblack_node { enum shape_type { SHAPE_ROOT, SHAPE_IVAR, SHAPE_FROZEN, SHAPE_T_OBJECT, SHAPE_OBJ_TOO_COMPLEX, @@ -169,6 +172,9 @@ rb_shape_t *rb_shape_transition_shape_too_complex(VALUE obj); bool rb_shape_transition_shape_remove_ivar(VALUE obj, ID id, rb_shape_t *shape, VALUE *removed); rb_shape_t *rb_shape_get_next(rb_shape_t *shape, VALUE obj, ID id); rb_shape_t *rb_shape_get_next_no_warnings(rb_shape_t *shape, VALUE obj, ID id); rb_shape_t *rb_shape_rebuild_shape(rb_shape_t *initial_shape, rb_shape_t *dest_shape); @@ -229,6 +235,12 @@ rb_shape_t *rb_shape_traverse_from_new_root(rb_shape_t *initial_shape, rb_shape_ bool rb_shape_set_shape_id(VALUE obj, shape_id_t shape_id); VALUE rb_obj_debug_shape(VALUE self, VALUE obj); // For ext/objspace |