# \[Bug:1.9\] replacing array during sort may make assertion fail

**URL:** <https://www.ruby-forum.com/t/bug-1-9-replacing-array-during-sort-may-make-assertion-fail/152044>\
**Category:** Development\
**Created:** [October 29, 2008, 1:35pm UTC](https://www.ruby-forum.com/t/bug-1-9-replacing-array-during-sort-may-make-assertion-fail/152044 "2008-10-29T13:35:54Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [October 29, 2008, 1:35pm UTC](https://www.ruby-forum.com/t/bug-1-9-replacing-array-during-sort-may-make-assertion-fail/152044/1 "2008-10-29T13:35:54Z")

</div>

e$B1sF#$G$9!#e(B

e$B0J2\<$N$h$&$K$9$k$He(B assert e$B$,\<:GT$7$^$9!#e(B

$ ./ruby -e ‘a = [4,3,2,1]; a.sort! {|x,y| a.replace([]); x \<=\> y }’  
ruby: array.c:1755: rb\_ary\_sort\_bang: Assertion `(((void)  
((!((!(((VALUE)(tmp) & RUBY\_IMMEDIATE\_MASK) || !(((VALUE)(tmp) &  
~((VALUE)RUBY\_Qnil)) != 0)) && (((struct RBasic\*)(tmp))-\>flags &  
RUBY\_T\_MASK) != RUBY\_T\_NODE)?(((struct  
RBasic\*)(tmp))-\>flags&((((VALUE)1)\<\<(12+2)))):0) || !((!(((VALUE)(tmp)  
& RUBY\_IMMEDIATE\_MASK) || !(((VALUE)(tmp) & ~((VALUE)RUBY\_Qnil)) !=  
0)) && (((struct RBasic\*)(tmp))-\>flags & RUBY\_T\_MASK) !=  
RUBY\_T\_NODE)?(((struct  
RBasic\*)(tmp))-\>flags&((((VALUE)1)\<\<(12+1)))):0)) ? 0 : (\_\_assert\_fail  
("!((!(((VALUE)(tmp) & RUBY\_IMMEDIATE\_MASK) || !(((VALUE)(tmp) &  
~((VALUE)RUBY\_Qnil)) != 0)) && (((struct RBasic\*)(tmp))-\>flags &  
RUBY\_T\_MASK) != RUBY\_T\_NODE)?(((struct  
RBasic\*)(tmp))-\>flags&((((VALUE)1)\<\<(12+2)))):0) || !((!(((VALUE)(tmp)  
& RUBY\_IMMEDIATE\_MASK) || !(((VALUE)(tmp) & ~((VALUE)RUBY\_Qnil)) !=  
0)) && (((struct RBasic\*)(tmp))-\>flags & RUBY\_T\_MASK) !=  
RUBY\_T\_NODE)?(((struct  
RBasic\*)(tmp))-\>flags&((((VALUE)1)\<\<(12+1)))):0)", “array.c”, 1755,  
**PRETTY\_FUNCTION** ), 0))), ((!(((VALUE)(tmp) & RUBY\_IMMEDIATE\_MASK)  
|| !(((VALUE)(tmp) & ~((VALUE)RUBY\_Qnil)) != 0)) && (((struct  
RBasic\*)(tmp))-\>flags & RUBY\_T\_MASK) != RUBY\_T\_NODE)?(((struct  
RBasic\*)(tmp))-\>flags&((((VALUE)1)\<\<(12+1)))):0))’ failed.  
e$B%"%!\<%H$7$^$7$?e(B

e$B0J2\<$N=$@5$G$$$$$G$7$g$&$+!#e(B

# Index: array.c

— array.c (revision 20023)  
+++ array.c (working copy)  
@@ -1751,14 +1751,14 @@  
ruby\_qsort(RARRAY\_PTR(tmp), RARRAY\_LEN(tmp), sizeof(VALUE),  
rb\_block\_given\_p()?sort\_1:sort\_2, &data);

- 

```
   if (ARY_EMBED_P(ary) || ARY_EMBED_P(tmp)) {

```

- 

```
   if (ARY_EMBED_P(tmp)) {
       assert(ARY_EMBED_P(tmp));
       MEMCPY(RARRAY_PTR(ary), ARY_EMBED_PTR(tmp), VALUE,

```

ARY\_EMBED\_LEN(tmp));  
ARY\_SET\_LEN(ary, ARY\_EMBED\_LEN(tmp));  
}  
else {

- 

```
       assert(!ARY_EMBED_P(ary));
       assert(!ARY_EMBED_P(tmp));

```

- 

```
       if (ARY_EMBED_P(ary)) FL_UNSET_EMBED(ary);
       if (RARRAY_PTR(ary) != RARRAY_PTR(tmp)) {
           assert(!ARY_SHARED_P(tmp));
           if (ARY_SHARED_P(ary)) {
```

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [November 8, 2008, 10:01am UTC](https://www.ruby-forum.com/t/bug-1-9-replacing-array-during-sort-may-make-assertion-fail/152044/2 "2008-11-08T10:01:13Z")

</div>

e$B%A%1%C%He(B #697 e$B$,99?7$5$l$^$7$?!#e(B (by Yukihiro M.)

e$B%9%F!\<%?%9e(B Opene$B$+$ie(BClosede$B$KJQ99e(B

## fixed by r20026

[http://redmine.ruby-lang.org/issues/show/697](http://redmine.ruby-lang.org/issues/show/697)
