diff options
author | Peter Zhu <peter@peterzhu.ca> | 2023-11-24 14:31:36 -0500 |
---|---|---|
committer | Peter Zhu <peter@peterzhu.ca> | 2023-11-25 09:32:36 -0500 |
commit | 564ef66e26454079188f024eb28e48a4ef1b2085 (patch) | |
tree | db61d8fcffc416c42c54cc6b583888177002809f | |
parent | f6b292b5ca8b397b00cc4e82d8ae7ede8b09f25f (diff) | |
download | ruby-564ef66e26454079188f024eb28e48a4ef1b2085.tar.gz |
Verify that duplicate shape is not created
This adds an assertion that the instance variable does not already exist
in the shape tree when creating a new shape.
-rw-r--r-- | shape.c | 9 |
1 files changed, 8 insertions, 1 deletions
@@ -654,13 +654,20 @@ rb_shape_get_next_iv_shape(rb_shape_t* shape, ID id) } rb_shape_t * -rb_shape_get_next(rb_shape_t* shape, VALUE obj, ID id) +rb_shape_get_next(rb_shape_t *shape, VALUE obj, ID id) { RUBY_ASSERT(!is_instance_id(id) || RTEST(rb_sym2str(ID2SYM(id)))); if (UNLIKELY(shape->type == SHAPE_OBJ_TOO_COMPLEX)) { return shape; } +#if RUBY_DEBUG + attr_index_t index; + if (rb_shape_get_iv_index(shape, id, &index)) { + rb_bug("rb_shape_get_next: trying to create ivar that already exists at index %u", index); + } +#endif + bool allow_new_shape = true; if (BUILTIN_TYPE(obj) == T_OBJECT) { |