# Array#shift/unshift $B$N9bB.2=(B

**URL:** <https://www.ruby-forum.com/t/array-shift-unshift-b-n9bb-2-b/133132>\
**Category:** Development\
**Created:** [March 28, 2008, 5:34am UTC](https://www.ruby-forum.com/t/array-shift-unshift-b-n9bb-2-b/133132 "2008-03-28T05:34:55Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![wanabe](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/51bf81/32.png) [@wanabe](https://www.ruby-forum.com/u/wanabe)\
**Post date:** [March 28, 2008, 5:34am UTC](https://www.ruby-forum.com/t/array-shift-unshift-b-n9bb-2-b/133132/1 "2008-03-28T05:34:55Z")

</div>

e$B%o%J%Y$H?=$7$^$9!#e(B

[ruby-core:5861]e$B$N%Q%C%A$K6=L#$,$"$C$?$N$G!“e(B  
RARRAY\_PTR(ary)  
e$B$h$jA0J}$K6u$-%a%b%j$rJ];}$9$k$h$&$K$9$k!”$H$$$&%"%$%G%#%"$r??;w$7$Fe(B  
shift/unshift e$B$N9bB.2=$r$9$k%Q%C%A$r=q$$$F$\_$^$7$?!#e(B  
e$BD9$/$J$j$=$&$@$C$?$N$Ge(B rb\_ary\_splice e$B$K$O?($C$F$$$^$;$s!#e(B

e$B85$N%Q%C%A$HHf3S$9$k$H!“C;$$$N$G%A%’%C%/!&%F%9%H$O$7$d$9$/$J$C$F$$$k$H;W$$$^$9!#e(B  
e$B$H$j$”$($:e(B test\_array.rb e$B$ODL$k$3$H$r3NG’$7$^$7$?!#e(B

# Index: array.c

— array.c (revision 15844)  
+++ array.c (working copy)  
@@ -20,6 +20,7 @@  
static ID id\_cmp;

#define ARY\_DEFAULT\_SIZE 16  
+#define ARY\_DEFAULT\_LCAPA 4

void  
rb\_mem\_clear(register VALUE \*mem, register long size)  
@@ -45,9 +46,21 @@

#define ARY\_CAPA(ary) RARRAY(ary)-\>aux.capa  
#define RESIZE\_CAPA(ary,capacity) do {\

- REALLOC\_N(RARRAY(ary)-\>ptr, VALUE, (capacity));\

- RARRAY(ary)-\>ptr -= RARRAY(ary)-\>lcapa;\
- REALLOC\_N(RARRAY(ary)-\>ptr, VALUE, (capacity) +  
RARRAY(ary)-\>lcapa);\
- RARRAY(ary)-\>ptr += RARRAY(ary)-\>lcapa;  
RARRAY(ary)-\>aux.capa = (capacity);  
} while (0)  
+#define RESIZE\_LCAPA(ary,lcapacity) do {\
- long offset = (lcapacity) - RARRAY(ary)-\>lcapa;\
- if((lcapacity) \< 0 || offset \> RARRAY(ary)-\>aux.capa -  
RARRAY\_LEN(ary)) {\
- rb\_raise(rb\_eIndexError, “[BUG] invalid left-capacity”);\
- }\
- RARRAY\_PTR(ary) += offset;\
- MEMMOVE(RARRAY\_PTR(ary), RARRAY\_PTR(ary) - offset, VALUE,  
RARRAY\_LEN(ary));\
- RARRAY(ary)-\>aux.capa -= offset;\
- RARRAY(ary)-\>lcapa = (lcapacity);  
+} while (0)

static inline void  
rb\_ary\_modify\_check(VALUE ary)  
@@ -67,6 +80,7 @@  
ptr = ALLOC\_N(VALUE, RARRAY\_LEN(ary));  
FL\_UNSET(ary, ELTS\_SHARED);  
RARRAY(ary)-\>aux.capa = RARRAY\_LEN(ary);

- RARRAY(ary)-\>lcapa = 0;  
MEMCPY(ptr, RARRAY\_PTR(ary), VALUE, RARRAY\_LEN(ary));  
RARRAY(ary)-\>ptr = ptr;  
}  
@@ -102,6 +116,7 @@  
ary-\>len = 0;  
ary-\>ptr = 0;  
ary-\>aux.capa = 0;

- ary-\>lcapa = 0;

- RARRAY(ary)-\>lcapa = 0;

- return rb\_ary\_new2(ARY\_DEFAULT\_SIZE);

- VALUE ary = rb\_ary\_new2(ARY\_DEFAULT\_SIZE + ARY\_DEFAULT\_LCAPA);
- RARRAY(ary)-\>ptr += ARY\_DEFAULT\_LCAPA;
- RARRAY(ary)-\>lcapa = ARY\_DEFAULT\_LCAPA;
- RARRAY(ary)-\>aux.capa = ARY\_DEFAULT\_SIZE;
- return ary;  
}

#include \<stdarg.h\>  
@@ -177,7 +197,7 @@  
rb\_ary\_free(VALUE ary)  
{  
if (!ARY\_SHARED\_P(ary)) {

- xfree(RARRAY(ary)-\>ptr);

- xfree(RARRAY(ary)-\>ptr - RARRAY(ary)-\>lcapa);  
}  
}

@@ -194,6 +214,7 @@  
shared-\>len = RARRAY(ary)-\>len;  
shared-\>ptr = RARRAY(ary)-\>ptr;  
shared-\>aux.capa = RARRAY(ary)-\>aux.capa;

- shared-\>lcapa = RARRAY(ary)-\>lcapa;  
RARRAY(ary)-\>aux.shared = (VALUE)shared;  
FL\_SET(ary, ELTS\_SHARED);  
OBJ\_FREEZE(shared);  
@@ -292,7 +313,7 @@  
rb\_ary\_modify(ary);  
if (argc == 0) {  
if (RARRAY\_PTR(ary) && !ARY\_SHARED\_P(ary)) {

- 

```
 free(RARRAY(ary)->ptr);

```

- 

```
 free(RARRAY(ary)->ptr - RARRAY(ary)->lcapa);

```

}  
RARRAY(ary)-\>len = 0;  
if (rb\_block\_given\_p()) {  
@@ -355,6 +376,7 @@  
}  
RARRAY(ary)-\>ptr = ALLOC\_N(VALUE, argc);  
RARRAY(ary)-\>aux.capa = argc;
- RARRAY(ary)-\>lcapa = 0;  
MEMCPY(RARRAY\_PTR(ary), argv, VALUE, argc);  
RARRAY(ary)-\>len = argc;

@@ -533,13 +555,11 @@  
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);

- 

```
 RARRAY(ary)->len--;

```

- 

```
 return top;

```

- if (RARRAY\_LEN(ary) \* 2 \< RARRAY(ary)-\>lcapa) {
- 

```
 RESIZE_LCAPA(ary, RARRAY_LEN(ary));

```

}

- RARRAY\_PTR(ary)[0] = Qnil;
- ary\_make\_shared(ary);

- RARRAY(ary)-\>lcapa++;
- RARRAY(ary)-\>aux.capa–;  
}  
RARRAY(ary)-\>ptr++; /\* shift ptr \*/  
RARRAY(ary)-\>len–;  
@@ -577,14 +597,12 @@  
rb\_ary\_modify\_check(ary);  
result = ary\_shared\_first(argc, argv, ary, Qfalse);  
n = RARRAY\_LEN(result);

