[libmath-prime-util-perl] 69/181: Remove redundancy in inner loop of forprimes/forcomposites/fordivisors

Partha P. Mukherjee ppm-guest at moszumanska.debian.org
Thu May 21 18:51:07 UTC 2015


This is an automated email from the git hooks/post-receive script.

ppm-guest pushed a commit to annotated tag v0.36
in repository libmath-prime-util-perl.

commit d7eee04823f8519dd49902ab941ee16b168b78e9
Author: Dana Jacobsen <dana at acm.org>
Date:   Mon Dec 30 11:48:32 2013 -0800

    Remove redundancy in inner loop of forprimes/forcomposites/fordivisors
---
 Changes |  2 ++
 XS.xs   | 20 ++++++++------------
 2 files changed, 10 insertions(+), 12 deletions(-)

diff --git a/Changes b/Changes
index 3358497..12125db 100644
--- a/Changes
+++ b/Changes
@@ -25,6 +25,8 @@ Revision history for Perl module Math::Prime::Util
 
     - Lots of XS interface reorgs.
 
+    - XS reduncies and fixes from bulk88 and leont.
+
     - Speedup for input number validation: speedup for all functions,
       especially noticeable with fast functions (e.g. small n is_prime(n)).
 
diff --git a/XS.xs b/XS.xs
index 8a2e484..bb862fc 100644
--- a/XS.xs
+++ b/XS.xs
@@ -718,7 +718,7 @@ forprimes (SV* block, IN SV* svbeg, IN SV* svend = 0)
 #if !USE_MULTICALL
     dSP;
     PUSHMARK(SP);
-    XPUSHs(block); XPUSHs(svbeg); XPUSHs(svend);
+    XPUSHs(block); XPUSHs(svbeg); if (svend) XPUSHs(svend);
     PUTBACK;
     (void) call_pv("Math::Prime::Util::_generic_forprimes", G_VOID|G_DISCARD);
     SPAGAIN;
