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

Reply via email to