31 #define ARY_DEFAULT_SIZE 16
32 #define ARY_MAX_SIZE (LONG_MAX / (int)sizeof(VALUE))
72 if (argc > (
int)(128/
sizeof(
VALUE)) ) {
81 for (i=0; i<
argc; i++) {
98 # define ARY_SHARED_P(ary) \
99 (assert(!FL_TEST((ary), ELTS_SHARED) || !FL_TEST((ary), RARRAY_EMBED_FLAG)), \
100 FL_TEST((ary),ELTS_SHARED)!=0)
101 # define ARY_EMBED_P(ary) \
102 (assert(!FL_TEST((ary), ELTS_SHARED) || !FL_TEST((ary), RARRAY_EMBED_FLAG)), \
103 FL_TEST((ary), RARRAY_EMBED_FLAG)!=0)
105 #define ARY_HEAP_PTR(a) (assert(!ARY_EMBED_P(a)), RARRAY(a)->as.heap.ptr)
106 #define ARY_HEAP_LEN(a) (assert(!ARY_EMBED_P(a)), RARRAY(a)->as.heap.len)
107 #define ARY_EMBED_PTR(a) (assert(ARY_EMBED_P(a)), RARRAY(a)->as.ary)
108 #define ARY_EMBED_LEN(a) \
109 (assert(ARY_EMBED_P(a)), \
110 (long)((RBASIC(a)->flags >> RARRAY_EMBED_LEN_SHIFT) & \
111 (RARRAY_EMBED_LEN_MASK >> RARRAY_EMBED_LEN_SHIFT)))
112 #define ARY_HEAP_SIZE(a) (assert(!ARY_EMBED_P(a)), assert(ARY_OWNS_HEAP_P(a)), RARRAY(a)->as.heap.aux.capa * sizeof(VALUE))
114 #define ARY_OWNS_HEAP_P(a) (!FL_TEST((a), ELTS_SHARED|RARRAY_EMBED_FLAG))
115 #define FL_SET_EMBED(a) do { \
116 assert(!ARY_SHARED_P(a)); \
117 FL_SET((a), RARRAY_EMBED_FLAG); \
119 #define FL_UNSET_EMBED(ary) FL_UNSET((ary), RARRAY_EMBED_FLAG|RARRAY_EMBED_LEN_MASK)
120 #define FL_SET_SHARED(ary) do { \
121 assert(!ARY_EMBED_P(ary)); \
122 FL_SET((ary), ELTS_SHARED); \
124 #define FL_UNSET_SHARED(ary) FL_UNSET((ary), ELTS_SHARED)
126 #define ARY_SET_PTR(ary, p) do { \
127 assert(!ARY_EMBED_P(ary)); \
128 assert(!OBJ_FROZEN(ary)); \
129 RARRAY(ary)->as.heap.ptr = (p); \
131 #define ARY_SET_EMBED_LEN(ary, n) do { \
133 assert(ARY_EMBED_P(ary)); \
134 assert(!OBJ_FROZEN(ary)); \
135 RBASIC(ary)->flags &= ~RARRAY_EMBED_LEN_MASK; \
136 RBASIC(ary)->flags |= (tmp_n) << RARRAY_EMBED_LEN_SHIFT; \
138 #define ARY_SET_HEAP_LEN(ary, n) do { \
139 assert(!ARY_EMBED_P(ary)); \
140 RARRAY(ary)->as.heap.len = (n); \
142 #define ARY_SET_LEN(ary, n) do { \
143 if (ARY_EMBED_P(ary)) { \
144 ARY_SET_EMBED_LEN((ary), (n)); \
147 ARY_SET_HEAP_LEN((ary), (n)); \
149 assert(RARRAY_LEN(ary) == (n)); \
151 #define ARY_INCREASE_PTR(ary, n) do { \
152 assert(!ARY_EMBED_P(ary)); \
153 assert(!OBJ_FROZEN(ary)); \
154 RARRAY(ary)->as.heap.ptr += (n); \
156 #define ARY_INCREASE_LEN(ary, n) do { \
157 assert(!OBJ_FROZEN(ary)); \
158 if (ARY_EMBED_P(ary)) { \
159 ARY_SET_EMBED_LEN((ary), RARRAY_LEN(ary)+(n)); \
162 RARRAY(ary)->as.heap.len += (n); \
166 #define ARY_CAPA(ary) (ARY_EMBED_P(ary) ? RARRAY_EMBED_LEN_MAX : \
167 ARY_SHARED_ROOT_P(ary) ? RARRAY_LEN(ary) : RARRAY(ary)->as.heap.aux.capa)
168 #define ARY_SET_CAPA(ary, n) do { \
169 assert(!ARY_EMBED_P(ary)); \
170 assert(!ARY_SHARED_P(ary)); \
171 assert(!OBJ_FROZEN(ary)); \
172 RARRAY(ary)->as.heap.aux.capa = (n); \
175 #define ARY_SHARED(ary) (assert(ARY_SHARED_P(ary)), RARRAY(ary)->as.heap.aux.shared)
176 #define ARY_SET_SHARED(ary, value) do { \
177 const VALUE _ary_ = (ary); \
178 const VALUE _value_ = (value); \
179 assert(!ARY_EMBED_P(_ary_)); \
180 assert(ARY_SHARED_P(_ary_)); \
181 assert(ARY_SHARED_ROOT_P(_value_)); \
182 RB_OBJ_WRITE(_ary_, &RARRAY(_ary_)->as.heap.aux.shared, _value_); \
184 #define RARRAY_SHARED_ROOT_FLAG FL_USER5
185 #define ARY_SHARED_ROOT_P(ary) (FL_TEST((ary), RARRAY_SHARED_ROOT_FLAG))
186 #define ARY_SHARED_NUM(ary) \
187 (assert(ARY_SHARED_ROOT_P(ary)), RARRAY(ary)->as.heap.aux.capa)
188 #define ARY_SHARED_OCCUPIED(ary) (ARY_SHARED_NUM(ary) == 1)
189 #define ARY_SET_SHARED_NUM(ary, value) do { \
190 assert(ARY_SHARED_ROOT_P(ary)); \
191 RARRAY(ary)->as.heap.aux.capa = (value); \
193 #define FL_SET_SHARED_ROOT(ary) do { \
194 assert(!ARY_EMBED_P(ary)); \
195 FL_SET((ary), RARRAY_SHARED_ROOT_FLAG); \
223 if (len > capacity) len = capacity;
236 long old_capa =
RARRAY(ary)->as.heap.aux.capa;
238 assert(old_capa >= capacity);
239 if (old_capa > capacity)
371 if (new_len > capa - (capa >> 6)) {
381 if (new_len > capa) {
429 RARRAY(ary1)->as.heap.aux.shared ==
RARRAY(ary2)->as.heap.aux.shared &&
430 RARRAY(ary1)->as.heap.len ==
RARRAY(ary2)->as.heap.len) {
510 for (i=0; i<n; i++) {
551 return RARRAY(ary)->as.heap.aux.capa *
sizeof(
VALUE);
595 return (
VALUE)shared;
755 rb_warn(
"block supersedes default value argument");
757 for (i=0; i<len; i++) {
781 if (argc > 0 && argv) {
945 if (n == 0)
return Qnil;
997 if (len == 0)
return Qnil;
1077 long new_len = len +
argc;
1087 goto makeroom_if_need;
1093 if (capa - (capa >> 6) <= new_len) {
1106 if (head - sharedp < argc) {
1109 room = capa - new_len;
1112 head = sharedp + argc + room;
1163 if (len == 0)
return Qnil;
1164 if (offset < 0 || len <= offset) {
1185 if (beg > alen)
return Qnil;
1186 if (beg < 0 || len < 0)
return Qnil;
1188 if (alen < len || alen < beg + len) {
1192 if (len == 0)
return ary_new(klass, 0);
1333 if (len == 0)
return Qnil;
1373 if (block_given && argc == 2) {
1374 rb_warn(
"block supersedes default value argument");
1382 if (block_given)
return rb_yield(pos);
1437 rb_warn(
"given block not used");
1440 for (i=0; i<len; i++) {
1501 rb_warn(
"given block not used");
1526 if (!
NIL_P(tmp))
return tmp;
1545 if (olen < len || olen < beg + len) {
1573 alen = olen + rlen - len;
1580 MEMMOVE(ptr + beg + rlen, ptr + beg + len,
1581 VALUE, olen - (beg + len)));
1599 if (len > (capa = (
long)
ARY_CAPA(ary))) {
1600 rb_bug(
"probable buffer overflow: %ld for %ld", len, capa);
1620 if (len == olen)
return ary;
1689 long offset, beg, len;
1737 if (argc == 1)
return ary;
1780 volatile VALUE ary = array;
1913 int *first = (
int *)arg[3];
1931 for (i=0; i<
max; i++) {
1933 if (i > 0 && !
NIL_P(sep))
1946 if (i > 0 && !
NIL_P(sep))
1967 args[3] = (
VALUE)first;
2011 if (
NIL_P(tmp) || tmp != val) {
2018 ary_join_1(ary, ary, sep, i, result, &first);
2027 ary_join_0(ary, sep, RARRAY_LEN(ary), result);
2138 if (
NIL_P(key_value_pair)) {
2142 if (RARRAY_LEN(key_value_pair) != 2) {
2144 i, RARRAY_LEN(key_value_pair));
2226 do *p2-- = *p1++;
while (--len > 0);
2235 return (cnt < 0) ? (len - (~cnt % len) - 1) : (cnt % len);
2345 #define STRING_P(s) (RB_TYPE_P((s), T_STRING) && CLASS_OF(s) == rb_cString)
2347 #define SORT_OPTIMIZABLE_BIT(type) (1U << TOKEN_PASTE(sort_opt_,type))
2348 #define SORT_OPTIMIZABLE(data, type) \
2349 (((data)->opt_inited & SORT_OPTIMIZABLE_BIT(type)) ? \
2350 ((data)->opt_methods & SORT_OPTIMIZABLE_BIT(type)) : \
2351 (((data)->opt_inited |= SORT_OPTIMIZABLE_BIT(type)), \
2352 rb_method_basic_definition_p(TOKEN_PASTE(rb_c,type), id_cmp) && \
2353 ((data)->opt_methods |= SORT_OPTIMIZABLE_BIT(type))))
2358 if (
RBASIC(ary)->klass) {
2387 if ((
long)a > (long)b)
return 1;
2388 if ((
long)a < (long)b)
return -1;
2570 int smaller = 0, satisfied = 0;
2574 while (low < high) {
2575 mid = low + ((high - low) / 2);
2579 if (
FIX2INT(v) == 0)
return val;
2582 else if (v ==
Qtrue) {
2593 case 1: smaller = 1;
break;
2594 case -1: smaller = 0;
2599 " (must be numeric, true, false or nil)",
2610 if (!satisfied)
return Qnil;
2720 long beg, len, i, j;
2722 for (i=0; i<
argc; i++) {
2729 long end = olen < beg+len ? olen : beg+len;
2730 for (j = beg; j < end; j++) {
2824 for (i1 = i2 = 0; i1 <
RARRAY_LEN(ary); i1++) {
2833 if (i1 == i2)
return Qnil;
2902 for (i1 = i2 = 0; i1 <
RARRAY_LEN(ary); i1++) {
2914 if (RARRAY_LEN(ary) == i2) {
2931 for (i1 = i2 = 0; i1 <
RARRAY_LEN(ary); i1++) {
2942 if (RARRAY_LEN(ary) == i2) {
2955 if (pos >= len)
return Qnil;
2958 if (pos < 0)
return Qnil;
3017 long pos, len, orig_len;
3024 if (len < 0)
return Qnil;
3028 if (pos < 0)
return Qnil;
3030 else if (orig_len < pos)
return Qnil;
3031 if (orig_len < pos + len) {
3032 len = orig_len - pos;
3051 goto delete_pos_len;
3142 return rejected_ary;
3228 for (i=0; i<
argc; i++) {
3235 if (arity > 1 && argc+1 < 0x100) {
3240 for (j=0; j<
argc; j++) {
3251 for (j=0; j<
argc; j++) {
3261 for (i=0; i<len; i++) {
3265 for (j=0; j<
argc; j++) {
3291 long elen = -1, alen, i, j;
3296 for (i=0; i<alen; i++) {
3301 for (j=0; j<elen; j++) {
3309 for (j=0; j<elen; j++) {
3334 if (copy == orig)
return copy;
3429 VALUE item, arg1, arg2;
3430 long beg = 0, end = 0, len = 0;
3431 int block_p =
FALSE;
3455 if (beg < 0) beg = 0;
3480 for (i=beg; i<end; i++) {
3512 long len, xlen, ylen;
3601 while (t <= len/2) {
3643 if (!
NIL_P(v) && RARRAY_LEN(v) > 0 &&
3677 RARRAY_LEN(v) > 1 &&
3688 const VALUE *p1, *p2;
3690 if (recur)
return Qtrue;
3696 for (i = 0; i < len1; i++) {
3734 if (ary1 == ary2)
return Qtrue;
3751 if (recur)
return Qtrue;
3770 if (ary1 == ary2)
return Qtrue;
3835 if (recur)
return Qundef;
3840 for (i=0; i<len; i++) {
3883 if (ary1 == ary2)
return INT2FIX(0);
3885 if (v !=
Qundef)
return v;
3887 if (len == 0)
return INT2FIX(0);
3888 if (len > 0)
return INT2FIX(1);
3946 if (
RHASH(hash)->ntbl) {
3948 RHASH(hash)->ntbl = 0;
4035 *key = *value = (
VALUE)arg;
4203 if (RARRAY_LEN(ary) == n) {
4271 rb_warn(
"given block not used");
4299 if (
RBASIC(result)->klass) {
4416 #define OPTHASH_GIVEN_P(opts) \
4417 (argc > 0 && !NIL_P((opts) = rb_check_hash_type(argv[argc-1])) && (--argc, 1))
4420 #define RAND_UPTO(max) (long)rb_random_ulong_limited((randgen), (max)-1)
4520 long n, len, i, j, k, idx[10];
4545 if (n > len) n = len;
4547 for (i = 0; i < n; ++i) {
4553 if (len < k && n <=
numberof(idx)) {
4554 for (i = 0; i < n; ++i) {
4558 if (n > len) n = len;
4576 if (j >= i) l = i, g = ++j;
4577 if (k >= l && (++k >= g)) ++k;
4583 sorted[0] = idx[0] = rnds[0];
4584 for (i=1; i<n; i++) {
4586 for (j = 0; j < i; ++j) {
4587 if (k < sorted[j])
break;
4590 memmove(&sorted[j+1], &sorted[j],
sizeof(sorted[0])*(i-j));
4591 sorted[j] = idx[i] = k;
4595 for (i=0; i<n; i++) {
4605 for (i=0; i<n; i++) {
4608 ptr_result[j] = ptr_result[i];
4630 if (mul <= 0)
return INT2FIX(0);
4669 if (n <= 0)
return Qnil;
4672 while (
RARRAY_LEN(ary) > 0 && (n < 0 || 0 < n--)) {
4680 #define tmpbuf(n, size) rb_str_tmp_new((n)*(size))
4681 #define tmpbuf_discard(s) (rb_str_resize((s), 0L), RBASIC_SET_CLASS_RAW(s, rb_cString))
4682 #define tmpary(n) rb_ary_tmp_new(n)
4683 #define tmpary_discard(a) (ary_discard(a), RBASIC_SET_CLASS_RAW(a, rb_cArray))
4698 for (i = 0; i < r; i++) result_array[i] = values_array[p[i]];
4701 return !
RBASIC(values)->klass;
4722 for (i = 0; i < n; i++) {
4748 while (how_many-- > 0) {
4759 if (comb > size-comb) {
4818 if (r < 0 || n < r) {
4889 if (n < 0 || len < n) {
4896 for (i = 0; i < len; i++) {
4903 long *stack =
ALLOCV_N(
long, t0, n+1);
4910 for (lev++; lev < n; lev++) {
4911 stack[lev+1] = stack[lev]+1;
4917 if (lev == 0)
goto done;
4919 }
while (stack[lev+1]+n == len+lev+1);
4945 for (i = 0; i < n; i++) {
5033 for (; index < n; ++index) {
5098 for (i = 0; i < len; i++) {
5102 else if (len == 0) {
5157 for (i = 1; i < n; i++) arrays[i] =
Qnil;
5158 for (i = 1; i < n; i++) arrays[i] =
to_ary(argv[i-1]);
5161 for (i = 0; i < n; i++) counters[i] = 0;
5166 for (i = 0; i < n; i++) {
5173 for (i = 0; i < n; i++) {
5189 for (j = 0; j < n; j++) {
5194 if (
NIL_P(result)) {
5214 while (counters[m] ==
RARRAY_LEN(arrays[m])) {
5217 if (--m < 0)
goto done;
5583 #define rb_intern(str) rb_intern_const(str)