X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=pp_sort.c;h=a239c01db82e2307db284ba816c6b95a79c8fd23;hb=502c6561fcd473b7da3277363169d75f16ac2f8b;hp=6899ff491bdbc9c8de84856e692e533c618ebd3f;hpb=9c6bc640227cd4fa081b32554378abe794cacfc0;p=p5sagit%2Fp5-mst-13.2.git diff --git a/pp_sort.c b/pp_sort.c index 6899ff4..a239c01 100644 --- a/pp_sort.c +++ b/pp_sort.c @@ -1,7 +1,7 @@ /* pp_sort.c * - * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, - * 2000, 2001, 2002, 2003, 2004, 2005, 2006, by Larry Wall and others + * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, + * 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others * * You may distribute under the terms of either the GNU General Public * License or the Artistic License, as specified in the README file. @@ -340,7 +340,7 @@ typedef struct { static I32 -cmp_desc(pTHX_ gptr a, gptr b) +cmp_desc(pTHX_ gptr const a, gptr const b) { dVAR; return -PL_sort_RealCmp(aTHX_ a, b); @@ -762,10 +762,8 @@ STATIC void /* the standard unstable (u) quicksort (qsort) */ S_qsortsvu(pTHX_ SV ** array, size_t num_elts, SVCOMPARE_t compare) { register SV * temp; - struct partition_stack_entry partition_stack[QSORT_MAX_STACK]; int next_stack_entry = 0; - int part_left; int part_right; #ifdef QSORT_ORDER_GUESS @@ -773,6 +771,8 @@ S_qsortsvu(pTHX_ SV ** array, size_t num_elts, SVCOMPARE_t compare) int swapped; #endif + PERL_ARGS_ASSERT_QSORTSVU; + /* Make sure we actually have work to do. */ if (num_elts <= 1) { @@ -1315,7 +1315,7 @@ S_qsortsvu(pTHX_ SV ** array, size_t num_elts, SVCOMPARE_t compare) static I32 -cmpindir(pTHX_ gptr a, gptr b) +cmpindir(pTHX_ gptr const a, gptr const b) { dVAR; gptr * const ap = (gptr *)a; @@ -1328,7 +1328,7 @@ cmpindir(pTHX_ gptr a, gptr b) } static I32 -cmpindir_desc(pTHX_ gptr a, gptr b) +cmpindir_desc(pTHX_ gptr const a, gptr const b) { dVAR; gptr * const ap = (gptr *)a; @@ -1441,6 +1441,8 @@ flexible routine. void Perl_sortsv(pTHX_ SV **array, size_t nmemb, SVCOMPARE_t cmp) { + PERL_ARGS_ASSERT_SORTSV; + sortsv_flags(array, nmemb, cmp, 0); } @@ -1454,6 +1456,8 @@ Sort an array, with various options. void Perl_sortsv_flags(pTHX_ SV **array, size_t nmemb, SVCOMPARE_t cmp, U32 flags) { + PERL_ARGS_ASSERT_SORTSV_FLAGS; + if (flags & SORTf_QSORT) S_qsortsv(aTHX_ array, nmemb, cmp, flags); else @@ -1525,7 +1529,7 @@ PP(pp_sort) SV *tmpstr = sv_newmortal(); gv_efullname3(tmpstr, gv, NULL); DIE(aTHX_ "Undefined sort subroutine \"%"SVf"\" called", - (void*)tmpstr); + SVfARG(tmpstr)); } else { DIE(aTHX_ "Undefined subroutine in sort"); @@ -1549,15 +1553,16 @@ PP(pp_sort) if (priv & OPpSORT_INPLACE) { assert( MARK+1 == SP && *SP && SvTYPE(*SP) == SVt_PVAV); (void)POPMARK; /* remove mark associated with ex-OP_AASSIGN */ - av = (AV*)(*SP); + av = MUTABLE_AV((*SP)); max = AvFILL(av) + 1; if (SvMAGICAL(av)) { MEXTEND(SP, max); - p2 = SP; for (i=0; i < max; i++) { SV **svp = av_fetch(av, i, FALSE); *SP++ = (svp) ? *svp : NULL; } + SP--; + p1 = p2 = SP - (max-1); } else { if (SvREADONLY(av)) @@ -1658,10 +1663,10 @@ PP(pp_sort) if (hasargs) { /* This is mostly copied from pp_entersub */ - AV * const av = (AV*)PAD_SVl(0); + AV * const av = MUTABLE_AV(PAD_SVl(0)); cx->blk_sub.savearray = GvAV(PL_defgv); - GvAV(PL_defgv) = (AV*)SvREFCNT_inc_simple(av); + GvAV(PL_defgv) = MUTABLE_AV(SvREFCNT_inc_simple(av)); CX_CURPAD_SAVE(cx->blk_sub); cx->blk_sub.argarray = av; } @@ -1713,7 +1718,7 @@ PP(pp_sort) SvREADONLY_off(av); else if (av && !sorting_av) { /* simulate pp_aassign of tied AV */ - SV** const base = ORIGMARK+1; + SV** const base = MARK+1; for (i=0; i < max; i++) { base[i] = newSVsv(base[i]); } @@ -1734,12 +1739,15 @@ PP(pp_sort) } static I32 -S_sortcv(pTHX_ SV *a, SV *b) +S_sortcv(pTHX_ SV *const a, SV *const b) { dVAR; const I32 oldsaveix = PL_savestack_ix; const I32 oldscopeix = PL_scopestack_ix; I32 result; + + PERL_ARGS_ASSERT_SORTCV; + GvSV(PL_firstgv) = a; GvSV(PL_secondgv) = b; PL_stack_sp = PL_stack_base; @@ -1758,7 +1766,7 @@ S_sortcv(pTHX_ SV *a, SV *b) } static I32 -S_sortcv_stacked(pTHX_ SV *a, SV *b) +S_sortcv_stacked(pTHX_ SV *const a, SV *const b) { dVAR; const I32 oldsaveix = PL_savestack_ix; @@ -1766,6 +1774,8 @@ S_sortcv_stacked(pTHX_ SV *a, SV *b) I32 result; AV * const av = GvAV(PL_defgv); + PERL_ARGS_ASSERT_SORTCV_STACKED; + if (AvMAX(av) < 1) { SV** ary = AvALLOC(av); if (AvARRAY(av) != ary) { @@ -1798,14 +1808,16 @@ S_sortcv_stacked(pTHX_ SV *a, SV *b) } static I32 -S_sortcv_xsub(pTHX_ SV *a, SV *b) +S_sortcv_xsub(pTHX_ SV *const a, SV *const b) { dVAR; dSP; const I32 oldsaveix = PL_savestack_ix; const I32 oldscopeix = PL_scopestack_ix; - CV * const cv=(CV*)PL_sortcop; + CV * const cv=MUTABLE_CV(PL_sortcop); I32 result; + PERL_ARGS_ASSERT_SORTCV_XSUB; + SP = PL_stack_base; PUSHMARK(SP); EXTEND(SP, 2); @@ -1827,18 +1839,24 @@ S_sortcv_xsub(pTHX_ SV *a, SV *b) static I32 -S_sv_ncmp(pTHX_ SV *a, SV *b) +S_sv_ncmp(pTHX_ SV *const a, SV *const b) { const NV nv1 = SvNSIV(a); const NV nv2 = SvNSIV(b); + + PERL_ARGS_ASSERT_SV_NCMP; + return nv1 < nv2 ? -1 : nv1 > nv2 ? 1 : 0; } static I32 -S_sv_i_ncmp(pTHX_ SV *a, SV *b) +S_sv_i_ncmp(pTHX_ SV *const a, SV *const b) { const IV iv1 = SvIV(a); const IV iv2 = SvIV(b); + + PERL_ARGS_ASSERT_SV_I_NCMP; + return iv1 < iv2 ? -1 : iv1 > iv2 ? 1 : 0; } @@ -1850,10 +1868,13 @@ S_sv_i_ncmp(pTHX_ SV *a, SV *b) #define SORT_NORMAL_RETURN_VALUE(val) (((val) > 0) ? 1 : ((val) ? -1 : 0)) static I32 -S_amagic_ncmp(pTHX_ register SV *a, register SV *b) +S_amagic_ncmp(pTHX_ register SV *const a, register SV *const b) { dVAR; SV * const tmpsv = tryCALL_AMAGICbin(a,b,ncmp); + + PERL_ARGS_ASSERT_AMAGIC_NCMP; + if (tmpsv) { if (SvIOK(tmpsv)) { const I32 i = SvIVX(tmpsv); @@ -1868,10 +1889,13 @@ S_amagic_ncmp(pTHX_ register SV *a, register SV *b) } static I32 -S_amagic_i_ncmp(pTHX_ register SV *a, register SV *b) +S_amagic_i_ncmp(pTHX_ register SV *const a, register SV *const b) { dVAR; SV * const tmpsv = tryCALL_AMAGICbin(a,b,ncmp); + + PERL_ARGS_ASSERT_AMAGIC_I_NCMP; + if (tmpsv) { if (SvIOK(tmpsv)) { const I32 i = SvIVX(tmpsv); @@ -1886,10 +1910,13 @@ S_amagic_i_ncmp(pTHX_ register SV *a, register SV *b) } static I32 -S_amagic_cmp(pTHX_ register SV *str1, register SV *str2) +S_amagic_cmp(pTHX_ register SV *const str1, register SV *const str2) { dVAR; SV * const tmpsv = tryCALL_AMAGICbin(str1,str2,scmp); + + PERL_ARGS_ASSERT_AMAGIC_CMP; + if (tmpsv) { if (SvIOK(tmpsv)) { const I32 i = SvIVX(tmpsv); @@ -1904,10 +1931,13 @@ S_amagic_cmp(pTHX_ register SV *str1, register SV *str2) } static I32 -S_amagic_cmp_locale(pTHX_ register SV *str1, register SV *str2) +S_amagic_cmp_locale(pTHX_ register SV *const str1, register SV *const str2) { dVAR; SV * const tmpsv = tryCALL_AMAGICbin(str1,str2,scmp); + + PERL_ARGS_ASSERT_AMAGIC_CMP_LOCALE; + if (tmpsv) { if (SvIOK(tmpsv)) { const I32 i = SvIVX(tmpsv);