In perl.git, the branch smueller/sort has been updated <http://perl5.git.perl.org/perl.git/commitdiff/4a0b7a78fb803ab33a40dc2472a8b8949d7a0a0f?hp=5d2419249d341dedf7fa0b390fc6113f7a215244>
- Log ----------------------------------------------------------------- commit 4a0b7a78fb803ab33a40dc2472a8b8949d7a0a0f Author: Steffen Mueller <smuel...@cpan.org> Date: Thu Nov 17 18:52:27 2011 +0100 FIXME can't go into blead like this Minor cleanup in pp_sort to move some verbatim-copied code into a macro. Not MUCH better since we're still paying the price for the actual code duplication, but at least a little less code. ----------------------------------------------------------------------- Summary of changes: pp_sort.c | 92 ++++++++++++++++++++++++------------------------------------- 1 files changed, 36 insertions(+), 56 deletions(-) diff --git a/pp_sort.c b/pp_sort.c index f8b13e2..32e6e25 100644 --- a/pp_sort.c +++ b/pp_sort.c @@ -1924,6 +1924,20 @@ S_sv_i_ncmp(pTHX_ SV *const a, SV *const b) #define SORT_NORMAL_RETURN_VALUE(val) (((val) > 0) ? 1 : ((val) ? -1 : 0)) +#define short_circuit_MAGIC_result(tmpsv) \ + STMT_START { \ + if (tmpsv) { \ + if (SvIOK(tmpsv)) { \ + const I32 i = SvIVX(tmpsv); \ + return SORT_NORMAL_RETURN_VALUE(i); \ + } \ + else { \ + const NV d = SvNV(tmpsv); \ + return SORT_NORMAL_RETURN_VALUE(d); \ + } \ + } \ + } STMT_END + static I32 S_amagic_ncmp(pTHX_ register SV *const a, register SV *const b) { @@ -1932,17 +1946,8 @@ S_amagic_ncmp(pTHX_ register SV *const a, register SV *const b) PERL_ARGS_ASSERT_AMAGIC_NCMP; - if (tmpsv) { - if (SvIOK(tmpsv)) { - const I32 i = SvIVX(tmpsv); - return SORT_NORMAL_RETURN_VALUE(i); - } - else { - const NV d = SvNV(tmpsv); - return SORT_NORMAL_RETURN_VALUE(d); - } - } - return S_sv_ncmp(aTHX_ a, b); + short_circuit_MAGIC_result(tmpsv); + return S_sv_ncmp(aTHX_ a, b); } static I32 @@ -1953,16 +1958,7 @@ S_amagic_i_ncmp(pTHX_ register SV *const a, register SV *const b) PERL_ARGS_ASSERT_AMAGIC_I_NCMP; - if (tmpsv) { - if (SvIOK(tmpsv)) { - const I32 i = SvIVX(tmpsv); - return SORT_NORMAL_RETURN_VALUE(i); - } - else { - const NV d = SvNV(tmpsv); - return SORT_NORMAL_RETURN_VALUE(d); - } - } + short_circuit_MAGIC_result(tmpsv); return S_sv_i_ncmp(aTHX_ a, b); } @@ -1974,16 +1970,7 @@ S_amagic_cmp(pTHX_ register SV *const str1, register SV *const str2) PERL_ARGS_ASSERT_AMAGIC_CMP; - if (tmpsv) { - if (SvIOK(tmpsv)) { - const I32 i = SvIVX(tmpsv); - return SORT_NORMAL_RETURN_VALUE(i); - } - else { - const NV d = SvNV(tmpsv); - return SORT_NORMAL_RETURN_VALUE(d); - } - } + short_circuit_MAGIC_result(tmpsv); return sv_cmp(str1, str2); } @@ -1995,16 +1982,7 @@ S_amagic_cmp_locale(pTHX_ register SV *const str1, register SV *const str2) PERL_ARGS_ASSERT_AMAGIC_CMP_LOCALE; - if (tmpsv) { - if (SvIOK(tmpsv)) { - const I32 i = SvIVX(tmpsv); - return SORT_NORMAL_RETURN_VALUE(i); - } - else { - const NV d = SvNV(tmpsv); - return SORT_NORMAL_RETURN_VALUE(d); - } - } + short_circuit_MAGIC_result(tmpsv); return sv_cmp_locale(str1, str2); } @@ -2012,24 +1990,26 @@ S_amagic_cmp_locale(pTHX_ register SV *const str1, register SV *const str2) * step in pp_sort. In fact, that might make tons of sense since it * could include moving the inner-magic check out of the O(nlogn) part. */ -#define REUSABLE_DEREF_BODY \ - if (!SvROK(a) || !SvROK(b)) { \ - Perl_croak(aTHX_ "Not an ARRAY reference"); \ - } \ - a = SvRV(a); \ - b = SvRV(b); \ - if (SvTYPE(a) != SVt_PVAV || SvTYPE(a) != SVt_PVAV) { \ - Perl_croak(aTHX_ "Not an ARRAY reference"); \ - } \ - elem1 = Perl_av_fetch(aTHX_ (AV*)a, 0, 0); \ - elem2 = Perl_av_fetch(aTHX_ (AV*)b, 0, 0); +#define REUSABLE_DEREF_BODY \ + STMT_START { \ + if (!SvROK(a) || !SvROK(b)) { \ + Perl_croak(aTHX_ "Not an ARRAY reference"); \ + } \ + a = SvRV(a); \ + b = SvRV(b); \ + if (SvTYPE(a) != SVt_PVAV || SvTYPE(a) != SVt_PVAV) { \ + Perl_croak(aTHX_ "Not an ARRAY reference"); \ + } \ + elem1 = Perl_av_fetch(aTHX_ (AV*)a, 0, 0); \ + elem2 = Perl_av_fetch(aTHX_ (AV*)b, 0, 0); \ + } STMT_END static I32 S_sv_ncmp_deref(pTHX_ SV *a, SV *b) { SV **elem1, **elem2; - REUSABLE_DEREF_BODY + REUSABLE_DEREF_BODY; if (*elem1 == &PL_sv_undef || *elem2 == &PL_sv_undef) return S_amagic_ncmp(aTHX_ *elem1, *elem2); @@ -2040,8 +2020,8 @@ static I32 S_sv_i_ncmp_deref(pTHX_ SV *a, SV *b) { SV **elem1, **elem2; -/* PerlIO_printf(PerlIO_stderr(), "alive\n"); */ - REUSABLE_DEREF_BODY + + REUSABLE_DEREF_BODY; if (*elem1 == &PL_sv_undef || *elem2 == &PL_sv_undef) return S_amagic_i_ncmp(aTHX_ *elem1, *elem2); @@ -2053,7 +2033,7 @@ S_sv_cmp_deref(pTHX_ SV *a, SV *b) { SV **elem1, **elem2; - REUSABLE_DEREF_BODY + REUSABLE_DEREF_BODY; if (*elem1 == &PL_sv_undef || *elem2 == &PL_sv_undef) return S_amagic_cmp(aTHX_ *elem1, *elem2); -- Perl5 Master Repository