- if (ARY\_SHARED\_P(ary)) {
- RARRAY(ary)-\>ptr += n;
- RARRAY(ary)-\>len -= n;
- }
- else {
- MEMMOVE(RARRAY\_PTR(ary), RARRAY\_PTR(ary)+n, VALUE,  
RARRAY\_LEN(ary)-n);
- RARRAY(ary)-\>len -= n;

- if (!ARY\_SHARED\_P(ary)) {

- RARRAY(ary)-\>lcapa += n;

- RARRAY(ary)-\>aux.capa -= n;  
}

- RARRAY(ary)-\>ptr += n;

- RARRAY(ary)-\>len -= n;

- if (RARRAY(ary)-\>aux.capa \<= (len = RARRAY(ary)-\>len) + argc) {
- RESIZE\_CAPA(ary, len + argc + ARY\_DEFAULT\_SIZE);

- if (RARRAY(ary)-\>lcapa \< argc) {
- long add\_capa = ARY\_DEFAULT\_SIZE;
- long add\_lcapa = ARY\_DEFAULT\_LCAPA;
- if (RARRAY(ary)-\>aux.capa \<= (len = RARRAY(ary)-\>len) + argc +  
add\_lcapa) {
- 

```
 RESIZE_CAPA(ary, len + argc + add_capa + add_lcapa);

```

- }
- RESIZE\_LCAPA(ary, RARRAY(ary)-\>lcapa + argc + add\_lcapa);  
}

- /\* sliding items \*/
- MEMMOVE(RARRAY(ary)-\>ptr + argc, RARRAY(ary)-\>ptr, VALUE, len);

- RARRAY(ary)-\>ptr -= argc;
- RARRAY(ary)-\>lcapa -= argc;
- RARRAY(ary)-\>aux.capa += argc;  
MEMCPY(RARRAY(ary)-\>ptr, argv, VALUE, argc);  
RARRAY(ary)-\>len += argc;

@@ -1494,6 +1518,7 @@  
RARRAY(ary)-\>ptr = RARRAY(tmp)-\>ptr;  
RARRAY(ary)-\>len = RARRAY(tmp)-\>len;  
RARRAY(ary)-\>aux.capa = RARRAY(tmp)-\>aux.capa;

- RARRAY(ary)-\>lcapa = RARRAY(tmp)-\>lcapa;  
FL\_UNSET(ary, ELTS\_SHARED);  
rb\_gc\_force\_recycle(tmp);  
}  
@@ -2019,7 +2044,7 @@  
if (copy == orig) return copy;  
shared = ary\_make\_shared(orig);  
if (!ARY\_SHARED\_P(copy)) {

- ptr = RARRAY(copy)-\>ptr;

- ptr = RARRAY(copy)-\>ptr - RARRAY(copy)-\>lcapa;  
xfree(ptr);  
}  
RARRAY(copy)-\>ptr = RARRAY(orig)-\>ptr;  
Index: include/ruby/ruby.h  
===================================================================  
— include/ruby/ruby.h (revision 15844)  
+++ include/ruby/ruby.h (working copy)  
@@ -498,6 +498,7 @@  
VALUE shared;  
} aux;  
VALUE \*ptr;
- long lcapa;  
};  
#define RARRAY\_LEN(a) RARRAY(a)-\>len  
#define RARRAY\_PTR(a) RARRAY(a)-\>ptr

