X-Git-Url: https://perl5.git.perl.org/perl5.git/blobdiff_plain/ad64d0ecd555e97c5a216efca1ec5a96b7fd0b34..c8321e06185aa02d661de31e6bb8bf811e513fab:/pp_sort.c diff --git a/pp_sort.c b/pp_sort.c index d520f81..c91aab0 100644 --- a/pp_sort.c +++ b/pp_sort.c @@ -9,8 +9,10 @@ */ /* - * ...they shuffled back towards the rear of the line. 'No, not at the - * rear!' the slave-driver shouted. 'Three files up. And stay there... + * ...they shuffled back towards the rear of the line. 'No, not at the + * rear!' the slave-driver shouted. 'Three files up. And stay there... + * + * [p.931 of _The Lord of the Rings_, VI/ii: "The Land of Shadow"] */ /* This file contains pp ("push/pop") functions that @@ -51,9 +53,12 @@ * The original code was written in conjunction with BSD Computer Software * Research Group at University of California, Berkeley. * - * See also: "Optimistic Merge Sort" (SODA '92) + * See also: "Optimistic Sorting and Information Theoretic Complexity" + * Peter McIlroy + * SODA (Fourth Annual ACM-SIAM Symposium on Discrete Algorithms), + * pp 467-474, Austin, Texas, 25-27 January 1993. * - * The integration to Perl is by John P. Linderman . + * The integration to Perl is by John P. Linderman . * * The code can be distributed under the same terms as Perl itself. * @@ -103,7 +108,7 @@ typedef SV * gptr; /* pointers in our lists */ #define FROMTOUPTO(src, dst, lim) do *dst++ = *src++; while(src= t) p = r = t; /* too short to care about */ else { while (((cmp(aTHX_ *(p-1), *p) > 0) == sense) && - ((p -= 2) > q)); + ((p -= 2) > q)) {} if (p <= q) { /* b through r is a (long) run. ** Extend it as far as possible. @@ -342,17 +347,15 @@ typedef struct { static I32 cmp_desc(pTHX_ gptr const a, gptr const b) { - dVAR; return -PL_sort_RealCmp(aTHX_ a, b); } STATIC void S_mergesortsv(pTHX_ gptr *base, size_t nmemb, SVCOMPARE_t cmp, U32 flags) { - dVAR; IV i, run, offset; I32 sense, level; - register gptr *f1, *f2, *t, *b, *p; + gptr *f1, *f2, *t, *b, *p; int iwhich; gptr *aux; gptr *p1; @@ -370,7 +373,7 @@ S_mergesortsv(pTHX_ gptr *base, size_t nmemb, SVCOMPARE_t cmp, U32 flags) } if (nmemb <= SMALLSORT) aux = small; /* use stack for aux array */ - else { Newx(aux,nmemb,gptr); } /* allocate auxilliary array */ + else { Newx(aux,nmemb,gptr); } /* allocate auxiliary array */ level = 0; stackp = stack; stackp->runs = dynprep(aTHX_ base, aux, nmemb, cmp); @@ -390,7 +393,7 @@ S_mergesortsv(pTHX_ gptr *base, size_t nmemb, SVCOMPARE_t cmp, U32 flags) list1 = which[iwhich]; /* area where runs are now */ list2 = which[++iwhich]; /* area for merged runs */ do { - register gptr *l1, *l2, *tp2; + gptr *l1, *l2, *tp2; offset = stackp->offset; f1 = p1 = list1 + offset; /* start of first run */ p = tp2 = list2 + offset; /* where merged run will go */ @@ -420,7 +423,7 @@ S_mergesortsv(pTHX_ gptr *base, size_t nmemb, SVCOMPARE_t cmp, U32 flags) ** and -1 when equality should look high. */ - register gptr *q; + gptr *q; if (cmp(aTHX_ *f1, *f2) <= 0) { q = f2; b = f1; t = l1; sense = -1; @@ -547,12 +550,12 @@ S_mergesortsv(pTHX_ gptr *base, size_t nmemb, SVCOMPARE_t cmp, U32 flags) t = NEXT(t); /* where second run will end */ t = PINDEX(base, PNELEM(aux, t)); /* where it now ends */ FROMTOUPTO(f1, f2, t); /* copy both runs */ - NEXT(b) = p; /* paralled pointer for 1st */ + NEXT(b) = p; /* paralleled pointer for 1st */ NEXT(p) = t; /* ... and for second */ } } } -done: + done: if (aux != small) Safefree(aux); /* free iff allocated */ if (flags) { PL_sort_RealCmp = savecmp; /* Restore current comparison routine, if any */ @@ -761,7 +764,7 @@ doqsort_all_asserts( STATIC void /* the standard unstable (u) quicksort (qsort) */ S_qsortsvu(pTHX_ SV ** array, size_t num_elts, SVCOMPARE_t compare) { - register SV * temp; + SV * temp; struct partition_stack_entry partition_stack[QSORT_MAX_STACK]; int next_stack_entry = 0; int part_left; @@ -779,12 +782,12 @@ S_qsortsvu(pTHX_ SV ** array, size_t num_elts, SVCOMPARE_t compare) return; } - /* Innoculate large partitions against quadratic behavior */ + /* Inoculate large partitions against quadratic behavior */ if (num_elts > QSORT_PLAY_SAFE) { - register size_t n; - register SV ** const q = array; + size_t n; + SV ** const q = array; for (n = num_elts; n > 1; ) { - register const size_t j = (size_t)(n-- * Drand01()); + const size_t j = (size_t)(n-- * Drand01()); temp = q[j]; q[j] = q[n]; q[n] = temp; @@ -891,7 +894,7 @@ S_qsortsvu(pTHX_ SV ** array, size_t num_elts, SVCOMPARE_t compare) elements in the middle of the partition, those are the ones we pick here (conveniently pointed at by u_right, pc_left, and u_left). The values of the left, center, and right elements - are refered to as l c and r in the following comments. + are referred to as l c and r in the following comments. */ #ifdef QSORT_ORDER_GUESS @@ -1289,7 +1292,7 @@ S_qsortsvu(pTHX_ SV ** array, size_t num_elts, SVCOMPARE_t compare) * by the original comparison routine on the elements pointed to. * Because we don't move the elements of list1 around through * this phase, we can break ties on elements that compare equal - * using their address in the list1 array, ensuring stabilty. + * using their address in the list1 array, ensuring stability. * This leaves us with something looking like * * indir list1 @@ -1317,7 +1320,6 @@ S_qsortsvu(pTHX_ SV ** array, size_t num_elts, SVCOMPARE_t compare) static I32 cmpindir(pTHX_ gptr const a, gptr const b) { - dVAR; gptr * const ap = (gptr *)a; gptr * const bp = (gptr *)b; const I32 sense = PL_sort_RealCmp(aTHX_ *ap, *bp); @@ -1330,7 +1332,6 @@ cmpindir(pTHX_ gptr const a, gptr const b) static I32 cmpindir_desc(pTHX_ gptr const a, gptr const b) { - dVAR; gptr * const ap = (gptr *)a; gptr * const bp = (gptr *)b; const I32 sense = PL_sort_RealCmp(aTHX_ *ap, *bp); @@ -1346,10 +1347,9 @@ cmpindir_desc(pTHX_ gptr const a, gptr const b) STATIC void S_qsortsv(pTHX_ gptr *list1, size_t nmemb, SVCOMPARE_t cmp, U32 flags) { - dVAR; if ((flags & SORTf_STABLE) != 0) { - register gptr **pp, *q; - register size_t n, j, i; + gptr **pp, *q; + size_t n, j, i; gptr *small[SMALLSORT], **indir, tmp; SVCOMPARE_t savecmp; if (nmemb <= 1) return; /* sorted trivially */ @@ -1374,7 +1374,7 @@ S_qsortsv(pTHX_ gptr *list1, size_t nmemb, SVCOMPARE_t cmp, U32 flags) q = list1; for (n = nmemb; n--; ) { /* Assert A: all elements of q with index > n are already - * in place. This is vacuosly true at the start, and we + * in place. This is vacuously true at the start, and we * put element n where it belongs below (if it wasn't * already where it belonged). Assert B: we only move * elements that aren't where they belong, @@ -1428,11 +1428,11 @@ S_qsortsv(pTHX_ gptr *list1, size_t nmemb, SVCOMPARE_t cmp, U32 flags) =for apidoc sortsv -Sort an array. Here is an example: +Sort an array. Here is an example: - sortsv(AvARRAY(av), av_len(av)+1, Perl_sv_cmp_locale); + sortsv(AvARRAY(av), av_top_index(av)+1, Perl_sv_cmp_locale); -Currently this always uses mergesort. See sortsv_flags for a more +Currently this always uses mergesort. See C> for a more flexible routine. =cut @@ -1470,17 +1470,17 @@ Perl_sortsv_flags(pTHX_ SV **array, size_t nmemb, SVCOMPARE_t cmp, U32 flags) PP(pp_sort) { - dVAR; dSP; dMARK; dORIGMARK; - register SV **p1 = ORIGMARK+1, **p2; - register I32 max, i; + dSP; dMARK; dORIGMARK; + SV **p1 = ORIGMARK+1, **p2; + SSize_t max, i; AV* av = NULL; - HV *stash; GV *gv; CV *cv = NULL; - I32 gimme = GIMME; + U8 gimme = GIMME_V; OP* const nextop = PL_op->op_next; I32 overloading = 0; bool hasargs = FALSE; + bool copytmps; I32 is_xsub = 0; I32 sorting_av = 0; const U8 priv = PL_op->op_private; @@ -1507,29 +1507,46 @@ PP(pp_sort) SAVEVPTR(PL_sortcop); if (flags & OPf_STACKED) { if (flags & OPf_SPECIAL) { - OP *kid = cLISTOP->op_first->op_sibling; /* pass pushmark */ - kid = kUNOP->op_first; /* pass rv2gv */ - kid = kUNOP->op_first; /* pass leave */ - PL_sortcop = kid->op_next; - stash = CopSTASH(PL_curcop); + OP *nullop = OpSIBLING(cLISTOP->op_first); /* pass pushmark */ + assert(nullop->op_type == OP_NULL); + PL_sortcop = nullop->op_next; } else { - cv = sv_2cv(*++MARK, &stash, &gv, 0); + GV *autogv = NULL; + HV *stash; + cv = sv_2cv(*++MARK, &stash, &gv, GV_ADD); + check_cv: if (cv && SvPOK(cv)) { const char * const proto = SvPV_nolen_const(MUTABLE_SV(cv)); if (proto && strEQ(proto, "$$")) { hasargs = TRUE; } } - if (!(cv && CvROOT(cv))) { - if (cv && CvISXSUB(cv)) { - is_xsub = 1; + if (cv && CvISXSUB(cv) && CvXSUB(cv)) { + is_xsub = 1; + } + else if (!(cv && CvROOT(cv))) { + if (gv) { + goto autoload; } - else if (gv) { + else if (!CvANON(cv) && (gv = CvGV(cv))) { + if (cv != GvCV(gv)) cv = GvCV(gv); + autoload: + if (!autogv && ( + autogv = gv_autoload_pvn( + GvSTASH(gv), GvNAME(gv), GvNAMELEN(gv), + GvNAMEUTF8(gv) ? SVf_UTF8 : 0 + ) + )) { + cv = GvCVu(autogv); + goto check_cv; + } + else { SV *tmpstr = sv_newmortal(); gv_efullname3(tmpstr, gv, NULL); DIE(aTHX_ "Undefined sort subroutine \"%"SVf"\" called", SVfARG(tmpstr)); + } } else { DIE(aTHX_ "Undefined subroutine in sort"); @@ -1544,7 +1561,6 @@ PP(pp_sort) } else { PL_sortcop = NULL; - stash = CopSTASH(PL_curcop); } /* optimiser converts "@a = sort @a" to "sort \@a"; @@ -1566,9 +1582,12 @@ PP(pp_sort) } else { if (SvREADONLY(av)) - Perl_croak(aTHX_ PL_no_modify); + Perl_croak_no_modify(); else + { SvREADONLY_on(av); + save_pushptr((void *)av, SAVEt_READONLY_OFF); + } p1 = p2 = AvARRAY(av); sorting_av = 1; } @@ -1581,39 +1600,33 @@ PP(pp_sort) /* shuffle stack down, removing optional initial cv (p1!=p2), plus * any nulls; also stringify or converting to integer or number as * required any args */ + copytmps = !sorting_av && PL_sortcop; for (i=max; i > 0 ; i--) { if ((*p1 = *p2++)) { /* Weed out nulls. */ + if (copytmps && SvPADTMP(*p1)) { + *p1 = sv_mortalcopy(*p1); + } SvTEMP_off(*p1); if (!PL_sortcop) { if (priv & OPpSORT_NUMERIC) { if (priv & OPpSORT_INTEGER) { - if (!SvIOK(*p1)) { - if (SvAMAGIC(*p1)) - overloading = 1; - else - (void)sv_2iv(*p1); - } + if (!SvIOK(*p1)) + (void)sv_2iv_flags(*p1, SV_GMAGIC|SV_SKIP_OVERLOAD); } else { - if (!SvNSIOK(*p1)) { - if (SvAMAGIC(*p1)) - overloading = 1; - else - (void)sv_2nv(*p1); - } + if (!SvNSIOK(*p1)) + (void)sv_2nv_flags(*p1, SV_GMAGIC|SV_SKIP_OVERLOAD); if (all_SIVs && !SvSIOK(*p1)) all_SIVs = 0; } } else { - if (!SvPOK(*p1)) { - if (SvAMAGIC(*p1)) - overloading = 1; - else - (void)sv_2pv_flags(*p1, 0, - SV_GMAGIC|SV_CONST_RETURN); - } + if (!SvPOK(*p1)) + (void)sv_2pv_flags(*p1, 0, + SV_GMAGIC|SV_CONST_RETURN|SV_SKIP_OVERLOAD); } + if (SvAMAGIC(*p1)) + overloading = 1; } p1++; } @@ -1627,38 +1640,43 @@ PP(pp_sort) SV **start; if (PL_sortcop) { PERL_CONTEXT *cx; - SV** newsp; const bool oldcatch = CATCH_GET; + I32 old_savestack_ix = PL_savestack_ix; - SAVETMPS; SAVEOP(); CATCH_SET(TRUE); PUSHSTACKi(PERLSI_SORT); if (!hasargs && !is_xsub) { - SAVESPTR(PL_firstgv); - SAVESPTR(PL_secondgv); - SAVESPTR(PL_sortstash); - PL_firstgv = gv_fetchpvs("a", GV_ADD|GV_NOTQUAL, SVt_PV); - PL_secondgv = gv_fetchpvs("b", GV_ADD|GV_NOTQUAL, SVt_PV); - PL_sortstash = stash; + SAVEGENERICSV(PL_firstgv); + SAVEGENERICSV(PL_secondgv); + PL_firstgv = MUTABLE_GV(SvREFCNT_inc( + gv_fetchpvs("a", GV_ADD|GV_NOTQUAL, SVt_PV) + )); + PL_secondgv = MUTABLE_GV(SvREFCNT_inc( + gv_fetchpvs("b", GV_ADD|GV_NOTQUAL, SVt_PV) + )); + /* make sure the GP isn't removed out from under us for + * the SAVESPTR() */ + save_gp(PL_firstgv, 0); + save_gp(PL_secondgv, 0); + /* we don't want modifications localized */ + GvINTRO_off(PL_firstgv); + GvINTRO_off(PL_secondgv); SAVESPTR(GvSV(PL_firstgv)); SAVESPTR(GvSV(PL_secondgv)); } - PUSHBLOCK(cx, CXt_NULL, PL_stack_base); + gimme = G_SCALAR; + cx = cx_pushblock(CXt_NULL, gimme, PL_stack_base, old_savestack_ix); if (!(flags & OPf_SPECIAL)) { - cx->cx_type = CXt_SUB; - cx->blk_gimme = G_SCALAR; - PUSHSUB(cx); + cx->cx_type = CXt_SUB|CXp_MULTICALL; + cx_pushsub(cx, cv, NULL, hasargs); if (!is_xsub) { - AV* const padlist = CvPADLIST(cv); + PADLIST * const padlist = CvPADLIST(cv); - if (++CvDEPTH(cv) >= 2) { - PERL_STACK_OVERFLOW_CHECK(); + if (++CvDEPTH(cv) >= 2) pad_push(padlist, CvDEPTH(cv)); - } - SAVECOMPPAD(); PAD_SET_CUR_NOSAVE(padlist, CvDEPTH(cv)); if (hasargs) { @@ -1667,26 +1685,32 @@ PP(pp_sort) cx->blk_sub.savearray = GvAV(PL_defgv); GvAV(PL_defgv) = MUTABLE_AV(SvREFCNT_inc_simple(av)); - CX_CURPAD_SAVE(cx->blk_sub); - cx->blk_sub.argarray = av; } } } - cx->cx_type |= CXp_MULTICALL; - + start = p1 - max; sortsvp(aTHX_ start, max, (is_xsub ? S_sortcv_xsub : hasargs ? S_sortcv_stacked : S_sortcv), sort_flags); + /* Reset cx, in case the context stack has been reallocated. */ + cx = CX_CUR(); + + PL_stack_sp = PL_stack_base + cx->blk_oldsp; + + CX_LEAVE_SCOPE(cx); if (!(flags & OPf_SPECIAL)) { - LEAVESUB(cv); - if (!is_xsub) - CvDEPTH(cv)--; + assert(CxTYPE(cx) == CXt_SUB); + cx_popsub(cx); } - POPBLOCK(cx,PL_curpm); - PL_stack_sp = newsp; + else + assert(CxTYPE(cx) == CXt_NULL); + /* there isn't a POPNULL ! */ + + cx_popblock(cx); + CX_POP(cx); POPSTACK; CATCH_SET(oldcatch); } @@ -1698,11 +1722,15 @@ PP(pp_sort) ? ( ( ( priv & OPpSORT_INTEGER) || all_SIVs) ? ( overloading ? S_amagic_i_ncmp : S_sv_i_ncmp) : ( overloading ? S_amagic_ncmp : S_sv_ncmp ) ) - : ( IN_LOCALE_RUNTIME + : ( +#ifdef USE_LOCALE_COLLATE + IN_LC_RUNTIME(LC_COLLATE) ? ( overloading ? (SVCOMPARE_t)S_amagic_cmp_locale : (SVCOMPARE_t)sv_cmp_locale_static) - : ( overloading ? (SVCOMPARE_t)S_amagic_cmp : (SVCOMPARE_t)sv_cmp_static)), + : +#endif + ( overloading ? (SVCOMPARE_t)S_amagic_cmp : (SVCOMPARE_t)sv_cmp_static)), sort_flags); } if ((priv & OPpSORT_REVERSE) != 0) { @@ -1741,10 +1769,10 @@ PP(pp_sort) static I32 S_sortcv(pTHX_ SV *const a, SV *const b) { - dVAR; const I32 oldsaveix = PL_savestack_ix; - const I32 oldscopeix = PL_scopestack_ix; I32 result; + PMOP * const pm = PL_curpm; + COP * const cop = PL_curcop; PERL_ARGS_ASSERT_SORTCV; @@ -1753,31 +1781,35 @@ S_sortcv(pTHX_ SV *const a, SV *const b) PL_stack_sp = PL_stack_base; PL_op = PL_sortcop; CALLRUNOPS(aTHX); - if (PL_stack_sp != PL_stack_base + 1) - Perl_croak(aTHX_ "Sort subroutine didn't return single value"); - if (!SvNIOKp(*PL_stack_sp)) - Perl_croak(aTHX_ "Sort subroutine didn't return a numeric value"); + PL_curcop = cop; + /* entry zero of a stack is always PL_sv_undef, which + * simplifies converting a '()' return into undef in scalar context */ + assert(PL_stack_sp > PL_stack_base || *PL_stack_base == &PL_sv_undef); result = SvIV(*PL_stack_sp); - while (PL_scopestack_ix > oldscopeix) { - LEAVE; - } - leave_scope(oldsaveix); + + LEAVE_SCOPE(oldsaveix); + PL_curpm = pm; return result; } static I32 S_sortcv_stacked(pTHX_ SV *const a, SV *const b) { - dVAR; const I32 oldsaveix = PL_savestack_ix; - const I32 oldscopeix = PL_scopestack_ix; I32 result; AV * const av = GvAV(PL_defgv); + PMOP * const pm = PL_curpm; + COP * const cop = PL_curcop; PERL_ARGS_ASSERT_SORTCV_STACKED; + if (AvREAL(av)) { + av_clear(av); + AvREAL_off(av); + AvREIFY_on(av); + } if (AvMAX(av) < 1) { - SV** ary = AvALLOC(av); + SV **ary = AvALLOC(av); if (AvARRAY(av) != ary) { AvMAX(av) += AvARRAY(av) - AvALLOC(av); AvARRAY(av) = ary; @@ -1786,6 +1818,7 @@ S_sortcv_stacked(pTHX_ SV *const a, SV *const b) AvMAX(av) = 1; Renew(ary,2,SV*); AvARRAY(av) = ary; + AvALLOC(av) = ary; } } AvFILLp(av) = 1; @@ -1795,26 +1828,25 @@ S_sortcv_stacked(pTHX_ SV *const a, SV *const b) PL_stack_sp = PL_stack_base; PL_op = PL_sortcop; CALLRUNOPS(aTHX); - if (PL_stack_sp != PL_stack_base + 1) - Perl_croak(aTHX_ "Sort subroutine didn't return single value"); - if (!SvNIOKp(*PL_stack_sp)) - Perl_croak(aTHX_ "Sort subroutine didn't return a numeric value"); + PL_curcop = cop; + /* entry zero of a stack is always PL_sv_undef, which + * simplifies converting a '()' return into undef in scalar context */ + assert(PL_stack_sp > PL_stack_base || *PL_stack_base == &PL_sv_undef); result = SvIV(*PL_stack_sp); - while (PL_scopestack_ix > oldscopeix) { - LEAVE; - } - leave_scope(oldsaveix); + + LEAVE_SCOPE(oldsaveix); + PL_curpm = pm; return result; } static I32 S_sortcv_xsub(pTHX_ SV *const a, SV *const b) { - dVAR; dSP; + dSP; const I32 oldsaveix = PL_savestack_ix; - const I32 oldscopeix = PL_scopestack_ix; CV * const cv=MUTABLE_CV(PL_sortcop); I32 result; + PMOP * const pm = PL_curpm; PERL_ARGS_ASSERT_SORTCV_XSUB; @@ -1825,15 +1857,13 @@ S_sortcv_xsub(pTHX_ SV *const a, SV *const b) *++SP = b; PUTBACK; (void)(*CvXSUB(cv))(aTHX_ cv); - if (PL_stack_sp != PL_stack_base + 1) - Perl_croak(aTHX_ "Sort subroutine didn't return single value"); - if (!SvNIOKp(*PL_stack_sp)) - Perl_croak(aTHX_ "Sort subroutine didn't return a numeric value"); + /* entry zero of a stack is always PL_sv_undef, which + * simplifies converting a '()' return into undef in scalar context */ + assert(PL_stack_sp > PL_stack_base || *PL_stack_base == &PL_sv_undef); result = SvIV(*PL_stack_sp); - while (PL_scopestack_ix > oldscopeix) { - LEAVE; - } - leave_scope(oldsaveix); + + LEAVE_SCOPE(oldsaveix); + PL_curpm = pm; return result; } @@ -1846,6 +1876,14 @@ S_sv_ncmp(pTHX_ SV *const a, SV *const b) PERL_ARGS_ASSERT_SV_NCMP; +#if defined(NAN_COMPARE_BROKEN) && defined(Perl_isnan) + if (Perl_isnan(nv1) || Perl_isnan(nv2)) { +#else + if (nv1 != nv1 || nv2 != nv2) { +#endif + if (ckWARN(WARN_UNINITIALIZED)) report_uninit(NULL); + return 0; + } return nv1 < nv2 ? -1 : nv1 > nv2 ? 1 : 0; } @@ -1861,17 +1899,16 @@ S_sv_i_ncmp(pTHX_ SV *const a, SV *const b) } #define tryCALL_AMAGICbin(left,right,meth) \ - (PL_amagic_generation && (SvAMAGIC(left)||SvAMAGIC(right))) \ - ? amagic_call(left, right, CAT2(meth,_amg), 0) \ + (SvAMAGIC(left)||SvAMAGIC(right)) \ + ? amagic_call(left, right, meth, 0) \ : NULL; #define SORT_NORMAL_RETURN_VALUE(val) (((val) > 0) ? 1 : ((val) ? -1 : 0)) static I32 -S_amagic_ncmp(pTHX_ register SV *const a, register SV *const b) +S_amagic_ncmp(pTHX_ SV *const a, SV *const b) { - dVAR; - SV * const tmpsv = tryCALL_AMAGICbin(a,b,ncmp); + SV * const tmpsv = tryCALL_AMAGICbin(a,b,ncmp_amg); PERL_ARGS_ASSERT_AMAGIC_NCMP; @@ -1889,10 +1926,9 @@ S_amagic_ncmp(pTHX_ register SV *const a, register SV *const b) } static I32 -S_amagic_i_ncmp(pTHX_ register SV *const a, register SV *const b) +S_amagic_i_ncmp(pTHX_ SV *const a, SV *const b) { - dVAR; - SV * const tmpsv = tryCALL_AMAGICbin(a,b,ncmp); + SV * const tmpsv = tryCALL_AMAGICbin(a,b,ncmp_amg); PERL_ARGS_ASSERT_AMAGIC_I_NCMP; @@ -1910,10 +1946,9 @@ S_amagic_i_ncmp(pTHX_ register SV *const a, register SV *const b) } static I32 -S_amagic_cmp(pTHX_ register SV *const str1, register SV *const str2) +S_amagic_cmp(pTHX_ SV *const str1, SV *const str2) { - dVAR; - SV * const tmpsv = tryCALL_AMAGICbin(str1,str2,scmp); + SV * const tmpsv = tryCALL_AMAGICbin(str1,str2,scmp_amg); PERL_ARGS_ASSERT_AMAGIC_CMP; @@ -1930,11 +1965,12 @@ S_amagic_cmp(pTHX_ register SV *const str1, register SV *const str2) return sv_cmp(str1, str2); } +#ifdef USE_LOCALE_COLLATE + static I32 -S_amagic_cmp_locale(pTHX_ register SV *const str1, register SV *const str2) +S_amagic_cmp_locale(pTHX_ SV *const str1, SV *const str2) { - dVAR; - SV * const tmpsv = tryCALL_AMAGICbin(str1,str2,scmp); + SV * const tmpsv = tryCALL_AMAGICbin(str1,str2,scmp_amg); PERL_ARGS_ASSERT_AMAGIC_CMP_LOCALE; @@ -1951,12 +1987,8 @@ S_amagic_cmp_locale(pTHX_ register SV *const str1, register SV *const str2) return sv_cmp_locale(str1, str2); } +#endif + /* - * Local variables: - * c-indentation-style: bsd - * c-basic-offset: 4 - * indent-tabs-mode: t - * End: - * - * ex: set ts=8 sts=4 sw=4 noet: + * ex: set ts=8 sts=4 sw=4 et: */