Sorts self. Comparisons for the sort will be done using the <=> operator
or using an optional code block. The block implements a comparison between
a and b, returning -1, 0, or +1. See also
Enumerable#sort_by.

VALUErb_ary_sort_bang(VALUEary){rb_ary_modify(ary);assert(!ARY_SHARED_P(ary));if(RARRAY_LEN(ary)>1){VALUEtmp=ary_make_substitution(ary);/* only ary refers tmp */structary_sort_datadata;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));if(ARY_SHARED_P(ary)){/* ary might be destructively operated in the given block */rb_ary_unshare(ary);}FL_SET_EMBED(ary);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(tmp));if(ARY_HEAP_PTR(ary)==ARY_HEAP_PTR(tmp)){assert(!ARY_EMBED_P(ary));FL_UNSET_SHARED(ary);ARY_SET_CAPA(ary,ARY_CAPA(tmp));}else{assert(!ARY_SHARED_P(tmp));if(ARY_EMBED_P(ary)){FL_UNSET_EMBED(ary);}elseif(ARY_SHARED_P(ary)){/* ary might be destructively operated in the given block */rb_ary_unshare(ary);}else{xfree(ARY_HEAP_PTR(ary));}ARY_SET_PTR(ary,RARRAY_PTR(tmp));ARY_SET_HEAP_LEN(ary,RARRAY_LEN(tmp));ARY_SET_CAPA(ary,ARY_CAPA(tmp));}/* tmp was lost ownership for the ptr */FL_UNSET(tmp,FL_FREEZE);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;}returnary;}