diff options
author | Peter Zhu <peter@peterzhu.ca> | 2023-10-31 17:04:40 -0400 |
---|---|---|
committer | Peter Zhu <peter@peterzhu.ca> | 2023-10-31 17:04:40 -0400 |
commit | c3b7f275613507334fc4dcbfde0491ddaa786323 (patch) | |
tree | c73f4055cb445bf7bbba0875fada1ebefcea6799 /variable.c | |
parent | 60e207b47f377b04d11df9a9dbb0548a578c2776 (diff) |
Fix remove_instance_variable for too complex generic ivar
Diffstat (limited to 'variable.c')
-rw-r--r-- | variable.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/variable.c b/variable.c index a374756974..1e44775887 100644 --- a/variable.c +++ b/variable.c @@ -2217,7 +2217,15 @@ rb_obj_remove_instance_variable(VALUE obj, VALUE name) break; } default: { - rb_shape_transition_shape_remove_ivar(obj, id, shape, &val); + if (rb_shape_obj_too_complex(obj)) { + struct gen_ivtbl *ivtbl; + if (rb_gen_ivtbl_get(obj, 0, &ivtbl)) { + st_delete(ivtbl->as.complex.table, (st_data_t *)&id, (st_data_t *)&val); + } + } + else { + rb_shape_transition_shape_remove_ivar(obj, id, shape, &val); + } break; } } |