---

<div class="post-metadata">

**Author:** ![wanabe](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/51bf81/32.png) [@wanabe](https://www.ruby-forum.com/u/wanabe)\
**Post date:** [March 28, 2008, 10:20am UTC](https://www.ruby-forum.com/t/array-shift-unshift-b-n9bb-2-b/133132/2 "2008-03-28T10:20:03Z")

</div>

e$B$J$+$@$G$9!#e(B

At Fri, 28 Mar 2008 13:34:00 +0900,  
wanabe wrote in [ruby-dev:34163]:

> #define RARRAY\_LEN(a) RARRAY(a)-\>len  
> #define RARRAY\_PTR(a) RARRAY(a)-\>ptr

RArraye$B$K$O$b$&6u$-$,$J$$$N$G!“A4%\*%V%8%’%/%H$N%5%$%:$,e(B1worde$BA}$(e(B  
e$B$F$7$^$&!”$H$$$&$N$OG:$^$7$$$G$9$M!#e(B

---

<div class="post-metadata">

**Author:** ![wanabe](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/51bf81/32.png) [@wanabe](https://www.ruby-forum.com/u/wanabe)\
**Post date:** [March 28, 2008, 1:32pm UTC](https://www.ruby-forum.com/t/array-shift-unshift-b-n9bb-2-b/133132/3 "2008-03-28T13:32:23Z")

</div>

e$B@\>;3OB9-$G$9!#e(B

At Fri, 28 Mar 2008 18:19:45 +0900,  
Nobuyoshi N. wrote:

> RArraye$B$K$O$b$&6u$-$,$J$$$N$G!“A4%\*%V%8%’%/%H$N%5%$%:$,e(B1worde$BA}$(e(B  
> e$B$F$7$^$&!”$H$$$&$N$OG:$^$7$$$G$9$M!#e(B

e$B\<BAu$NBgJQ$5$H$+$O9M$($:$KC1$K%"%$%G%"$@$1$G$9$,!"e(Baux.capae$B$re(B  
lene$B$H$N:9J,$K$9$k$J$I$NJ}K!$Ge(Blonge$B$h$j\>.$5$$@0?t7?$KJQ$($F!“e(B  
lcapae$B$H0l=o$Ke(Bauxe$B$N$H$3$m$K5M$a9~$`!”$H$$$&$N$O$I$&$G$7$g$&$+e(B?

---

<div class="post-metadata">

**Author:** ![wanabe](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/51bf81/32.png) [@wanabe](https://www.ruby-forum.com/u/wanabe)\
**Post date:** [March 31, 2008, 8:31am UTC](https://www.ruby-forum.com/t/array-shift-unshift-b-n9bb-2-b/133132/4 "2008-03-31T08:31:48Z")

</div>

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:34173] Re: Array#shift/unshift  
e$B$N9bB.2=e(B”  
on Fri, 28 Mar 2008 23:21:59 +0900, wanabe [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
writes:

|08/03/28 e$B$Ke(B Nobuyoshi N.[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) e$B$5$s$O=q$-$^$7$?e(B:  
|\> RArraye$B$K$O$b$&6u$-$,$J$$$N$G!“A4%\*%V%8%'%/%H$N%5%$%:$,e(B1worde$BA}$(e(B  
|\> e$B$F$7$^$&!”$H$$$&$N$OG:$^$7$$$G$9$M!#e(B  
|  
|e$B85$N%Q%C%A$HF1$8$/!“A0J}$K6u$-%a%b%j$,$”$k$+$I$&$+$N%U%i%0$r?7@_$7$Fe(B  
|e$B6u$-$,$"$k$H$-$@$1e(BRARRAY\_PTR(ary)[-1]e$B$K%5%$%:$r=q$-9~$`$h$&$K$7$F$_$^$7$?!#e(B

e$B$"$j$,$H$&$4$6$$$^$9!#$G$b!"e(Bmake  
test-alle$B$G$Oe(BSEGVe$B$9$k$h$&$Ge(B  
e$B$9!#A02s$b$=$&$G$7$?$,!"0l4S@-$r0];}$9$k$N$O$+$J$jFq$7$$$\_$?e(B  
e$B$$$G$9$M!#e(B

---

<div class="post-metadata">

**Author:** ![wanabe](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/51bf81/32.png) [@wanabe](https://www.ruby-forum.com/u/wanabe)\
**Post date:** [March 28, 2008, 3:22pm UTC](https://www.ruby-forum.com/t/array-shift-unshift-b-n9bb-2-b/133132/5 "2008-03-28T15:22:48Z")

</div>

e$B%o%J%Y$G$9!#e(B

08/03/28 e$B$Ke(B Nobuyoshi N.[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
e$B$5$s$O=q$-$^$7$?e(B:

> RArraye$B$K$O$b$&6u$-$,$J$$$N$G!“A4%\*%V%8%'%/%H$N%5%$%:$,e(B1worde$BA}$(e(B  
> e$B$F$7$^$&!”$H$$$&$N$OG:$^$7$$$G$9$M!#e(B

e$B85$N%Q%C%A$HF1$8$/!“A0J}$K6u$-%a%b%j$,$”$k$+$I$&$+$N%U%i%0$r?7@_$7$Fe(B  
e$B6u$-$,$"$k$H$-$@$1e(BRARRAY\_PTR(ary)[-1]e$B$K%5%$%:$r=q$-9~$`$h$&$K$7$F$_$^$7$?!#e(B

# Index: array.c

— array.c (revision 15844)  
+++ array.c (working copy)  
@@ -20,6 +20,7 @@  
static ID id\_cmp;

#define ARY\_DEFAULT\_SIZE 16  
+#define ARY\_DEFAULT\_LCAPA 4

void  
rb\_mem\_clear(register VALUE \*mem, register long size)  
@@ -45,11 +46,65 @@

#define ARY\_CAPA(ary) RARRAY(ary)-\>aux.capa  
#define RESIZE\_CAPA(ary,capacity) do {\

- REALLOC\_N(RARRAY(ary)-\>ptr, VALUE, (capacity));\

- long lcapacity = ARY\_LCAPA(ary);\
- RARRAY(ary)-\>ptr -= lcapacity;\
- REALLOC\_N(RARRAY(ary)-\>ptr, VALUE, (capacity) + lcapacity);\
- RARRAY(ary)-\>ptr += lcapacity;  
RARRAY(ary)-\>aux.capa = (capacity);  
} while (0)

+#define ARY\_LCAPA(ary)\

- (FL\_TEST(ary, RARRAY\_LFREE) ? (long)RARRAY\_PTR(ary)[-1] : 0)  
+#define RARRAY\_TOP\_PTR(ary) (RARRAY\_PTR(ary) - ARY\_LCAPA(ary))
- 

static inline void  
+rb\_ary\_copy\_lcapa(VALUE dst, VALUE src)  
+{

- if (FL\_TEST(src, RARRAY\_LFREE)) {
- FL\_SET(dst, RARRAY\_LFREE);
- RARRAY\_PTR(dst)[-1] = RARRAY\_PTR(src)[-1];
- } else {
- FL\_UNSET(dst, RARRAY\_LFREE);
- }  
+}
- 

+static inline void  
+rb\_ary\_set\_lcapa\_val(VALUE ary, long lcapacity)  
+{

- if (lcapacity != 0) {
- FL\_SET(ary, RARRAY\_LFREE);
- RARRAY\_PTR(ary)[-1] = lcapacity;
- } else {
- FL\_UNSET(ary, RARRAY\_LFREE);
- }  
+}
- 

+static inline void  
+rb\_ary\_slide\_capa\_vals(VALUE ary, long offset)  
+{

- if (offset \< 0) {
- rb\_raise(rb\_eNotImpError, “[BUG] array negative shift”); /\* todo? \*/
- } else {
- RARRAY\_PTR(ary)[offset - 1] = offset + ARY\_LCAPA(ary);
- FL\_SET(ary, RARRAY\_LFREE);
- }
- RARRAY(ary)-\>aux.capa -= offset;  
+}
- 

+static inline void  
+rb\_ary\_resize\_lcapa(VALUE ary, long lcapacity)  
+{

- long offset = lcapacity - ARY\_LCAPA(ary);
- if (lcapacity \< 0 || offset \> RARRAY(ary)-\>aux.capa -  
RARRAY\_LEN(ary)) {
- rb\_raise(rb\_eIndexError, “[BUG] invalid left-capacity”);
- }
- RARRAY\_PTR(ary) += offset;
- MEMMOVE(RARRAY\_PTR(ary), RARRAY\_PTR(ary) - offset, VALUE,  
RARRAY\_LEN(ary));
- RARRAY(ary)-\>aux.capa -= offset;
- rb\_ary\_set\_lcapa\_val(ary,lcapacity);  
+}
- 

+static inline void  
rb\_ary\_modify\_check(VALUE ary)  
{  
if (OBJ\_FROZEN(ary)) rb\_error\_frozen(“array”);  
@@ -67,6 +122,7 @@  
ptr = ALLOC\_N(VALUE, RARRAY\_LEN(ary));  
FL\_UNSET(ary, ELTS\_SHARED);  
RARRAY(ary)-\>aux.capa = RARRAY\_LEN(ary);

- FL\_UNSET(ary, RARRAY\_LFREE);  
MEMCPY(ptr, RARRAY\_PTR(ary), VALUE, RARRAY\_LEN(ary));  
RARRAY(ary)-\>ptr = ptr;  
}  
@@ -102,6 +158,7 @@  
ary-\>len = 0;  
ary-\>ptr = 0;  
ary-\>aux.capa = 0;

- FL\_UNSET(ary, RARRAY\_LFREE);

- FL\_UNSET(RARRAY(ary), RARRAY\_LFREE);

- return rb\_ary\_new2(ARY\_DEFAULT\_SIZE);

- VALUE ary = rb\_ary\_new2(ARY\_DEFAULT\_SIZE + ARY\_DEFAULT\_LCAPA);  
+#if ARY\_DEFAULT\_LCAPA != 0
- FL\_SET(ary, RARRAY\_LFREE);
- RARRAY(ary)-\>ptr += ARY\_DEFAULT\_LCAPA;
- RARRAY\_PTR(ary)[-1] = ARY\_DEFAULT\_LCAPA;  
+#endif
- RARRAY(ary)-\>aux.capa = ARY\_DEFAULT\_SIZE;
- return ary;  
}

#include \<stdarg.h\>  
@@ -177,7 +242,7 @@  
rb\_ary\_free(VALUE ary)  
{  
if (!ARY\_SHARED\_P(ary)) {

- xfree(RARRAY(ary)-\>ptr);

- xfree(RARRAY\_TOP\_PTR(ary));  
}  
}

@@ -194,6 +259,9 @@  
shared-\>len = RARRAY(ary)-\>len;  
shared-\>ptr = RARRAY(ary)-\>ptr;  
shared-\>aux.capa = RARRAY(ary)-\>aux.capa;

- if(FL\_TEST(shared, RARRAY\_LFREE)) {
- 

```
 FL_SET(ary, RARRAY_LFREE);

```

- }  
RARRAY(ary)-\>aux.shared = (VALUE)shared;  
FL\_SET(ary, ELTS\_SHARED);  
OBJ\_FREEZE(shared);  
@@ -292,7 +360,7 @@  
rb\_ary\_modify(ary);  
if (argc == 0) {  
if (RARRAY\_PTR(ary) && !ARY\_SHARED\_P(ary)) {

- 

```
 free(RARRAY(ary)->ptr);

```

- 

```
 free(RARRAY_TOP_PTR(ary));

```

}  
RARRAY(ary)-\>len = 0;  
if (rb\_block\_given\_p()) {  
@@ -355,6 +423,7 @@  
}  
RARRAY(ary)-\>ptr = ALLOC\_N(VALUE, argc);  
RARRAY(ary)-\>aux.capa = argc;
- FL\_UNSET(RARRAY(ary), RARRAY\_LFREE);  
MEMCPY(RARRAY\_PTR(ary), argv, VALUE, argc);  
RARRAY(ary)-\>len = argc;

@@ -533,13 +602,10 @@  
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);

- 

```
 RARRAY(ary)->len--;

```

- 

```
 return top;

```

- if (RARRAY\_LEN(ary) \* 2 \< ARY\_LCAPA(ary)) {
- 

```
 rb_ary_resize_lcapa(ary, RARRAY_LEN(ary));

```

}

- RARRAY\_PTR(ary)[0] = Qnil;
- ary\_make\_shared(ary);

- rb\_ary\_slide\_capa\_vals(ary, 1);  
}  
RARRAY(ary)-\>ptr++; /\* shift ptr \*/  
RARRAY(ary)-\>len–;  
@@ -577,14 +643,11 @@  
rb\_ary\_modify\_check(ary);  
result = ary\_shared\_first(argc, argv, ary, Qfalse);  
n = RARRAY\_LEN(result);

- if (ARY\_SHARED\_P(ary)) {
- RARRAY(ary)-\>ptr += n;
- RARRAY(ary)-\>len -= n;
- }
- else {
- MEMMOVE(RARRAY\_PTR(ary), RARRAY\_PTR(ary)+n, VALUE,  
RARRAY\_LEN(ary)-n);
- RARRAY(ary)-\>len -= n;

- if (!ARY\_SHARED\_P(ary)) {

- rb\_ary\_slide\_capa\_vals(ary, n);  
}

- RARRAY(ary)-\>ptr += n;

- RARRAY(ary)-\>len -= n;

- long lcapa;

- if (RARRAY(ary)-\>aux.capa \<= (len = RARRAY(ary)-\>len) + argc) {
- RESIZE\_CAPA(ary, len + argc + ARY\_DEFAULT\_SIZE);

- lcapa = ARY\_LCAPA(ary);
- if (lcapa \< argc) {
- long add\_capa = ARY\_DEFAULT\_SIZE;
- long add\_lcapa = argc + ARY\_DEFAULT\_LCAPA;
- if (RARRAY(ary)-\>aux.capa \<= (len = RARRAY(ary)-\>len) + add\_lcapa) {
- 

```
 RESIZE_CAPA(ary, len + add_capa + add_lcapa);

```

- }
- lcapa += add\_lcapa;
- rb\_ary\_resize\_lcapa(ary, lcapa);  
}

- /\* sliding items \*/
- MEMMOVE(RARRAY(ary)-\>ptr + argc, RARRAY(ary)-\>ptr, VALUE, len);

- RARRAY(ary)-\>ptr -= argc;

- RARRAY(ary)-\>aux.capa += argc;  
MEMCPY(RARRAY(ary)-\>ptr, argv, VALUE, argc);

- rb\_ary\_set\_lcapa\_val(ary, lcapa - argc);  
RARRAY(ary)-\>len += argc;

- rb\_ary\_copy\_lcapa(ary, tmp);  
FL\_UNSET(ary, ELTS\_SHARED);  
rb\_gc\_force\_recycle(tmp);  
}  
@@ -2019,7 +2092,7 @@  
if (copy == orig) return copy;  
shared = ary\_make\_shared(orig);  
if (!ARY\_SHARED\_P(copy)) {

- ptr = RARRAY(copy)-\>ptr;

- ptr = RARRAY\_TOP\_PTR(copy);  
xfree(ptr);  
}  
RARRAY(copy)-\>ptr = RARRAY(orig)-\>ptr;  
Index: include/ruby/ruby.h  
===================================================================  
— include/ruby/ruby.h (revision 15844)  
+++ include/ruby/ruby.h (working copy)  
@@ -499,6 +499,8 @@  
} aux;  
VALUE \*ptr;  
};
- 

+#define RARRAY\_LFREE FL\_USER3  
#define RARRAY\_LEN(a) RARRAY(a)-\>len  
#define RARRAY\_PTR(a) RARRAY(a)-\>ptr

---

<div class="post-metadata">

**Author:** ![wanabe](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/51bf81/32.png) [@wanabe](https://www.ruby-forum.com/u/wanabe)\
**Post date:** [March 31, 2008, 1:09pm UTC](https://www.ruby-forum.com/t/array-shift-unshift-b-n9bb-2-b/133132/6 "2008-03-31T13:09:56Z")

</div>

e$B%o%J%Y$G$9!#e(B

08/03/31 e$B$Ke(B Yukihiro M.[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
e$B$5$s$O=q$-$^$7$?e(B:

> e$B$"$j$,$H$&$4$6$$$^$9!#$G$b!"e(Bmake test-alle$B$G$Oe(BSEGVe$B$9$k$h$&$Ge(B  
> e$B$9!#A02s$b$=$&$G$7$?$,!"0l4S@-$r0];}$9$k$N$O$+$J$jFq$7$$$\_$?e(B  
> e$B$$$G$9$M!#e(B

e$B3NG’$I$&$b$“$j$,$H$&$4$6$$$^$9!#e(B  
e$B\<j85$G$O2?EY$+%F%9%H$ODL$C$?$H;W$C$?$N$G$9$,!”$^$@4E$+$C$?$h$&$G$9!#e(B

e$B$b$7$^$?5!2q$,$“$l$P!”$7$C$+$j%A%'%C%/$7$?\>e$G=PD\>$7$^$9!#$I$&$b$\*A{$,$;$7$^$7$?!#e(B

---

<div class="post-metadata">

**Author:** ![wanabe](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/51bf81/32.png) [@wanabe](https://www.ruby-forum.com/u/wanabe)\
**Post date:** [April 12, 2008, 2:28pm UTC](https://www.ruby-forum.com/t/array-shift-unshift-b-n9bb-2-b/133132/7 "2008-04-12T14:28:17Z")

</div>

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:34249] Re: Array#shift/unshift  
e$B$N9bB.2=e(B”  
on Fri, 4 Apr 2008 11:29:22 +0900, wanabe [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
writes:

|e$B$I$&$K$+$7$F\<+J,$G=$@5$7$h$&$H$7$?$N$G$9$,!"A4$/:F8=$7$^$;$s!#e(B  
|e$B$h$m$7$1$l$P$I$N%F%9%H$N$I$N2U=j$Ge(B SEGV e$B$7$?$+65$($FD:$1$J$$$G$7$g$&$+!#e(B

e$B;d$N;H$C$F$$$ke(B

ruby 1.9.0 (2008-04-12 revision 0) [i686-linux]

e$B$G$O!“$[$$”$i$f$k%F%9%H$GMn$A$^$9!#$G!"LdBj$J$N$O8DJL$N%F%9e(B  
e$B%H$G$O$J$$$h$&$G$9!#%P%C%/%H%l!\<%9$G$Oe(B

/home/matz/work/ruby/lib/test/unit/collector/dir.rb:91

e$B$,I=\<($5$l$F$$$^$9!#;~4V$,\<h$l$?$i$b$&$A$g$C$HD4$Y$F$\_$^$9!#e(B

# e$B3N$+A02s$b;w$?$h$&$J\>u67$G\<h$j9~$a$J$+$C$?$h$&$J!#e(B

---

<div class="post-metadata">

**Author:** ![wanabe](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/51bf81/32.png) [@wanabe](https://www.ruby-forum.com/u/wanabe)\
**Post date:** [April 4, 2008, 4:29am UTC](https://www.ruby-forum.com/t/array-shift-unshift-b-n9bb-2-b/133132/8 "2008-04-04T04:29:53Z")

</div>

e$B%o%J%Y$G$9!#e(B

e$B$I$&$K$+$7$F\<+J,$G=$@5$7$h$&$H$7$?$N$G$9$,!"A4$/:F8=$7$^$;$s!#e(B  
e$B$h$m$7$1$l$P$I$N%F%9%H$N$I$N2U=j$Ge(B SEGV  
e$B$7$?$+65$($FD:$1$J$$$G$7$g$&$+!#e(B