@@ -735,7 +735,7 @@ forprimes (SV* block, IN SV* svbeg, IN SV* svend = 0)
     if (!_validate_int(svbeg, 0) || (items >= 3 && !_validate_int(svend,0))) {
       dSP;
       PUSHMARK(SP);
-      XPUSHs(block); XPUSHs(svbeg); XPUSHs(svend);
+      XPUSHs(block); XPUSHs(svbeg); if (svend) XPUSHs(svend);
       PUTBACK;
       (void) call_pv("Math::Prime::Util::_generic_forprimes", G_VOID|G_DISCARD);
       SPAGAIN;
@@ -756,13 +756,13 @@ forprimes (SV* block, IN SV* svbeg, IN SV* svend = 0)
       croak("Not a subroutine reference");
     SAVESPTR(GvSV(PL_defgv));
     svarg = newSVuv(0);
+    GvSV(PL_defgv) = svarg;
     /* Handle early part */
     while (beg < 6) {
       dSP;
       beg = (beg <= 2) ? 2 : (beg <= 3) ? 3 : 5;
       if (beg <= end) {
         sv_setuv(svarg, beg);
-        GvSV(PL_defgv) = svarg;
         PUSHMARK(SP);
         call_sv((SV*)cv, G_VOID|G_DISCARD);
       }
@@ -783,7 +783,6 @@ forprimes (SV* block, IN SV* svbeg, IN SV* svend = 0)
       PUSH_MULTICALL(cv);
       for (beg = _XS_next_prime(beg-1); beg <= end && beg != 0; beg = _XS_next_prime(beg)) {
         sv_setuv(svarg, beg);
-        GvSV(PL_defgv) = svarg;
         MULTICALL;
       }
       FIX_MULTICALL_REFCOUNT;
@@ -797,7 +796,6 @@ forprimes (SV* block, IN SV* svbeg, IN SV* svend = 0)
           PUSH_MULTICALL(cv);
           START_DO_FOR_EACH_SIEVE_PRIME( segment, seg_low - seg_base, seg_high - seg_base ) {
             sv_setuv(svarg, seg_base + p);
-            GvSV(PL_defgv) = svarg;
             MULTICALL;
           } END_DO_FOR_EACH_SIEVE_PRIME
           FIX_MULTICALL_REFCOUNT;
@@ -806,7 +804,6 @@ forprimes (SV* block, IN SV* svbeg, IN SV* svend = 0)
           START_DO_FOR_EACH_SIEVE_PRIME( segment, seg_low - seg_base, seg_high - seg_base ) {
             dSP;
             sv_setuv(svarg, seg_base + p);
-            GvSV(PL_defgv) = svarg;
             PUSHMARK(SP);
             call_sv((SV*)cv, G_VOID|G_DISCARD);
           } END_DO_FOR_EACH_SIEVE_PRIME
@@ -836,7 +833,7 @@ forcomposites (SV* block, IN SV* svbeg, IN SV* svend = 0)
     if (!_validate_int(svbeg, 0) || (items >= 3 && !_validate_int(svend,0))) {
       dSP;
       PUSHMARK(SP);
-      XPUSHs(block); XPUSHs(svbeg); XPUSHs(svend);
+      XPUSHs(block); XPUSHs(svbeg); if (svend) XPUSHs(svend);
       PUTBACK;
       (void) call_pv("Math::Prime::Util::_generic_forcomposites", G_VOID|G_DISCARD);
       SPAGAIN;
@@ -855,6 +852,7 @@ forcomposites (SV* block, IN SV* svbeg, IN SV* svend = 0)
 
     SAVESPTR(GvSV(PL_defgv));
     svarg = newSVuv(0);
+    GvSV(PL_defgv) = svarg;
 #if USE_MULTICALL
     if (!CvISXSUB(cv) && (end-beg) > 200) {
       unsigned char* segment;
@@ -864,7 +862,7 @@ forcomposites (SV* block, IN SV* svbeg, IN SV* svend = 0)
       I32 gimme = G_VOID;
       PUSH_MULTICALL(cv);
       if (beg <= 4) { /* sieve starts at 7, so handle this here */
-        sv_setuv(svarg, 4);  GvSV(PL_defgv) = svarg;  MULTICALL;
+        sv_setuv(svarg, 4);  MULTICALL;
         beg = 6;
       }
       /* Find the two primes that bound their interval. */
@@ -878,7 +876,7 @@ forcomposites (SV* block, IN SV* svbeg, IN SV* svend = 0)
           prevprime = seg_base + p;
           cend = (prevprime-1 > end)   ? end : prevprime-1;
           for (c = cbeg; c <= cend; c++) {
-            sv_setuv(svarg, c);  GvSV(PL_defgv) = svarg;  MULTICALL;
+            sv_setuv(svarg, c);  MULTICALL;
           }
         } END_DO_FOR_EACH_SIEVE_PRIME
       }
@@ -895,7 +893,6 @@ forcomposites (SV* block, IN SV* svbeg, IN SV* svend = 0)
         if (!_XS_is_prob_prime(beg)) {
           dSP;
           sv_setuv(svarg, beg);
-          GvSV(PL_defgv) = svarg;
           PUSHMARK(SP);
           call_sv((SV*)cv, G_VOID|G_DISCARD);
         }
@@ -935,6 +932,7 @@ fordivisors (SV* block, IN SV* svn)
 
     SAVESPTR(GvSV(PL_defgv));
     svarg = newSVuv(0);
+    GvSV(PL_defgv) = svarg;
 #if USE_MULTICALL
     if (!CvISXSUB(cv)) {
       dMULTICALL;
@@ -942,7 +940,6 @@ fordivisors (SV* block, IN SV* svn)
       PUSH_MULTICALL(cv);
       for (i = 0; i < ndivisors; i++) {
         sv_setuv(svarg, divs[i]);
-        GvSV(PL_defgv) = svarg;
         MULTICALL;
       }
       FIX_MULTICALL_REFCOUNT;
@@ -954,7 +951,6 @@ fordivisors (SV* block, IN SV* svn)
       for (i = 0; i < ndivisors; i++) {
         dSP;
         sv_setuv(svarg, divs[i]);
-        GvSV(PL_defgv) = svarg;
         PUSHMARK(SP);
         call_sv((SV*)cv, G_VOID|G_DISCARD);
       }

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libmath-prime-util-perl.git



More information about the Pkg-perl-cvs-commits mailing list