Bug #5412 » 0001-Array-top-level-documentation-and-enhancing-some-met.patch
array.c | ||
---|---|---|
rb_mem_clear(register VALUE *mem, register long size)
|
||
{
|
||
while (size--) {
|
||
*mem++ = Qnil;
|
||
*mem++ = Qnil;
|
||
}
|
||
}
|
||
... | ... | |
memfill(register VALUE *mem, register long size, register VALUE val)
|
||
{
|
||
while (size--) {
|
||
*mem++ = val;
|
||
*mem++ = val;
|
||
}
|
||
}
|
||
... | ... | |
#define ARY_EMBED_LEN(a) \
|
||
(assert(ARY_EMBED_P(a)), \
|
||
(long)((RBASIC(a)->flags >> RARRAY_EMBED_LEN_SHIFT) & \
|
||
(RARRAY_EMBED_LEN_MASK >> RARRAY_EMBED_LEN_SHIFT)))
|
||
(RARRAY_EMBED_LEN_MASK >> RARRAY_EMBED_LEN_SHIFT)))
|
||
#define ARY_OWNS_HEAP_P(a) (!FL_TEST((a), ELTS_SHARED|RARRAY_EMBED_FLAG))
|
||
#define FL_SET_EMBED(a) do { \
|
||
... | ... | |
} while (0)
|
||
#define ARY_CAPA(ary) (ARY_EMBED_P(ary) ? RARRAY_EMBED_LEN_MAX : \
|
||
ARY_SHARED_ROOT_P(ary) ? RARRAY_LEN(ary) : RARRAY(ary)->as.heap.aux.capa)
|
||
ARY_SHARED_ROOT_P(ary) ? RARRAY_LEN(ary) : RARRAY(ary)->as.heap.aux.capa)
|
||
#define ARY_SET_CAPA(ary, n) do { \
|
||
assert(!ARY_EMBED_P(ary)); \
|
||
assert(!ARY_SHARED_P(ary)); \
|
||
... | ... | |
long new_capa = ARY_CAPA(ary) / 2;
|
||
if (new_capa < ARY_DEFAULT_SIZE) {
|
||
new_capa = ARY_DEFAULT_SIZE;
|
||
new_capa = ARY_DEFAULT_SIZE;
|
||
}
|
||
if (new_capa >= ARY_MAX_SIZE - min) {
|
||
new_capa = (ARY_MAX_SIZE - min) / 2;
|
||
new_capa = (ARY_MAX_SIZE - min) / 2;
|
||
}
|
||
new_capa += min;
|
||
ary_resize_capa(ary, new_capa);
|
||
... | ... | |
rb_ary_decrement_share(VALUE shared)
|
||
{
|
||
if (shared) {
|
||
long num = ARY_SHARED_NUM(shared) - 1;
|
||
if (num == 0) {
|
||
rb_ary_free(shared);
|
||
rb_gc_force_recycle(shared);
|
||
}
|
||
else if (num > 0) {
|
||
ARY_SET_SHARED_NUM(shared, num);
|
||
}
|
||
long num = ARY_SHARED_NUM(shared) - 1;
|
||
if (num == 0) {
|
||
rb_ary_free(shared);
|
||
rb_gc_force_recycle(shared);
|
||
}
|
||
else if (num > 0) {
|
||
ARY_SET_SHARED_NUM(shared, num);
|
||
}
|
||
}
|
||
}
|
||
... | ... | |
rb_ary_unshare_safe(VALUE ary)
|
||
{
|
||
if (ARY_SHARED_P(ary) && !ARY_EMBED_P(ary)) {
|
||
rb_ary_unshare(ary);
|
||
rb_ary_unshare(ary);
|
||
}
|
||
}
|
||
... | ... | |
{
|
||
long num = ARY_SHARED_NUM(shared);
|
||
if (num >= 0) {
|
||
ARY_SET_SHARED_NUM(shared, num + 1);
|
||
ARY_SET_SHARED_NUM(shared, num + 1);
|
||
}
|
||
return shared;
|
||
}
|
||
... | ... | |
{
|
||
rb_check_frozen(ary);
|
||
if (!OBJ_UNTRUSTED(ary) && rb_safe_level() >= 4)
|
||
rb_raise(rb_eSecurityError, "Insecure: can't modify array");
|
||
rb_raise(rb_eSecurityError, "Insecure: can't modify array");
|
||
}
|
||
void
|
||
... | ... | |
VALUE ary;
|
||
if (capa < 0) {
|
||
rb_raise(rb_eArgError, "negative array size (or size too big)");
|
||
rb_raise(rb_eArgError, "negative array size (or size too big)");
|
||
}
|
||
if (capa > ARY_MAX_SIZE) {
|
||
rb_raise(rb_eArgError, "array size too big");
|
||
rb_raise(rb_eArgError, "array size too big");
|
||
}
|
||
ary = ary_alloc(klass);
|
||
if (capa > RARRAY_EMBED_LEN_MAX) {
|
||
... | ... | |
va_start(ar, n);
|
||
for (i=0; i<n; i++) {
|
||
RARRAY_PTR(ary)[i] = va_arg(ar, VALUE);
|
||
RARRAY_PTR(ary)[i] = va_arg(ar, VALUE);
|
||
}
|
||
va_end(ar);
|
||
... | ... | |
ary = rb_ary_new2(n);
|
||
if (n > 0 && elts) {
|
||
MEMCPY(RARRAY_PTR(ary), elts, VALUE, n);
|
||
ARY_SET_LEN(ary, n);
|
||
MEMCPY(RARRAY_PTR(ary), elts, VALUE, n);
|
||
ARY_SET_LEN(ary, n);
|
||
}
|
||
return ary;
|
||
... | ... | |
rb_ary_free(VALUE ary)
|
||
{
|
||
if (ARY_OWNS_HEAP_P(ary)) {
|
||
xfree(ARY_HEAP_PTR(ary));
|
||
xfree(ARY_HEAP_PTR(ary));
|
||
}
|
||
}
|
||
... | ... | |
rb_ary_memsize(VALUE ary)
|
||
{
|
||
if (ARY_OWNS_HEAP_P(ary)) {
|
||
return RARRAY(ary)->as.heap.aux.capa * sizeof(VALUE);
|
||
return RARRAY(ary)->as.heap.aux.capa * sizeof(VALUE);
|
||
}
|
||
else {
|
||
return 0;
|
||
return 0;
|
||
}
|
||
}
|
||
... | ... | |
{
|
||
assert(!ARY_EMBED_P(ary));
|
||
if (ARY_SHARED_P(ary)) {
|
||
return ARY_SHARED(ary);
|
||
return ARY_SHARED(ary);
|
||
}
|
||
else if (ARY_SHARED_ROOT_P(ary)) {
|
||
return ary;
|
||
return ary;
|
||
}
|
||
else if (OBJ_FROZEN(ary)) {
|
||
ary_resize_capa(ary, ARY_HEAP_LEN(ary));
|
||
FL_SET_SHARED_ROOT(ary);
|
||
ARY_SET_SHARED_NUM(ary, 1);
|
||
return ary;
|
||
ary_resize_capa(ary, ARY_HEAP_LEN(ary));
|
||
FL_SET_SHARED_ROOT(ary);
|
||
ARY_SET_SHARED_NUM(ary, 1);
|
||
return ary;
|
||
}
|
||
else {
|
||
NEWOBJ(shared, struct RArray);
|
||
OBJSETUP(shared, 0, T_ARRAY);
|
||
NEWOBJ(shared, struct RArray);
|
||
OBJSETUP(shared, 0, T_ARRAY);
|
||
FL_UNSET_EMBED(shared);
|
||
ARY_SET_LEN((VALUE)shared, RARRAY_LEN(ary));
|
||
ARY_SET_PTR((VALUE)shared, RARRAY_PTR(ary));
|
||
FL_SET_SHARED_ROOT(shared);
|
||
ARY_SET_SHARED_NUM((VALUE)shared, 1);
|
||
FL_SET_SHARED(ary);
|
||
ARY_SET_SHARED(ary, (VALUE)shared);
|
||
OBJ_FREEZE(shared);
|
||
return (VALUE)shared;
|
||
FL_SET_SHARED_ROOT(shared);
|
||
ARY_SET_SHARED_NUM((VALUE)shared, 1);
|
||
FL_SET_SHARED(ary);
|
||
ARY_SET_SHARED(ary, (VALUE)shared);
|
||
OBJ_FREEZE(shared);
|
||
return (VALUE)shared;
|
||
}
|
||
}
|
||
... | ... | |
* # only one copy of the object is created
|
||
* a = Array.new(2, Hash.new)
|
||
* a[0]['cat'] = 'feline'
|
||
* a
|
||
* a #=> [{"cat"=>"feline"}, {"cat"=>"feline"}]
|
||
* a[1]['cat'] = 'Felix'
|
||
* a
|
||
* a #=> [{"cat"=>"Felix"}, {"cat"=>"Felix"}]
|
||
*
|
||
* # here multiple copies are created
|
||
* a = Array.new(2) { Hash.new }
|
||
* a[0]['cat'] = 'feline'
|
||
* a
|
||
* a #=> [{"cat"=>"feline"}, {}]
|
||
* a[1]['cat'] = 'Felix'
|
||
* a #=> [{"cat"=>"feline"}, {"cat"=>"Felix"}]
|
||
*
|
||
* squares = Array.new(5) {|i| i*i}
|
||
* squares
|
||
* squares #=> [0, 1, 4, 9, 16]
|
||
*
|
||
* copy = Array.new(squares)
|
||
* copy #=> [0, 1, 4, 9, 16]
|
||
*/
|
||
static VALUE
|
||
... | ... | |
rb_ary_modify(ary);
|
||
if (argc == 0) {
|
||
if (ARY_OWNS_HEAP_P(ary) && RARRAY_PTR(ary)) {
|
||
xfree(RARRAY_PTR(ary));
|
||
}
|
||
if (ARY_OWNS_HEAP_P(ary) && RARRAY_PTR(ary)) {
|
||
xfree(RARRAY_PTR(ary));
|
||
}
|
||
rb_ary_unshare_safe(ary);
|
||
FL_SET_EMBED(ary);
|
||
ARY_SET_EMBED_LEN(ary, 0);
|
||
if (rb_block_given_p()) {
|
||
rb_warning("given block not used");
|
||
}
|
||
return ary;
|
||
ARY_SET_EMBED_LEN(ary, 0);
|
||
if (rb_block_given_p()) {
|
||
rb_warning("given block not used");
|
||
}
|
||
return ary;
|
||
}
|
||
rb_scan_args(argc, argv, "02", &size, &val);
|
||
if (argc == 1 && !FIXNUM_P(size)) {
|
||
val = rb_check_array_type(size);
|
||
if (!NIL_P(val)) {
|
||
rb_ary_replace(ary, val);
|
||
return ary;
|
||
}
|
||
val = rb_check_array_type(size);
|
||
if (!NIL_P(val)) {
|
||
rb_ary_replace(ary, val);
|
||
return ary;
|
||
}
|
||
}
|
||
len = NUM2LONG(size);
|
||
if (len < 0) {
|
||
rb_raise(rb_eArgError, "negative array size");
|
||
rb_raise(rb_eArgError, "negative array size");
|
||
}
|
||
if (len > ARY_MAX_SIZE) {
|
||
rb_raise(rb_eArgError, "array size too big");
|
||
rb_raise(rb_eArgError, "array size too big");
|
||
}
|
||
rb_ary_modify(ary);
|
||
ary_resize_capa(ary, len);
|
||
if (rb_block_given_p()) {
|
||
long i;
|
||
long i;
|
||
if (argc == 2) {
|
||
rb_warn("block supersedes default value argument");
|
||
}
|
||
for (i=0; i<len; i++) {
|
||
rb_ary_store(ary, i, rb_yield(LONG2NUM(i)));
|
||
ARY_SET_LEN(ary, i + 1);
|
||
}
|
||
if (argc == 2) {
|
||
rb_warn("block supersedes default value argument");
|
||
}
|
||
for (i=0; i<len; i++) {
|
||
rb_ary_store(ary, i, rb_yield(LONG2NUM(i)));
|
||
ARY_SET_LEN(ary, i + 1);
|
||
}
|
||
}
|
||
else {
|
||
memfill(RARRAY_PTR(ary), len, val);
|
||
ARY_SET_LEN(ary, len);
|
||
memfill(RARRAY_PTR(ary), len, val);
|
||
ARY_SET_LEN(ary, len);
|
||
}
|
||
return ary;
|
||
}
|
||
... | ... | |
rb_ary_store(VALUE ary, long idx, VALUE val)
|
||
{
|
||
if (idx < 0) {
|
||
idx += RARRAY_LEN(ary);
|
||
if (idx < 0) {
|
||
rb_raise(rb_eIndexError, "index %ld too small for array; minimum: %ld",
|
||
idx - RARRAY_LEN(ary), -RARRAY_LEN(ary));
|
||
}
|
||
idx += RARRAY_LEN(ary);
|
||
if (idx < 0) {
|
||
rb_raise(rb_eIndexError, "index %ld too small for array; minimum: %ld",
|
||
idx - RARRAY_LEN(ary), -RARRAY_LEN(ary));
|
||
}
|
||
}
|
||
else if (idx >= ARY_MAX_SIZE) {
|
||
rb_raise(rb_eIndexError, "index %ld too big", idx);
|
||
rb_raise(rb_eIndexError, "index %ld too big", idx);
|
||
}
|
||
rb_ary_modify(ary);
|
||
if (idx >= ARY_CAPA(ary)) {
|
||
ary_double_capa(ary, idx);
|
||
ary_double_capa(ary, idx);
|
||
}
|
||
if (idx > RARRAY_LEN(ary)) {
|
||
rb_mem_clear(RARRAY_PTR(ary) + RARRAY_LEN(ary),
|
||
idx-RARRAY_LEN(ary) + 1);
|
||
rb_mem_clear(RARRAY_PTR(ary) + RARRAY_LEN(ary),
|
||
idx-RARRAY_LEN(ary) + 1);
|
||
}
|
||
if (idx >= RARRAY_LEN(ary)) {
|
||
ARY_SET_LEN(ary, idx + 1);
|
||
ARY_SET_LEN(ary, idx + 1);
|
||
}
|
||
RARRAY_PTR(ary)[idx] = val;
|
||
}
|
||
... | ... | |
rb_scan_args(argc, argv, "1", &nv);
|
||
n = NUM2LONG(nv);
|
||
if (n > RARRAY_LEN(ary)) {
|
||
n = RARRAY_LEN(ary);
|
||
n = RARRAY_LEN(ary);
|
||
}
|
||
else if (n < 0) {
|
||
rb_raise(rb_eArgError, "negative array size");
|
||
rb_raise(rb_eArgError, "negative array size");
|
||
}
|
||
if (last) {
|
||
offset = RARRAY_LEN(ary) - n;
|
||
offset = RARRAY_LEN(ary) - n;
|
||
}
|
||
return ary_make_partial(ary, rb_cArray, offset, n);
|
||
}
|
||
... | ... | |
long idx = RARRAY_LEN(ary);
|
||
if (idx >= ARY_CAPA(ary)) {
|
||
ary_double_capa(ary, idx);
|
||
ary_double_capa(ary, idx);
|
||
}
|
||
RARRAY_PTR(ary)[idx] = item;
|
||
ARY_SET_LEN(ary, idx + 1);
|
||
... | ... | |
{
|
||
rb_ary_modify(ary);
|
||
while (argc--) {
|
||
rb_ary_push_1(ary, *argv++);
|
||
rb_ary_push_1(ary, *argv++);
|
||
}
|
||
return ary;
|
||
}
|
||
... | ... | |
rb_ary_modify_check(ary);
|
||
if (RARRAY_LEN(ary) == 0) return Qnil;
|
||
if (ARY_OWNS_HEAP_P(ary) &&
|
||
RARRAY_LEN(ary) * 3 < ARY_CAPA(ary) &&
|
||
ARY_CAPA(ary) > ARY_DEFAULT_SIZE)
|
||
RARRAY_LEN(ary) * 3 < ARY_CAPA(ary) &&
|
||
ARY_CAPA(ary) > ARY_DEFAULT_SIZE)
|
||
{
|
||
ary_resize_capa(ary, RARRAY_LEN(ary) * 2);
|
||
ary_resize_capa(ary, RARRAY_LEN(ary) * 2);
|
||
}
|
||
n = RARRAY_LEN(ary)-1;
|
||
ARY_SET_LEN(ary, n);
|
||
... | ... | |
VALUE result;
|
||
if (argc == 0) {
|
||
return rb_ary_pop(ary);
|
||
return rb_ary_pop(ary);
|
||
}
|
||
rb_ary_modify_check(ary);
|
||
... | ... | |
if (RARRAY_LEN(ary) == 0) return Qnil;
|
||
top = RARRAY_PTR(ary)[0];
|
||
if (!ARY_SHARED_P(ary)) {
|
||
if (RARRAY_LEN(ary) < ARY_DEFAULT_SIZE) {
|
||
MEMMOVE(RARRAY_PTR(ary), RARRAY_PTR(ary)+1, VALUE, RARRAY_LEN(ary)-1);
|
||
if (RARRAY_LEN(ary) < ARY_DEFAULT_SIZE) {
|
||
MEMMOVE(RARRAY_PTR(ary), RARRAY_PTR(ary)+1, VALUE, RARRAY_LEN(ary)-1);
|
||
ARY_INCREASE_LEN(ary, -1);
|
||
return top;
|
||
}
|
||
return top;
|
||
}
|
||
assert(!ARY_EMBED_P(ary)); /* ARY_EMBED_LEN_MAX < ARY_DEFAULT_SIZE */
|
||
RARRAY_PTR(ary)[0] = Qnil;
|
||
ary_make_shared(ary);
|
||
RARRAY_PTR(ary)[0] = Qnil;
|
||
ary_make_shared(ary);
|
||
}
|
||
else if (ARY_SHARED_NUM(ARY_SHARED(ary)) == 1) {
|
||
RARRAY_PTR(ary)[0] = Qnil;
|
||
RARRAY_PTR(ary)[0] = Qnil;
|
||
}
|
||
ARY_INCREASE_PTR(ary, 1); /* shift ptr */
|
||
ARY_INCREASE_PTR(ary, 1); /* shift ptr */
|
||
ARY_INCREASE_LEN(ary, -1);
|
||
return top;
|
||
... | ... | |
long n;
|
||
if (argc == 0) {
|
||
return rb_ary_shift(ary);
|
||
return rb_ary_shift(ary);
|
||
}
|
||
rb_ary_modify_check(ary);
|
||
result = ary_take_first_or_last(argc, argv, ary, ARY_TAKE_FIRST);
|
||
n = RARRAY_LEN(result);
|
||
if (ARY_SHARED_P(ary)) {
|
||
if (ARY_SHARED_NUM(ARY_SHARED(ary)) == 1) {
|
||
rb_mem_clear(RARRAY_PTR(ary), n);
|
||
}
|
||
if (ARY_SHARED_NUM(ARY_SHARED(ary)) == 1) {
|
||
rb_mem_clear(RARRAY_PTR(ary), n);
|
||
}
|
||
ARY_INCREASE_PTR(ary, n);
|
||
}
|
||
else {
|
||
MEMMOVE(RARRAY_PTR(ary), RARRAY_PTR(ary)+n, VALUE, RARRAY_LEN(ary)-n);
|
||
MEMMOVE(RARRAY_PTR(ary), RARRAY_PTR(ary)+n, VALUE, RARRAY_LEN(ary)-n);
|
||
}
|
||
ARY_INCREASE_LEN(ary, -n);
|
||
... | ... | |
rb_ary_modify(ary);
|
||
if (argc == 0) return ary;
|
||
if (ARY_CAPA(ary) <= (len = RARRAY_LEN(ary)) + argc) {
|
||
ary_double_capa(ary, len + argc);
|
||
ary_double_capa(ary, len + argc);
|
||
}
|
||
/* sliding items */
|
||
... | ... | |
{
|
||
if (RARRAY_LEN(ary) == 0) return Qnil;
|
||
if (offset < 0 || RARRAY_LEN(ary) <= offset) {
|
||
return Qnil;
|
||
return Qnil;
|
||
}
|
||
return RARRAY_PTR(ary)[offset];
|
||
}
|
||
... | ... | |
rb_ary_entry(VALUE ary, long offset)
|
||
{
|
||
if (offset < 0) {
|
||
offset += RARRAY_LEN(ary);
|
||
offset += RARRAY_LEN(ary);
|
||
}
|
||
return rb_ary_elt(ary, offset);
|
||
}
|
||
... | ... | |
if (beg < 0 || len < 0) return Qnil;
|
||
if (RARRAY_LEN(ary) < len || RARRAY_LEN(ary) < beg + len) {
|
||
len = RARRAY_LEN(ary) - beg;
|
||
len = RARRAY_LEN(ary) - beg;
|
||
}
|
||
klass = rb_obj_class(ary);
|
||
if (len == 0) return ary_new(klass, 0);
|
||
... | ... | |
long beg, len;
|
||
if (argc == 2) {
|
||
beg = NUM2LONG(argv[0]);
|
||
len = NUM2LONG(argv[1]);
|
||
if (beg < 0) {
|
||
beg += RARRAY_LEN(ary);
|
||
}
|
||
return rb_ary_subseq(ary, beg, len);
|
||
beg = NUM2LONG(argv[0]);
|
||
len = NUM2LONG(argv[1]);
|
||
if (beg < 0) {
|
||
beg += RARRAY_LEN(ary);
|
||
}
|
||
return rb_ary_subseq(ary, beg, len);
|
||
}
|
||
if (argc != 1) {
|
||
rb_scan_args(argc, argv, "11", 0, 0);
|
||
rb_scan_args(argc, argv, "11", 0, 0);
|
||
}
|
||
arg = argv[0];
|
||
/* special case - speeding up */
|
||
if (FIXNUM_P(arg)) {
|
||
return rb_ary_entry(ary, FIX2LONG(arg));
|
||
return rb_ary_entry(ary, FIX2LONG(arg));
|
||
}
|
||
/* check if idx is Range */
|
||
switch (rb_range_beg_len(arg, &beg, &len, RARRAY_LEN(ary), 0)) {
|
||
case Qfalse:
|
||
break;
|
||
break;
|
||
case Qnil:
|
||
return Qnil;
|
||
return Qnil;
|
||
default:
|
||
return rb_ary_subseq(ary, beg, len);
|
||
return rb_ary_subseq(ary, beg, len);
|
||
}
|
||
return rb_ary_entry(ary, NUM2LONG(arg));
|
||
}
|
||
... | ... | |
rb_ary_first(int argc, VALUE *argv, VALUE ary)
|
||
{
|
||
if (argc == 0) {
|
||
if (RARRAY_LEN(ary) == 0) return Qnil;
|
||
return RARRAY_PTR(ary)[0];
|
||
if (RARRAY_LEN(ary) == 0) return Qnil;
|
||
return RARRAY_PTR(ary)[0];
|
||
}
|
||
else {
|
||
return ary_take_first_or_last(argc, argv, ary, ARY_TAKE_FIRST);
|
||
return ary_take_first_or_last(argc, argv, ary, ARY_TAKE_FIRST);
|
||
}
|
||
}
|
||
... | ... | |
rb_ary_last(int argc, VALUE *argv, VALUE ary)
|
||
{
|
||
if (argc == 0) {
|
||
if (RARRAY_LEN(ary) == 0) return Qnil;
|
||
return RARRAY_PTR(ary)[RARRAY_LEN(ary)-1];
|
||
if (RARRAY_LEN(ary) == 0) return Qnil;
|
||
return RARRAY_PTR(ary)[RARRAY_LEN(ary)-1];
|
||
}
|
||
else {
|
||
return ary_take_first_or_last(argc, argv, ary, ARY_TAKE_LAST);
|
||
return ary_take_first_or_last(argc, argv, ary, ARY_TAKE_LAST);
|
||
}
|
||
}
|
||
... | ... | |
rb_scan_args(argc, argv, "11", &pos, &ifnone);
|
||
block_given = rb_block_given_p();
|
||
if (block_given && argc == 2) {
|
||
rb_warn("block supersedes default value argument");
|
||
rb_warn("block supersedes default value argument");
|
||
}
|
||
idx = NUM2LONG(pos);
|
||
if (idx < 0) {
|
||
idx += RARRAY_LEN(ary);
|
||
idx += RARRAY_LEN(ary);
|
||
}
|
||
if (idx < 0 || RARRAY_LEN(ary) <= idx) {
|
||
if (block_given) return rb_yield(pos);
|
||
if (argc == 1) {
|
||
rb_raise(rb_eIndexError, "index %ld outside of array bounds: %ld...%ld",
|
||
idx - (idx < 0 ? RARRAY_LEN(ary) : 0), -RARRAY_LEN(ary), RARRAY_LEN(ary));
|
||
}
|
||
return ifnone;
|
||
if (block_given) return rb_yield(pos);
|
||
if (argc == 1) {
|
||
rb_raise(rb_eIndexError, "index %ld outside of array bounds: %ld...%ld",
|
||
idx - (idx < 0 ? RARRAY_LEN(ary) : 0), -RARRAY_LEN(ary), RARRAY_LEN(ary));
|
||
}
|
||
return ifnone;
|
||
}
|
||
return RARRAY_PTR(ary)[idx];
|
||
}
|
||
... | ... | |
long i;
|
||
if (argc == 0) {
|
||
RETURN_ENUMERATOR(ary, 0, 0);
|
||
for (i=0; i<RARRAY_LEN(ary); i++) {
|
||
if (RTEST(rb_yield(RARRAY_PTR(ary)[i]))) {
|
||
return LONG2NUM(i);
|
||
}
|
||
}
|
||
return Qnil;
|
||
RETURN_ENUMERATOR(ary, 0, 0);
|
||
for (i=0; i<RARRAY_LEN(ary); i++) {
|
||
if (RTEST(rb_yield(RARRAY_PTR(ary)[i]))) {
|
||
return LONG2NUM(i);
|
||
}
|
||
}
|
||
return Qnil;
|
||
}
|
||
rb_scan_args(argc, argv, "1", &val);
|
||
if (rb_block_given_p())
|
||
rb_warn("given block not used");
|
||
rb_warn("given block not used");
|
||
for (i=0; i<RARRAY_LEN(ary); i++) {
|
||
if (rb_equal(RARRAY_PTR(ary)[i], val))
|
||
return LONG2NUM(i);
|
||
if (rb_equal(RARRAY_PTR(ary)[i], val))
|
||
return LONG2NUM(i);
|
||
}
|
||
return Qnil;
|
||
}
|
||
... | ... | |
long i = RARRAY_LEN(ary);
|
||
if (argc == 0) {
|
||
RETURN_ENUMERATOR(ary, 0, 0);
|
||
while (i--) {
|
||
if (RTEST(rb_yield(RARRAY_PTR(ary)[i])))
|
||
return LONG2NUM(i);
|
||
if (i > RARRAY_LEN(ary)) {
|
||
i = RARRAY_LEN(ary);
|
||
}
|
||
}
|
||
return Qnil;
|
||
RETURN_ENUMERATOR(ary, 0, 0);
|
||
while (i--) {
|
||
if (RTEST(rb_yield(RARRAY_PTR(ary)[i])))
|
||
return LONG2NUM(i);
|
||
if (i > RARRAY_LEN(ary)) {
|
||
i = RARRAY_LEN(ary);
|
||
}
|
||
}
|
||
return Qnil;
|
||
}
|
||
rb_scan_args(argc, argv, "1", &val);
|
||
if (rb_block_given_p())
|
||
rb_warn("given block not used");
|
||
rb_warn("given block not used");
|
||
while (i--) {
|
||
if (rb_equal(RARRAY_PTR(ary)[i], val))
|
||
return LONG2NUM(i);
|
||
if (i > RARRAY_LEN(ary)) {
|
||
i = RARRAY_LEN(ary);
|
||
}
|
||
if (rb_equal(RARRAY_PTR(ary)[i], val))
|
||
return LONG2NUM(i);
|
||
if (i > RARRAY_LEN(ary)) {
|
||
i = RARRAY_LEN(ary);
|
||
}
|
||
}
|
||
return Qnil;
|
||
}
|
||
... | ... | |
if (len < 0) rb_raise(rb_eIndexError, "negative length (%ld)", len);
|
||
if (beg < 0) {
|
||
beg += RARRAY_LEN(ary);
|
||
if (beg < 0) {
|
||
rb_raise(rb_eIndexError, "index %ld too small for array; minimum: %ld",
|
||
beg - RARRAY_LEN(ary), -RARRAY_LEN(ary));
|
||
}
|
||
beg += RARRAY_LEN(ary);
|
||
if (beg < 0) {
|
||
rb_raise(rb_eIndexError, "index %ld too small for array; minimum: %ld",
|
||
beg - RARRAY_LEN(ary), -RARRAY_LEN(ary));
|
||
}
|
||
}
|
||
if (RARRAY_LEN(ary) < len || RARRAY_LEN(ary) < beg + len) {
|
||
len = RARRAY_LEN(ary) - beg;
|
||
len = RARRAY_LEN(ary) - beg;
|
||
}
|
||
if (rpl == Qundef) {
|
||
rlen = 0;
|
||
rlen = 0;
|
||
}
|
||
else {
|
||
rpl = rb_ary_to_ary(rpl);
|
||
rlen = RARRAY_LEN(rpl);
|
||
rpl = rb_ary_to_ary(rpl);
|
||
rlen = RARRAY_LEN(rpl);
|
||
}
|
||
rb_ary_modify(ary);
|
||
if (beg >= RARRAY_LEN(ary)) {
|
||
if (beg > ARY_MAX_SIZE - rlen) {
|
||
rb_raise(rb_eIndexError, "index %ld too big", beg);
|
||
}
|
||
len = beg + rlen;
|
||
if (len >= ARY_CAPA(ary)) {
|
||
ary_double_capa(ary, len);
|
||
}
|
||
rb_mem_clear(RARRAY_PTR(ary) + RARRAY_LEN(ary), beg - RARRAY_LEN(ary));
|
||
if (rlen > 0) {
|
||
MEMCPY(RARRAY_PTR(ary) + beg, RARRAY_PTR(rpl), VALUE, rlen);
|
||
}
|
||
ARY_SET_LEN(ary, len);
|
||
if (beg > ARY_MAX_SIZE - rlen) {
|
||
rb_raise(rb_eIndexError, "index %ld too big", beg);
|
||
}
|
||
len = beg + rlen;
|
||
if (len >= ARY_CAPA(ary)) {
|
||
ary_double_capa(ary, len);
|
||
}
|
||
rb_mem_clear(RARRAY_PTR(ary) + RARRAY_LEN(ary), beg - RARRAY_LEN(ary));
|
||
if (rlen > 0) {
|
||
MEMCPY(RARRAY_PTR(ary) + beg, RARRAY_PTR(rpl), VALUE, rlen);
|
||
}
|
||
ARY_SET_LEN(ary, len);
|
||
}
|
||
else {
|
||
long alen;
|
||
long alen;
|
||
alen = RARRAY_LEN(ary) + rlen - len;
|
||
if (alen >= ARY_CAPA(ary)) {
|
||
ary_double_capa(ary, alen);
|
||
}
|
||
alen = RARRAY_LEN(ary) + rlen - len;
|
||
if (alen >= ARY_CAPA(ary)) {
|
||
ary_double_capa(ary, alen);
|
||
}
|
||
if (len != rlen) {
|
||
MEMMOVE(RARRAY_PTR(ary) + beg + rlen, RARRAY_PTR(ary) + beg + len,
|
||
VALUE, RARRAY_LEN(ary) - (beg + len));
|
||
ARY_SET_LEN(ary, alen);
|
||
}
|
||
if (rlen > 0) {
|
||
MEMMOVE(RARRAY_PTR(ary) + beg, RARRAY_PTR(rpl), VALUE, rlen);
|
||
}
|
||
if (len != rlen) {
|
||
MEMMOVE(RARRAY_PTR(ary) + beg + rlen, RARRAY_PTR(ary) + beg + len,
|
||
VALUE, RARRAY_LEN(ary) - (beg + len));
|
||
ARY_SET_LEN(ary, alen);
|
||
}
|
||
if (rlen > 0) {
|
||
MEMMOVE(RARRAY_PTR(ary) + beg, RARRAY_PTR(rpl), VALUE, rlen);
|
||
}
|
||
}
|
||
}
|
||
... | ... | |
rb_ary_modify_check(ary);
|
||
if (ARY_SHARED_P(ary)) {
|
||
rb_raise(rb_eRuntimeError, "can't set length of shared ");
|
||
rb_raise(rb_eRuntimeError, "can't set length of shared ");
|
||
}
|
||
if (len > (capa = (long)ARY_CAPA(ary))) {
|
||
rb_bug("probable buffer overflow: %ld for %ld", len, capa);
|
||
rb_bug("probable buffer overflow: %ld for %ld", len, capa);
|
||
}
|
||
ARY_SET_LEN(ary, len);
|
||
}
|
||
... | ... | |
olen = RARRAY_LEN(ary);
|
||
if (len == olen) return ary;
|
||
if (len > ARY_MAX_SIZE) {
|
||
rb_raise(rb_eIndexError, "index %ld too big", len);
|
||
rb_raise(rb_eIndexError, "index %ld too big", len);
|
||
}
|
||
if (len > olen) {
|
||
if (len >= ARY_CAPA(ary)) {
|
||
ary_double_capa(ary, len);
|
||
}
|
||
rb_mem_clear(RARRAY_PTR(ary) + olen, len - olen);
|
||
if (len >= ARY_CAPA(ary)) {
|
||
ary_double_capa(ary, len);
|
||
}
|
||
rb_mem_clear(RARRAY_PTR(ary) + olen, len - olen);
|
||
ARY_SET_LEN(ary, len);
|
||
}
|
||
else if (ARY_EMBED_P(ary)) {
|
||
ARY_SET_EMBED_LEN(ary, len);
|
||
}
|
||
else if (len <= RARRAY_EMBED_LEN_MAX) {
|
||
VALUE tmp[RARRAY_EMBED_LEN_MAX];
|
||
MEMCPY(tmp, ARY_HEAP_PTR(ary), VALUE, len);
|
||
ary_discard(ary);
|
||
MEMCPY(ARY_EMBED_PTR(ary), tmp, VALUE, len);
|
||
VALUE tmp[RARRAY_EMBED_LEN_MAX];
|
||
MEMCPY(tmp, ARY_HEAP_PTR(ary), VALUE, len);
|
||
ary_discard(ary);
|
||
MEMCPY(ARY_EMBED_PTR(ary), tmp, VALUE, len);
|
||
ARY_SET_EMBED_LEN(ary, len);
|
||
}
|
||
else {
|
||
if (olen > len + ARY_DEFAULT_SIZE) {
|
||
REALLOC_N(RARRAY(ary)->as.heap.ptr, VALUE, len);
|
||
ARY_SET_CAPA(ary, len);
|
||
}
|
||
ARY_SET_HEAP_LEN(ary, len);
|
||
if (olen > len + ARY_DEFAULT_SIZE) {
|
||
REALLOC_N(RARRAY(ary)->as.heap.ptr, VALUE, len);
|
||
ARY_SET_CAPA(ary, len);
|
||
}
|
||
ARY_SET_HEAP_LEN(ary, len);
|
||
}
|
||
return ary;
|
||
}
|
||
... | ... | |
long offset, beg, len;
|
||
if (argc == 3) {
|
||
rb_ary_modify_check(ary);
|
||
beg = NUM2LONG(argv[0]);
|
||
len = NUM2LONG(argv[1]);
|
||
rb_ary_splice(ary, beg, len, argv[2]);
|
||
return argv[2];
|
||
rb_ary_modify_check(ary);
|
||
beg = NUM2LONG(argv[0]);
|
||
len = NUM2LONG(argv[1]);
|
||
rb_ary_splice(ary, beg, len, argv[2]);
|
||
return argv[2];
|
||
}
|
||
if (argc != 2) {
|
||
rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)", argc);
|
||
rb_raise(rb_eArgError, "wrong number of arguments (%d for 2)", argc);
|
||
}
|
||
rb_ary_modify_check(ary);
|
||
if (FIXNUM_P(argv[0])) {
|
||
offset = FIX2LONG(argv[0]);
|
||
goto fixnum;
|
||
offset = FIX2LONG(argv[0]);
|
||
goto fixnum;
|
||
}
|
||
if (rb_range_beg_len(argv[0], &beg, &len, RARRAY_LEN(ary), 1)) {
|
||
/* check if idx is Range */
|
||
rb_ary_splice(ary, beg, len, argv[1]);
|
||
return argv[1];
|
||
/* check if idx is Range */
|
||
rb_ary_splice(ary, beg, len, argv[1]);
|
||
return argv[1];
|
||
}
|
||
offset = NUM2LONG(argv[0]);
|
||
... | ... | |
long pos;
|
||
if (argc < 1) {
|
||
rb_raise(rb_eArgError, "wrong number of arguments (at least 1)");
|
||
rb_raise(rb_eArgError, "wrong number of arguments (at least 1)");
|
||
}
|
||
rb_ary_modify_check(ary);
|
||
if (argc == 1) return ary;
|
||
pos = NUM2LONG(argv[0]);
|
||
if (pos == -1) {
|
||
pos = RARRAY_LEN(ary);
|
||
pos = RARRAY_LEN(ary);
|
||
}
|
||
if (pos < 0) {
|
||
pos++;
|
||
pos++;
|
||
}
|
||
rb_ary_splice(ary, pos, 0, rb_ary_new4(argc - 1, argv + 1));
|
||
return ary;
|
||
... | ... | |
RETURN_ENUMERATOR(ary, 0, 0);
|
||
for (i=0; i<RARRAY_LEN(ary); i++) {
|
||
rb_yield(RARRAY_PTR(ary)[i]);
|
||
rb_yield(RARRAY_PTR(ary)[i]);
|
||
}
|
||
return ary;
|
||
}
|
||
... | ... | |
RETURN_ENUMERATOR(ary, 0, 0);
|
||
for (i=0; i<RARRAY_LEN(ary); i++) {
|
||
rb_yield(LONG2NUM(i));
|
||
rb_yield(LONG2NUM(i));
|
||
}
|
||
return ary;
|
||
}
|
||
... | ... | |
RETURN_ENUMERATOR(ary, 0, 0);
|
||
len = RARRAY_LEN(ary);
|
||
while (len--) {
|
||
rb_yield(RARRAY_PTR(ary)[len]);
|
||
if (RARRAY_LEN(ary) < len) {
|
||
len = RARRAY_LEN(ary);
|
||
}
|
||
rb_yield(RARRAY_PTR(ary)[len]);
|
||
if (RARRAY_LEN(ary) < len) {
|
||
len = RARRAY_LEN(ary);
|
||
}
|
||
}
|
||
return ary;
|
||
}
|
||
... | ... | |
rb_ary_empty_p(VALUE ary)
|
||
{
|
||
if (RARRAY_LEN(ary) == 0)
|
||
return Qtrue;
|
||
return Qtrue;
|
||
return Qfalse;
|
||
}
|
||
... | ... | |
int *first = (int *)arg[3];
|
||
if (recur) {
|
||
rb_raise(rb_eArgError, "recursive array join");
|
||
rb_raise(rb_eArgError, "recursive array join");
|
||
}
|
||
else {
|
||
ary_join_1(obj, ary, sep, 0, result, first);
|
||
ary_join_1(obj, ary, sep, 0, result, first);
|
||
}
|
||
return Qnil;
|
||
}
|
||
... | ... | |
if (max > 0) rb_enc_copy(result, RARRAY_PTR(ary)[0]);
|
||
for (i=0; i<max; i++) {
|
||
val = RARRAY_PTR(ary)[i];
|
||
if (i > 0 && !NIL_P(sep))
|
||
rb_str_buf_append(result, sep);
|
||
rb_str_buf_append(result, val);
|
||
if (OBJ_TAINTED(val)) OBJ_TAINT(result);
|
||
if (OBJ_UNTRUSTED(val)) OBJ_TAINT(result);
|
||
val = RARRAY_PTR(ary)[i];
|
||
if (i > 0 && !NIL_P(sep))
|
||
rb_str_buf_append(result, sep);
|
||
rb_str_buf_append(result, val);
|
||
if (OBJ_TAINTED(val)) OBJ_TAINT(result);
|
||
if (OBJ_UNTRUSTED(val)) OBJ_TAINT(result);
|
||
}
|
||
}
|
||
... | ... | |
VALUE val, tmp;
|
||
for (; i<RARRAY_LEN(ary); i++) {
|
||
if (i > 0 && !NIL_P(sep))
|
||
rb_str_buf_append(result, sep);
|
||
val = RARRAY_PTR(ary)[i];
|
||
switch (TYPE(val)) {
|
||
case T_STRING:
|
||
str_join:
|
||
rb_str_buf_append(result, val);
|
||
*first = FALSE;
|
||
break;
|
||
case T_ARRAY:
|
||
obj = val;
|
||
ary_join:
|
||
if (val == ary) {
|
||
rb_raise(rb_eArgError, "recursive array join");
|
||
}
|
||
else {
|
||
VALUE args[4];
|
||
args[0] = val;
|
||
args[1] = sep;
|
||
args[2] = result;
|
||
args[3] = (VALUE)first;
|
||
rb_exec_recursive(recursive_join, obj, (VALUE)args);
|
||
}
|
||
break;
|
||
default:
|
||
tmp = rb_check_string_type(val);
|
||
if (!NIL_P(tmp)) {
|
||
val = tmp;
|
||
goto str_join;
|
||
}
|
||
tmp = rb_check_convert_type(val, T_ARRAY, "Array", "to_ary");
|
||
if (!NIL_P(tmp)) {
|
||
obj = val;
|
||
val = tmp;
|
||
goto ary_join;
|
||
}
|
||
val = rb_obj_as_string(val);
|
||
if (*first) {
|
||
rb_enc_copy(result, val);
|
||
*first = FALSE;
|
||
}
|
||
goto str_join;
|
||
}
|
||
if (i > 0 && !NIL_P(sep))
|
||
rb_str_buf_append(result, sep);
|
||
val = RARRAY_PTR(ary)[i];
|
||
switch (TYPE(val)) {
|
||
case T_STRING:
|
||
str_join:
|
||
rb_str_buf_append(result, val);
|
||
*first = FALSE;
|
||
break;
|
||
case T_ARRAY:
|
||
obj = val;
|
||
ary_join:
|
||
if (val == ary) {
|
||
rb_raise(rb_eArgError, "recursive array join");
|
||
}
|
||
else {
|
||
VALUE args[4];
|
||
args[0] = val;
|
||
args[1] = sep;
|
||
args[2] = result;
|
||
args[3] = (VALUE)first;
|
||
rb_exec_recursive(recursive_join, obj, (VALUE)args);
|
||
}
|
||
break;
|
||
default:
|
||
tmp = rb_check_string_type(val);
|
||
if (!NIL_P(tmp)) {
|
||
val = tmp;
|
||
goto str_join;
|
||
}
|
||
tmp = rb_check_convert_type(val, T_ARRAY, "Array", "to_ary");
|
||
if (!NIL_P(tmp)) {
|
||
obj = val;
|
||
val = tmp;
|
||
goto ary_join;
|
||
}
|
||
val = rb_obj_as_string(val);
|
||
if (*first) {
|
||
rb_enc_copy(result, val);
|
||
*first = FALSE;
|
||
}
|
||
goto str_join;
|
||
}
|
||
}
|
||
}
|
||
... | ... | |
if (OBJ_UNTRUSTED(ary) || OBJ_UNTRUSTED(sep)) untrust = TRUE;
|
||
if (!NIL_P(sep)) {
|
||
StringValue(sep);
|
||
len += RSTRING_LEN(sep) * (RARRAY_LEN(ary) - 1);
|
||
StringValue(sep);
|
||
len += RSTRING_LEN(sep) * (RARRAY_LEN(ary) - 1);
|
||
}
|
||
for (i=0; i<RARRAY_LEN(ary); i++) {
|
||
val = RARRAY_PTR(ary)[i];
|
||
tmp = rb_check_string_type(val);
|
||
val = RARRAY_PTR(ary)[i];
|
||
tmp = rb_check_string_type(val);
|
||
if (NIL_P(tmp) || tmp != val) {
|
||
int first;
|
||
result = rb_str_buf_new(len + (RARRAY_LEN(ary)-i)*10);
|
||
rb_enc_associate(result, rb_usascii_encoding());
|
||
if (taint) OBJ_TAINT(result);
|
||
if (untrust) OBJ_UNTRUST(result);
|
||
ary_join_0(ary, sep, i, result);
|
||
first = i == 0;
|
||
ary_join_1(ary, ary, sep, i, result, &first);
|
||
return result;
|
||
}
|
||
if (NIL_P(tmp) || tmp != val) {
|
||
int first;
|
||
result = rb_str_buf_new(len + (RARRAY_LEN(ary)-i)*10);
|
||
rb_enc_associate(result, rb_usascii_encoding());
|
||
if (taint) OBJ_TAINT(result);
|
||
if (untrust) OBJ_UNTRUST(result);
|
||
ary_join_0(ary, sep, i, result);
|
||
first = i == 0;
|
||
ary_join_1(ary, ary, sep, i, result, &first);
|
||
return result;
|
||
}
|
||
len += RSTRING_LEN(tmp);
|
||
len += RSTRING_LEN(tmp);
|
||
}
|
||
result = rb_str_buf_new(len);
|
||
... | ... | |
if (recur) return rb_usascii_str_new_cstr("[...]");
|
||
str = rb_str_buf_new2("[");
|
||
for (i=0; i<RARRAY_LEN(ary); i++) {
|
||
s = rb_inspect(RARRAY_PTR(ary)[i]);
|
||
if (OBJ_TAINTED(s)) tainted = TRUE;
|
||
if (OBJ_UNTRUSTED(s)) untrust = TRUE;
|
||
if (i > 0) rb_str_buf_cat2(str, ", ");
|
||
else rb_enc_copy(str, s);
|
||
rb_str_buf_append(str, s);
|
||
s = rb_inspect(RARRAY_PTR(ary)[i]);
|
||
if (OBJ_TAINTED(s)) tainted = TRUE;
|
||
if (OBJ_UNTRUSTED(s)) untrust = TRUE;
|
||
if (i > 0) rb_str_buf_cat2(str, ", ");
|
||
else rb_enc_copy(str, s);
|
||
rb_str_buf_append(str, s);
|
||
}
|
||
rb_str_buf_cat2(str, "]");
|
||
if (tainted) OBJ_TAINT(str);
|
||
... | ... | |
rb_ary_to_a(VALUE ary)
|
||
{
|
||
if (rb_obj_class(ary) != rb_cArray) {
|
||
VALUE dup = rb_ary_new2(RARRAY_LEN(ary));
|
||
rb_ary_replace(dup, ary);
|
||
return dup;
|
||
VALUE dup = rb_ary_new2(RARRAY_LEN(ary));
|
||
rb_ary_replace(dup, ary);
|
||
return dup;
|
||
}
|
||
return ary;
|
||
}
|
||
... | ... | |
VALUE *p1, *p2;
|
||
{
|
||
while (p1 < p2) {
|
||
VALUE tmp = *p1;
|
||
*p1++ = *p2;
|
||
*p2-- = tmp;
|
||
VALUE tmp = *p1;
|
||
*p1++ = *p2;
|
||
*p2-- = tmp;
|
||
}
|
||
}
|
||
... | ... | |
rb_ary_modify(ary);
|
||
if (RARRAY_LEN(ary) > 1) {
|
||
p1 = RARRAY_PTR(ary);
|
||
p2 = p1 + RARRAY_LEN(ary) - 1; /* points last item */
|
||
ary_reverse(p1, p2);
|
||
p1 = RARRAY_PTR(ary);
|
||
p2 = p1 + RARRAY_LEN(ary) - 1; /* points last item */
|
||
ary_reverse(p1, p2);
|
||
}
|
||
return ary;
|
||
}
|
||
... | ... | |
VALUE dup = rb_ary_new2(len);
|
||
if (len > 0) {
|
||
VALUE *p1 = RARRAY_PTR(ary);
|
||
VALUE *p2 = RARRAY_PTR(dup) + len - 1;
|
||
do *p2-- = *p1++; while (--len > 0);
|
||
VALUE *p1 = RARRAY_PTR(ary);
|
||
VALUE *p2 = RARRAY_PTR(dup) + len - 1;
|
||
do *p2-- = *p1++; while (--len > 0);
|
||
}
|
||
ARY_SET_LEN(dup, RARRAY_LEN(ary));
|
||
return dup;
|
||
... | ... | |
rb_ary_modify(ary);
|
||
if (cnt != 0) {
|
||
VALUE *ptr = RARRAY_PTR(ary);
|
||
long len = RARRAY_LEN(ary);
|
||
VALUE *ptr = RARRAY_PTR(ary);
|
||
long len = RARRAY_LEN(ary);
|
||
if (len > 0 && (cnt = rotate_count(cnt, len)) > 0) {
|
||
--len;
|
||
if (cnt < len) ary_reverse(ptr + cnt, ptr + len);
|
||
if (--cnt > 0) ary_reverse(ptr, ptr + cnt);
|
||
if (len > 0) ary_reverse(ptr, ptr + len);
|
||
return ary;
|
||
}
|
||
if (len > 0 && (cnt = rotate_count(cnt, len)) > 0) {
|
||
--len;
|
||
if (cnt < len) ary_reverse(ptr + cnt, ptr + len);
|
||
if (--cnt > 0) ary_reverse(ptr, ptr + cnt);
|
||
if (len > 0) ary_reverse(ptr, ptr + len);
|
||
return ary;
|
||
}
|
||
}
|
||
return Qnil;
|
||
... | ... | |
len = RARRAY_LEN(ary);
|
||
rotated = rb_ary_new2(len);
|
||
if (len > 0) {
|
||
cnt = rotate_count(cnt, len);
|
||
ptr = RARRAY_PTR(ary);
|
||
ptr2 = RARRAY_PTR(rotated);
|
||
len -= cnt;
|
||
MEMCPY(ptr2, ptr + cnt, VALUE, len);
|
||
MEMCPY(ptr2 + len, ptr, VALUE, cnt);
|
||
cnt = rotate_count(cnt, len);
|
||
ptr = RARRAY_PTR(ary);
|
||
ptr2 = RARRAY_PTR(rotated);
|
||
len -= cnt;
|
||
MEMCPY(ptr2, ptr + cnt, VALUE, len);
|
||
MEMCPY(ptr2 + len, ptr, VALUE, cnt);
|
||
}
|
||
ARY_SET_LEN(rotated, RARRAY_LEN(ary));
|
||
return rotated;
|
||
... | ... | |
sort_reentered(VALUE ary)
|
||
{
|
||
if (RBASIC(ary)->klass) {
|
||
rb_raise(rb_eRuntimeError, "sort reentered");
|
||
rb_raise(rb_eRuntimeError, "sort reentered");
|
||
}
|
||
return Qnil;
|
||
}
|
||
... | ... | |
int n;
|
||
if (FIXNUM_P(a) && FIXNUM_P(b) && SORT_OPTIMIZABLE(data, Fixnum)) {
|
||
if ((long)a > (long)b) return 1;
|
||
if ((long)a < (long)b) return -1;
|
||
return 0;
|
||
if ((long)a > (long)b) return 1;
|
||
if ((long)a < (long)b) return -1;
|
||
return 0;
|
||
}
|
||
if (STRING_P(a) && STRING_P(b) && SORT_OPTIMIZABLE(data, String)) {
|
||
return rb_str_cmp(a, b);
|
||
return rb_str_cmp(a, b);
|
||
}
|
||
retval = rb_funcall(a, id_cmp, 1, b);
|
||
... | ... | |
rb_ary_modify(ary);
|
||
assert(!ARY_SHARED_P(ary));
|
||
if (RARRAY_LEN(ary) > 1) {
|
||
VALUE tmp = ary_make_substitution(ary); /* only ary refers tmp */
|
||
struct ary_sort_data data;
|
||
VALUE tmp = ary_make_substitution(ary); /* only ary refers tmp */
|
||
struct ary_sort_data data;
|
||
RBASIC(tmp)->klass = 0;
|
||
data.ary = tmp;
|
||
data.opt_methods = 0;
|
||
data.opt_inited = 0;
|
||
ruby_qsort(RARRAY_PTR(tmp), RARRAY_LEN(tmp), sizeof(VALUE),
|
||
rb_block_given_p()?sort_1:sort_2, &data);
|
||
RBASIC(tmp)->klass = 0;
|
||
data.ary = tmp;
|
||
data.opt_methods = 0;
|
||
data.opt_inited = 0;
|
||
ruby_qsort(RARRAY_PTR(tmp), RARRAY_LEN(tmp), sizeof(VALUE),
|
||
rb_block_given_p()?sort_1:sort_2, &data);
|
||
if (ARY_EMBED_P(tmp)) {
|
||
assert(ARY_EMBED_P(tmp));
|
||
... | ... | |
FL_SET_EMBED(tmp);
|
||
ARY_SET_EMBED_LEN(tmp, 0);
|
||
FL_SET(tmp, FL_FREEZE);
|
||
}
|
||
}
|
||
/* tmp will be GC'ed. */
|
||
RBASIC(tmp)->klass = rb_cArray;
|
||
}
|
||
... | ... | |
* If no block is given, an enumerator is returned instead.
|
||
*
|
||
* a = [ "a", "b", "c", "d" ]
|
||
* a.collect {|x| x + "!" } #=> ["a!", "b!", "c!", "d!"]
|
||
* a.map {|x| x + "!" } #=> ["a!", "b!", "c!", "d!"]
|
||
* a #=> ["a", "b", "c", "d"]
|
||
*/
|
||
... | ... | |
RETURN_ENUMERATOR(ary, 0, 0);
|
||
collect = rb_ary_new2(RARRAY_LEN(ary));
|
||
for (i = 0; i < RARRAY_LEN(ary); i++) {
|
||
rb_ary_push(collect, rb_yield(RARRAY_PTR(ary)[i]));
|
||
rb_ary_push(collect, rb_yield(RARRAY_PTR(ary)[i]));
|
||
}
|
||
return collect;
|
||
}
|
||
... | ... | |
* If no block is given, an enumerator is returned instead.
|
||
*
|
||
* a = [ "a", "b", "c", "d" ]
|
||
* a.collect! {|x| x + "!" }
|
||
* a.map! {|x| x + "!" }
|
||
* a #=> [ "a!", "b!", "c!", "d!" ]
|
||
*/
|
||
... | ... | |
RETURN_ENUMERATOR(ary, 0, 0);
|
||
rb_ary_modify(ary);
|
||
for (i = 0; i < RARRAY_LEN(ary); i++) {
|
||
rb_ary_store(ary, i, rb_yield(RARRAY_PTR(ary)[i]));
|
||
rb_ary_store(ary, i, rb_yield(RARRAY_PTR(ary)[i]));
|
||
}
|
||
return ary;
|
||
}
|
||
... | ... | |
long beg, len, i, j;
|
||
for (i=0; i<argc; i++) {
|
||
if (FIXNUM_P(argv[i])) {
|
||
rb_ary_push(result, (*func)(obj, FIX2LONG(argv[i])));
|
||
continue;
|
||
}
|
||
/* check if idx is Range */
|
||
switch (rb_range_beg_len(argv[i], &beg, &len, olen, 0)) {
|
||
case Qfalse:
|
||
break;
|
||
case Qnil:
|
||
continue;
|
||
default:
|
||
for (j=0; j<len; j++) {
|
||
rb_ary_push(result, (*func)(obj, j+beg));
|
||
}
|
||
continue;
|
||
}
|
||
rb_ary_push(result, (*func)(obj, NUM2LONG(argv[i])));
|
||
if (FIXNUM_P(argv[i])) {
|
||
rb_ary_push(result, (*func)(obj, FIX2LONG(argv[i])));
|
||
continue;
|
||
}
|
||
/* check if idx is Range */
|
||
switch (rb_range_beg_len(argv[i], &beg, &len, olen, 0)) {
|
||
case Qfalse:
|
||
break;
|
||
case Qnil:
|
||
continue;
|
||
default:
|
||
for (j=0; j<len; j++) {
|
||
rb_ary_push(result, (*func)(obj, j+beg));
|
||
}
|
||
continue;
|
||
}
|
||
rb_ary_push(result, (*func)(obj, NUM2LONG(argv[i])));
|
||
}
|
||
return result;
|
||
}
|
||
... | ... | |
RETURN_ENUMERATOR(ary, 0, 0);
|
||
result = rb_ary_new2(RARRAY_LEN(ary));
|
||
for (i = 0; i < RARRAY_LEN(ary); i++) {
|
||
if (RTEST(rb_yield(RARRAY_PTR(ary)[i]))) {
|
||
rb_ary_push(result, rb_ary_elt(ary, i));
|
||
}
|
||
if (RTEST(rb_yield(RARRAY_PTR(ary)[i]))) {
|
||
rb_ary_push(result, rb_ary_elt(ary, i));
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
... | ... | |
RETURN_ENUMERATOR(ary, 0, 0);
|
||
rb_ary_modify(ary);
|
||
for (i1 = i2 = 0; i1 < RARRAY_LEN(ary); i1++) {
|
||
VALUE v = RARRAY_PTR(ary)[i1];
|
||
if (!RTEST(rb_yield(v))) continue;
|
||
if (i1 != i2) {
|
||
rb_ary_store(ary, i2, v);
|
||
}
|
||
i2++;
|
||
VALUE v = RARRAY_PTR(ary)[i1];
|
||
if (!RTEST(rb_yield(v))) continue;
|
||
if (i1 != i2) {
|
||
rb_ary_store(ary, i2, v);
|
||
}
|
||
i2++;
|
||
}
|
||
if (RARRAY_LEN(ary) == i2) return Qnil;
|
||
if (i2 < RARRAY_LEN(ary))
|
||
ARY_SET_LEN(ary, i2);
|
||
ARY_SET_LEN(ary, i2);
|
||
return ary;
|
||
}
|
||
... | ... | |
long i1, i2;
|
||
for (i1 = i2 = 0; i1 < RARRAY_LEN(ary); i1++) {
|
||
VALUE e = RARRAY_PTR(ary)[i1];
|
||
VALUE e = RARRAY_PTR(ary)[i1];
|
||
if (rb_equal(e, item)) {
|
||
v = e;
|
||
continue;
|
||
}
|
||
if (i1 != i2) {
|
||
rb_ary_store(ary, i2, e);
|
||
}
|
||
i2++;
|
||
if (rb_equal(e, item)) {
|
||
v = e;
|
||
continue;
|
||
}
|
||
if (i1 != i2) {
|
||
rb_ary_store(ary, i2, e);
|
||
}
|
||
i2++;
|
||
}
|
||
if (RARRAY_LEN(ary) == i2) {
|
||
if (rb_block_given_p()) {
|
||
return rb_yield(item);
|
||
}
|
||
return Qnil;
|
||
if (rb_block_given_p()) {
|
||
return rb_yield(item);
|
||
}
|
||
return Qnil;
|
||
}
|
||
rb_ary_modify(ary);
|
||
if (RARRAY_LEN(ary) > i2) {
|
||
ARY_SET_LEN(ary, i2);
|
||
if (i2 * 2 < ARY_CAPA(ary) &&
|
||
ARY_CAPA(ary) > ARY_DEFAULT_SIZE) {
|
||
ary_resize_capa(ary, i2*2);
|
||
}
|
||
ARY_SET_LEN(ary, i2);
|
||
if (i2 * 2 < ARY_CAPA(ary) &&
|
||
ARY_CAPA(ary) > ARY_DEFAULT_SIZE) {
|
||
ary_resize_capa(ary, i2*2);
|
||
}
|
||
}
|
||
return v;
|
||
... | ... | |
if (pos >= len) return Qnil;
|
||
if (pos < 0) {
|
||
pos += len;
|
||
if (pos < 0) return Qnil;
|
||
pos += len;
|
||
if (pos < 0) return Qnil;
|
||
}
|
||
rb_ary_modify(ary);
|
||
del = RARRAY_PTR(ary)[pos];
|
||
MEMMOVE(RARRAY_PTR(ary)+pos, RARRAY_PTR(ary)+pos+1, VALUE,
|
||
RARRAY_LEN(ary)-pos-1);
|
||
RARRAY_LEN(ary)-pos-1);
|
||
ARY_INCREASE_LEN(ary, -1);
|
||
return del;
|
||
... | ... | |
rb_ary_modify_check(ary);
|
||
if (argc == 2) {
|
||
pos = NUM2LONG(argv[0]);
|
||
len = NUM2LONG(argv[1]);
|
||
pos = NUM2LONG(argv[0]);
|
||
len = NUM2LONG(argv[1]);
|
||
delete_pos_len:
|
||
if (len < 0) return Qnil;
|
||
orig_len = RARRAY_LEN(ary);
|
||
if (pos < 0) {
|
||
pos += orig_len;
|
||
if (pos < 0) return Qnil;
|
||
}
|
||
else if (orig_len < pos) return Qnil;
|
||
if (orig_len < pos + len) {
|
||
len = orig_len - pos;
|
||
}
|
||
if (len == 0) return rb_ary_new2(0);
|
||
arg2 = rb_ary_new4(len, RARRAY_PTR(ary)+pos);
|
||
RBASIC(arg2)->klass = rb_obj_class(ary);
|
||
rb_ary_splice(ary, pos, len, Qundef);
|
||
return arg2;
|
||
if (len < 0) return Qnil;
|
||
orig_len = RARRAY_LEN(ary);
|
||
if (pos < 0) {
|
||
pos += orig_len;
|
||
if (pos < 0) return Qnil;
|
||
}
|
||
else if (orig_len < pos) return Qnil;
|
||
if (orig_len < pos + len) {
|
||
len = orig_len - pos;
|
||
}
|
||
if (len == 0) return rb_ary_new2(0);
|
||
arg2 = rb_ary_new4(len, RARRAY_PTR(ary)+pos);
|
||
RBASIC(arg2)->klass = rb_obj_class(ary);
|
||
rb_ary_splice(ary, pos, len, Qundef);
|
||
return arg2;
|
||
}
|
||
if (argc != 1) {
|
||
/* error report */
|
||
rb_scan_args(argc, argv, "11", NULL, NULL);
|
||
/* error report */
|
||
rb_scan_args(argc, argv, "11", NULL, NULL);
|
||
}
|
||
arg1 = argv[0];
|
||
if (!FIXNUM_P(arg1)) {
|
||
switch (rb_range_beg_len(arg1, &pos, &len, RARRAY_LEN(ary), 0)) {
|