guile-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Guile-commits] GNU Guile branch, master, updated. v2.1.0-729-g1ac534e


From: Andy Wingo
Subject: [Guile-commits] GNU Guile branch, master, updated. v2.1.0-729-g1ac534e
Date: Sun, 09 Feb 2014 21:07:33 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU Guile".

http://git.savannah.gnu.org/cgit/guile.git/commit/?id=1ac534e9046d5f060b07ebdb8fa9f7952a674bdb

The branch, master has been updated
       via  1ac534e9046d5f060b07ebdb8fa9f7952a674bdb (commit)
       via  2c001086b2b954b912005cfcc09e80a975c0d3b2 (commit)
       via  4e915304519abaabebb426c06984b83ac981b834 (commit)
      from  d41d5bf05ecea7ac0bb30a501ba4801043991b63 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 1ac534e9046d5f060b07ebdb8fa9f7952a674bdb
Author: Andy Wingo <address@hidden>
Date:   Sun Feb 9 21:11:08 2014 +0100

    Reindent scm_ramapc
    
    * libguile/array-map.c (scm_ramapc): Reindent.

commit 2c001086b2b954b912005cfcc09e80a975c0d3b2
Author: Daniel Llorens <address@hidden>
Date:   Fri Apr 19 14:53:34 2013 +0200

    Raw pointer loop in array-copy! for vector/vector case
    
    This special case improves
    
    (define a (make-array 1. 1000000 10))
    (define b (make-array *unspecified* 1000000 10))
    (define c (transpose-array (make-array *unspecified* 10 1000000) 1 0))
    ,time (array-copy! a b)
    ,time (array-copy! a c)
    
    from 0.041598s / 0.072561 to 0.012164s / 0.041886s on a i7-3930K.
    
    * libguile/array-map.c: (racp): if both src and dst are on vectors, use
      the element pointers to do the copy.

commit 4e915304519abaabebb426c06984b83ac981b834
Author: Andy Wingo <address@hidden>
Date:   Sun Feb 9 20:56:55 2014 +0100

    Simplify scm_array_get_handle for tc7-arrays
    
    * libguile/array-handle.c (scm_array_get_handle): Simplify for the array
      case, as suggested by Daniel Llorens.

-----------------------------------------------------------------------

Summary of changes:
 libguile/array-handle.c |   14 +---
 libguile/array-map.c    |  186 +++++++++++++++++++++++++----------------------
 2 files changed, 101 insertions(+), 99 deletions(-)

diff --git a/libguile/array-handle.c b/libguile/array-handle.c
index 84e9f88..2252ecc 100644
--- a/libguile/array-handle.c
+++ b/libguile/array-handle.c
@@ -231,21 +231,11 @@ scm_array_get_handle (SCM array, scm_t_array_handle *h)
       }
       break;
     case scm_tc7_array:
+      scm_array_get_handle (SCM_I_ARRAY_V (array), h);
+      h->array = array;
       h->base = SCM_I_ARRAY_BASE (array);
       h->ndims = SCM_I_ARRAY_NDIM (array);
       h->dims = SCM_I_ARRAY_DIMS (array);
-      {
-        scm_t_array_handle vh;
-
-        scm_array_get_handle (SCM_I_ARRAY_V (array), &vh);
-        h->element_type = vh.element_type;
-        h->elements = vh.elements;
-        h->writable_elements = vh.writable_elements;
-        h->vector = vh.vector;
-        h->vref = vh.vref;
-        h->vset = vh.vset;
-        scm_array_handle_release (&vh);
-      }
       break;
     default:
       scm_wrong_type_arg_msg (NULL, 0, array, "array");
diff --git a/libguile/array-map.c b/libguile/array-map.c
index f3f95bc..c297fe5 100644
--- a/libguile/array-map.c
+++ b/libguile/array-map.c
@@ -211,90 +211,90 @@ scm_ramapc (void *cproc_ptr, SCM data, SCM ra0, SCM lra, 
const char *what)
     case 1:
     gencase:                   /* Have to loop over all dimensions. */
       vra0 = scm_i_make_array (1);
