diff options
-rw-r--r-- | libguile/array-map.c | 21 | ||||
-rw-r--r-- | test-suite/tests/arrays.test | 10 |
2 files changed, 28 insertions, 3 deletions
diff --git a/libguile/array-map.c b/libguile/array-map.c index b5b8cec9e..c86ea8457 100644 --- a/libguile/array-map.c +++ b/libguile/array-map.c @@ -318,6 +318,23 @@ scm_ramapc (void *cproc_ptr, SCM data, SCM ra0, SCM lra, const char *what) } } +static int +rafill (SCM dst, SCM fill) +{ + long n = (SCM_I_ARRAY_DIMS (dst)->ubnd - SCM_I_ARRAY_DIMS (dst)->lbnd + 1); + scm_t_array_handle h; + size_t i; + ssize_t inc; + scm_generalized_vector_get_handle (SCM_I_ARRAY_V (dst), &h); + i = h.base + h.dims[0].lbnd + SCM_I_ARRAY_BASE (dst)*h.dims[0].inc; + inc = SCM_I_ARRAY_DIMS (dst)->inc * h.dims[0].inc; + + for (; n-- > 0; i += inc) + h.impl->vset (&h, i, fill); + + scm_array_handle_release (&h); + return 1; +} SCM_DEFINE (scm_array_fill_x, "array-fill!", 2, 0, 0, (SCM ra, SCM fill), @@ -325,14 +342,14 @@ SCM_DEFINE (scm_array_fill_x, "array-fill!", 2, 0, 0, "returned is unspecified.") #define FUNC_NAME s_scm_array_fill_x { - scm_ramapc (scm_array_fill_int, fill, ra, SCM_EOL, FUNC_NAME); + scm_ramapc (rafill, fill, ra, SCM_EOL, FUNC_NAME); return SCM_UNSPECIFIED; } #undef FUNC_NAME /* to be used as cproc in scm_ramapc to fill an array dimension with "fill". */ -int +int scm_array_fill_int (SCM ra, SCM fill, SCM ignore SCM_UNUSED) #define FUNC_NAME s_scm_array_fill_x { diff --git a/test-suite/tests/arrays.test b/test-suite/tests/arrays.test index aa976311f..0b3d57ca2 100644 --- a/test-suite/tests/arrays.test +++ b/test-suite/tests/arrays.test @@ -291,7 +291,15 @@ (pass-if "0" (array-fill! a 0) #t) (pass-if "123" (array-fill! a 123) #t) (pass-if "-123" (array-fill! a -123) #t) - (pass-if "5/8" (array-fill! a 5/8) #t)))) + (pass-if "5/8" (array-fill! a 5/8) #t))) + + (with-test-prefix "noncompact" + (let* ((a (make-array 0 3 3)) + (b (make-shared-array a (lambda (i) (list i i)) 3))) + (array-fill! b 9) + (pass-if + (and (equal? b #(9 9 9)) + (equal? a #2((9 0 0) (0 9 0) (0 0 9)))))))) ;;; ;;; array-copy! |