summaryrefslogtreecommitdiff
path: root/array.c
diff options
context:
space:
mode:
authorPeter Zhu <peter@peterzhu.ca>2022-03-14 09:44:50 -0400
committerPeter Zhu <peter@peterzhu.ca>2022-03-14 09:45:24 -0400
commit412991268fe6afb84c8044acfcdd76c215af65be (patch)
tree966e64c0049104cab5dc6672b2a5d8cd848be54b /array.c
parent45786667ec0b0c2af5bf2c2069246edaae2d7c30 (diff)
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.c12
1 files changed, 5 insertions, 7 deletions
diff --git a/array.c b/array.c
index 53e69f2a32..f47c1509ad 100644
--- a/array.c
+++ b/array.c
@@ -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;
}