diff options
author | Peter Zhu <peter@peterzhu.ca> | 2022-03-14 09:44:50 -0400 |
---|---|---|
committer | Peter Zhu <peter@peterzhu.ca> | 2022-03-14 09:45:24 -0400 |
commit | 412991268fe6afb84c8044acfcdd76c215af65be (patch) | |
tree | 966e64c0049104cab5dc6672b2a5d8cd848be54b /array.c | |
parent | 45786667ec0b0c2af5bf2c2069246edaae2d7c30 (diff) | |
download | ruby-412991268fe6afb84c8044acfcdd76c215af65be.tar.gz |
Assume that refcnt of shared root is non-negative
The refcnt of a shared root array should always be non-negative.
Diffstat (limited to 'array.c')
-rw-r--r-- | array.c | 12 |
1 files changed, 5 insertions, 7 deletions
@@ -165,6 +165,7 @@ should_not_be_shared_and_embedded(VALUE ary) #define ARY_SHARED_ROOT_OCCUPIED(ary) (ARY_SHARED_ROOT_REFCNT(ary) == 1) #define ARY_SET_SHARED_ROOT_REFCNT(ary, value) do { \ assert(ARY_SHARED_ROOT_P(ary)); \ + assert((value) >= 0); \ RARRAY(ary)->as.heap.aux.capa = (value); \ } while (0) #define FL_SET_SHARED_ROOT(ary) do { \ @@ -512,10 +513,8 @@ ary_double_capa(VALUE ary, long min) static void rb_ary_decrement_share(VALUE shared_root) { - long num = ARY_SHARED_ROOT_REFCNT(shared_root) - 1; - if (num > 0) { - ARY_SET_SHARED_ROOT_REFCNT(shared_root, num); - } + long num = ARY_SHARED_ROOT_REFCNT(shared_root); + ARY_SET_SHARED_ROOT_REFCNT(shared_root, num - 1); } static void @@ -544,9 +543,8 @@ static VALUE rb_ary_increment_share(VALUE shared_root) { long num = ARY_SHARED_ROOT_REFCNT(shared_root); - if (num >= 0) { - ARY_SET_SHARED_ROOT_REFCNT(shared_root, num + 1); - } + assert(num >= 0); + ARY_SET_SHARED_ROOT_REFCNT(shared_root, num + 1); return shared_root; } |