summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJemma Issroff <jemmaissroff@gmail.com>2022-12-09 13:33:48 -0500
committerJean Boussier <jean.boussier@gmail.com>2022-12-10 16:10:21 +0100
commit12003acbb9c2c2624be8c41c22c15e6d1fa3a42e (patch)
treefa03a97a6c1069e7cf760b7b4f320bec96a0d82e
parent0645c8b3c1f7448d88c6fe6a4ebbd7b3a091c042 (diff)
downloadruby-12003acbb9c2c2624be8c41c22c15e6d1fa3a42e.tar.gz
Update shape capacity when removing ivar and rewriting shape transitions
Since edc7af48acd12666a2945f30901d16b62a39f474, we now no longer have undef ivar transitions. Instead, we rebuild the shapes table. When we do this, we need to ensure that we retain our capacities on shapes.
-rw-r--r--shape.c3
-rw-r--r--vm_insnhelper.c2
2 files changed, 2 insertions, 3 deletions
diff --git a/shape.c b/shape.c
index 41d3cfcf84..8a7c780e47 100644
--- a/shape.c
+++ b/shape.c
@@ -242,9 +242,10 @@ remove_shape_recursive(VALUE obj, ID id, rb_shape_t * shape, VALUE * removed)
// has the same attributes as this shape.
if (new_parent) {
rb_shape_t * new_child = get_next_shape_internal(new_parent, shape->edge_name, shape->type);
+ new_child->capacity = shape->capacity;
+
if (new_child->type == SHAPE_IVAR) {
move_iv(obj, id, shape->next_iv_index - 1, new_child->next_iv_index - 1);
-
}
return new_child;
diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index 1eed081fea..c397110ae5 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -1422,8 +1422,6 @@ vm_setivar(VALUE obj, ID id, VALUE val, shape_id_t dest_shape_id, attr_index_t i
rb_shape_t *dest_shape = rb_shape_get_shape_by_id(dest_shape_id);
shape_id_t source_shape_id = dest_shape->parent_id;
- RUBY_ASSERT(dest_shape->type == SHAPE_IVAR);
-
if (shape_id == source_shape_id && dest_shape->edge_name == id) {
RUBY_ASSERT(dest_shape_id != INVALID_SHAPE_ID && shape_id != INVALID_SHAPE_ID);