lloda pushed a commit to branch wip-exception-truncate
in repository guile.

commit 592d6aa32dfdfbaa0c0130a4017201c761a61111
Author: Daniel Llorens <daniel.llor...@bluewin.ch>
Date:   Mon Feb 13 13:49:35 2017 +0100

    Support non-zero lower bounds in array-slice-for-each
    
    * libguile/array-handle.c (scm_array_handle_writable_elements): Fix
      error message.
    * libguile/array-map.c (scm_array_slice_for_each): Support non-zero
      lower bounds. Fix error messages.
    * test-suite/tests/array-map.test: Test scm_array_slice_for_each with
      non-zero lower bound argument.
---
 libguile/array-handle.c         |  2 +-
 libguile/array-map.c            | 22 +++++++++-------------
 test-suite/tests/array-map.test |  8 ++++++++
 3 files changed, 18 insertions(+), 14 deletions(-)

diff --git a/libguile/array-handle.c b/libguile/array-handle.c
index 89277d9..4c2fe0e 100644
--- a/libguile/array-handle.c
+++ b/libguile/array-handle.c
@@ -327,7 +327,7 @@ SCM *
 scm_array_handle_writable_elements (scm_t_array_handle *h)
 {
   if (h->element_type != SCM_ARRAY_ELEMENT_TYPE_SCM)
-    scm_wrong_type_arg_msg (NULL, 0, h->array, "non-uniform array");
+    scm_wrong_type_arg_msg (NULL, 0, h->array, "array of Scheme values");
   return ((SCM*)h->elements) + h->base;
 }
 
diff --git a/libguile/array-map.c b/libguile/array-map.c
index c2825bc..b6529c0 100644
--- a/libguile/array-map.c
+++ b/libguile/array-map.c
@@ -677,6 +677,7 @@ SCM_DEFINE (scm_array_slice_for_each, 
"array-slice-for-each", 2, 0, 1,
             "@end lisp")
 #define FUNC_NAME s_scm_array_slice_for_each
 {
+  SCM xargs = args;
   int const N = scm_ilength (args);
   int const frank = scm_to_int (frame_rank);
   int ocd;
@@ -740,9 +741,9 @@ SCM_DEFINE (scm_array_slice_for_each, 
"array-slice-for-each", 2, 0, 1,
   assert((pool0+pool_size==pool) && "internal error");
 #undef AFIC_ALLOC_ADVANCE
 
-  for (n=0; scm_is_pair(args); args=scm_cdr(args), ++n)
+  for (n=0, xargs=args; scm_is_pair(xargs); xargs=scm_cdr(xargs), ++n)
     {
-      args_[n] = scm_car(args);
+      args_[n] = scm_car(xargs);
       scm_array_get_handle(args_[n], ah+n);
       as[n] = scm_array_handle_dims(ah+n);
       rank[n] = scm_array_handle_rank(ah+n);
@@ -750,29 +751,24 @@ SCM_DEFINE (scm_array_slice_for_each, 
"array-slice-for-each", 2, 0, 1,
   /* checks */
   msg = NULL;
   if (frank<0)
-    msg = "bad frame rank";
+    msg = "bad frame rank ~S, ~S";
   else
     {
       for (n=0; n!=N; ++n)
         {
           if (rank[n]<frank)
             {
-              msg = "frame too large for arguments";
+              msg = "frame too large for arguments: ~S, ~S";
               goto check_msg;
             }
           for (k=0; k!=frank; ++k)
             {
-              if (as[n][k].lbnd!=0)
+              if (as[0][k].lbnd!=as[n][k].lbnd || as[0][k].ubnd!=as[n][k].ubnd)
                 {
-                  msg = "non-zero base index is not supported";
+                  msg = "mismatched frames: ~S, ~S";
                   goto check_msg;
                 }
-              if (as[0][k].ubnd!=as[n][k].ubnd)
-                {
-                  msg = "mismatched frames";
-                  goto check_msg;
-                }
-              s[k] = as[n][k].ubnd + 1;
+              s[k] = as[n][k].ubnd - as[n][k].lbnd + 1;
 
               /* this check is needed if the array cannot be entirely */
               /* unrolled, because the unrolled subloop will be run before */
@@ -787,7 +783,7 @@ SCM_DEFINE (scm_array_slice_for_each, 
"array-slice-for-each", 2, 0, 1,
     {
       for (n=0; n!=N; ++n)
         scm_array_handle_release(ah+n);
-      scm_misc_error("array-slice-for-each", msg, scm_cons_star(frame_rank, 
args));
+      scm_misc_error("array-slice-for-each", msg, scm_cons(frame_rank, args));
     }
   /* prepare moving cells. */
   for (n=0; n!=N; ++n)
diff --git a/test-suite/tests/array-map.test b/test-suite/tests/array-map.test
index 3471841..8e0e769 100644
--- a/test-suite/tests/array-map.test
+++ b/test-suite/tests/array-map.test
@@ -520,6 +520,14 @@
         (array-slice-for-each 1 (lambda (a) (sort! a <)) a)
         a))
 
+  (pass-if-equal "1 argument frame rank 1, non-zero base indices"
+      #2@1@1((1 3 9) (2 7 8))
+      (let* ((a (make-array *unspecified* '(1 2) '(1 3)))
+             (b #2@1@1((9 1 3) (7 8 2))))
+        (array-copy! b a)
+        (array-slice-for-each 1 (lambda (a) (sort! a <)) a)
+        a))
+
   (pass-if-equal "2 arguments frame rank 1"
       #f64(8 -1)
       (let* ((x (list->typed-array 'f64 2 '((9 1) (7 8))))

Reply via email to