diff options
author | Aaron Patterson <[email protected]> | 2023-10-30 09:50:56 -0700 |
---|---|---|
committer | Peter Zhu <[email protected]> | 2023-10-31 12:07:54 -0400 |
commit | 6f5e378057a02dadbb0173072f69c8a3f30f5649 () | |
tree | e42c9b35637d13aa12ca329ef58fb375a21dd473 /variable.c | |
parent | ac7f913ca3af970225c9cc93b92eb5c403894180 (diff) |
Fix "too complex" iv sets on generic ivar objects
We weren't taking in to account that objects with generic IV tables could go "too complex" in the IV set code. This commit takes that in to account and also ensures FL_EXIVAR is set when a geniv object transitions to "too complex" Co-Authored-By: Jean Boussier <[email protected]>
-rw-r--r-- | variable.c | 6 |
1 files changed, 6 insertions, 0 deletions
@@ -1483,6 +1483,11 @@ generic_ivar_set(VALUE obj, ID id, VALUE val) attr_index_t index; // The returned shape will have `id` in its iv_table rb_shape_t *shape = rb_shape_get_shape(obj); if (UNLIKELY(shape->type == SHAPE_OBJ_TOO_COMPLEX)) { rb_complex_ivar_set(obj, id, val); @@ -1498,6 +1503,7 @@ generic_ivar_set(VALUE obj, ID id, VALUE val) rb_evict_ivars_to_hash(obj, shape); rb_complex_ivar_set(obj, id, val); rb_shape_set_shape(obj, next_shape); return; } shape = next_shape; |