-    if (SCM_I_ARRAYP (ra0))
-      {
-       kmax = SCM_I_ARRAY_NDIM (ra0) - 1;
-       if (kmax < 0)
-         {
-           SCM_I_ARRAY_DIMS (vra0)->lbnd = 0;
-           SCM_I_ARRAY_DIMS (vra0)->ubnd = 0;
-           SCM_I_ARRAY_DIMS (vra0)->inc = 1;
-         }
-       else
-         {
-           SCM_I_ARRAY_DIMS (vra0)->lbnd = SCM_I_ARRAY_DIMS (ra0)[kmax].lbnd;
-           SCM_I_ARRAY_DIMS (vra0)->ubnd = SCM_I_ARRAY_DIMS (ra0)[kmax].ubnd;
-           SCM_I_ARRAY_DIMS (vra0)->inc = SCM_I_ARRAY_DIMS (ra0)[kmax].inc;
-         }
-       SCM_I_ARRAY_BASE (vra0) = SCM_I_ARRAY_BASE (ra0);
-       SCM_I_ARRAY_V (vra0) = SCM_I_ARRAY_V (ra0);
-      }
-    else
-      {
-       size_t length = scm_c_array_length (ra0);
-       kmax = 0;
-       SCM_I_ARRAY_DIMS (vra0)->lbnd = 0;
-       SCM_I_ARRAY_DIMS (vra0)->ubnd = length - 1;
-       SCM_I_ARRAY_DIMS (vra0)->inc = 1;
-       SCM_I_ARRAY_BASE (vra0) = 0;
-       SCM_I_ARRAY_V (vra0) = ra0;
-       ra0 = vra0;
-      }
-    lvra = SCM_EOL;
-    plvra = &lvra;
-    for (z = lra; scm_is_pair (z); z = SCM_CDR (z))
-      {
-       ra1 = SCM_CAR (z);
-       vra1 = scm_i_make_array (1);
-       SCM_I_ARRAY_DIMS (vra1)->lbnd = SCM_I_ARRAY_DIMS (vra0)->lbnd;
-       SCM_I_ARRAY_DIMS (vra1)->ubnd = SCM_I_ARRAY_DIMS (vra0)->ubnd;
-       if (SCM_I_ARRAYP (ra1))
-         {
-           if (kmax >= 0)
-             SCM_I_ARRAY_DIMS (vra1)->inc = SCM_I_ARRAY_DIMS (ra1)[kmax].inc;
-           SCM_I_ARRAY_V (vra1) = SCM_I_ARRAY_V (ra1);
-         }
-       else
-         {
-           SCM_I_ARRAY_DIMS (vra1)->inc = 1;
-           SCM_I_ARRAY_V (vra1) = ra1;
-         }
-       *plvra = scm_cons (vra1, SCM_EOL);
-       plvra = SCM_CDRLOC (*plvra);
-      }
-
-    vinds = scm_gc_malloc_pointerless (sizeof(long) * SCM_I_ARRAY_NDIM (ra0),
-                                      indices_gc_hint);
-
-    for (k = 0; k <= kmax; k++)
-      vinds[k] = SCM_I_ARRAY_DIMS (ra0)[k].lbnd;
-    k = kmax;
-    do
-      {
-       if (k == kmax)
-         {
-           SCM y = lra;
-           SCM_I_ARRAY_BASE (vra0) = cind (ra0, vinds);
-           for (z = lvra; scm_is_pair (z); z = SCM_CDR (z), y = SCM_CDR (y))
-             SCM_I_ARRAY_BASE (SCM_CAR (z)) = cind (SCM_CAR (y), vinds);
-           if (0 == (SCM_UNBNDP (data) ? cproc(vra0, lvra) : cproc(vra0, data, 
lvra)))
-             return 0;
-           k--;
-           continue;
-         }
-       if (vinds[k] < SCM_I_ARRAY_DIMS (ra0)[k].ubnd)
-         {
-           vinds[k]++;
-           k++;
-           continue;
-         }
-       vinds[k] = SCM_I_ARRAY_DIMS (ra0)[k].lbnd - 1;
-       k--;
-      }
-    while (k >= 0);
+      if (SCM_I_ARRAYP (ra0))
+        {
+          kmax = SCM_I_ARRAY_NDIM (ra0) - 1;
+          if (kmax < 0)
+            {
+              SCM_I_ARRAY_DIMS (vra0)->lbnd = 0;
+              SCM_I_ARRAY_DIMS (vra0)->ubnd = 0;
+              SCM_I_ARRAY_DIMS (vra0)->inc = 1;
+            }
+          else
+            {
+              SCM_I_ARRAY_DIMS (vra0)->lbnd = SCM_I_ARRAY_DIMS 
(ra0)[kmax].lbnd;
+              SCM_I_ARRAY_DIMS (vra0)->ubnd = SCM_I_ARRAY_DIMS 
(ra0)[kmax].ubnd;
+              SCM_I_ARRAY_DIMS (vra0)->inc = SCM_I_ARRAY_DIMS (ra0)[kmax].inc;
+            }
+          SCM_I_ARRAY_BASE (vra0) = SCM_I_ARRAY_BASE (ra0);
+          SCM_I_ARRAY_V (vra0) = SCM_I_ARRAY_V (ra0);
+        }
+      else
+        {
+          size_t length = scm_c_array_length (ra0);
+          kmax = 0;
+          SCM_I_ARRAY_DIMS (vra0)->lbnd = 0;
+          SCM_I_ARRAY_DIMS (vra0)->ubnd = length - 1;
+          SCM_I_ARRAY_DIMS (vra0)->inc = 1;
+          SCM_I_ARRAY_BASE (vra0) = 0;
+          SCM_I_ARRAY_V (vra0) = ra0;
+          ra0 = vra0;
+        }
+      lvra = SCM_EOL;
+      plvra = &lvra;
+      for (z = lra; scm_is_pair (z); z = SCM_CDR (z))
+        {
+          ra1 = SCM_CAR (z);
+          vra1 = scm_i_make_array (1);
+          SCM_I_ARRAY_DIMS (vra1)->lbnd = SCM_I_ARRAY_DIMS (vra0)->lbnd;
+          SCM_I_ARRAY_DIMS (vra1)->ubnd = SCM_I_ARRAY_DIMS (vra0)->ubnd;
+          if (SCM_I_ARRAYP (ra1))
+            {
+              if (kmax >= 0)
+                SCM_I_ARRAY_DIMS (vra1)->inc = SCM_I_ARRAY_DIMS 
(ra1)[kmax].inc;
+              SCM_I_ARRAY_V (vra1) = SCM_I_ARRAY_V (ra1);
+            }
+          else
+            {
+              SCM_I_ARRAY_DIMS (vra1)->inc = 1;
+              SCM_I_ARRAY_V (vra1) = ra1;
+            }
+          *plvra = scm_cons (vra1, SCM_EOL);
+          plvra = SCM_CDRLOC (*plvra);
+        }
+
+      vinds = scm_gc_malloc_pointerless (sizeof(long) * SCM_I_ARRAY_NDIM (ra0),
+                                         indices_gc_hint);
+
+      for (k = 0; k <= kmax; k++)
+        vinds[k] = SCM_I_ARRAY_DIMS (ra0)[k].lbnd;
+      k = kmax;
+      do
+        {
+          if (k == kmax)
+            {
+              SCM y = lra;
+              SCM_I_ARRAY_BASE (vra0) = cind (ra0, vinds);
+              for (z = lvra; scm_is_pair (z); z = SCM_CDR (z), y = SCM_CDR (y))
+                SCM_I_ARRAY_BASE (SCM_CAR (z)) = cind (SCM_CAR (y), vinds);
+              if (0 == (SCM_UNBNDP (data) ? cproc(vra0, lvra) : cproc(vra0, 
data, lvra)))
+                return 0;
+              k--;
+              continue;
+            }
+          if (vinds[k] < SCM_I_ARRAY_DIMS (ra0)[k].ubnd)
+            {
+              vinds[k]++;
+              k++;
+              continue;
+            }
+          vinds[k] = SCM_I_ARRAY_DIMS (ra0)[k].lbnd - 1;
+          k--;
+        }
+      while (k >= 0);
 
     case 5:
-    return 1;
+      return 1;
     }
 }
 
@@ -328,6 +328,9 @@ SCM_DEFINE (scm_array_fill_x, "array-fill!", 2, 0, 0,
 #undef FUNC_NAME
 
 
+/* FIXME src-dst is the wrong order for scm_ra_matchp, but scm_ramapc
+   doesn't send SCM_I_ARRAYP for both src and dst, and this segfaults
+   with the 'right' order. */
 static int
 racp (SCM src, SCM dst)
 {
@@ -337,16 +340,25 @@ racp (SCM src, SCM dst)
   ssize_t inc_s, inc_d;
 
   dst = SCM_CAR (dst);
-  scm_array_get_handle (SCM_I_ARRAY_V (src), &h_s);
-  scm_array_get_handle (SCM_I_ARRAY_V (dst), &h_d);
-
   i_s = SCM_I_ARRAY_BASE (src);
   i_d = SCM_I_ARRAY_BASE (dst);
   inc_s = SCM_I_ARRAY_DIMS (src)->inc;
   inc_d = SCM_I_ARRAY_DIMS (dst)->inc;
 
-  for (; n-- > 0; i_s += inc_s, i_d += inc_d)
-    h_d.vset (h_d.vector, i_d, h_s.vref (h_s.vector, i_s));
+  scm_array_get_handle (SCM_I_ARRAY_V (src), &h_s);
+  scm_array_get_handle (SCM_I_ARRAY_V (dst), &h_d);
+
+  if (h_s.element_type == SCM_ARRAY_ELEMENT_TYPE_SCM
+      && h_d.element_type == SCM_ARRAY_ELEMENT_TYPE_SCM)
+    {
+      SCM const * el_s = h_s.elements;
+      SCM * el_d = h_d.writable_elements;
+      for (; n-- > 0; i_s += inc_s, i_d += inc_d)
+        el_d[i_d] = el_s[i_s];
+    }
+  else
+    for (; n-- > 0; i_s += inc_s, i_d += inc_d)
+      h_d.vset (h_d.vector, i_d, h_s.vref (h_s.vector, i_s));
 
   scm_array_handle_release (&h_d);
   scm_array_handle_release (&h_s);


hooks/post-receive
-- 
GNU Guile



reply via email to

[Prev in Thread] Current Thread [Next in Thread]