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 <[email protected]> Date: Sun Feb 9 21:11:08 2014 +0100 Reindent scm_ramapc * libguile/array-map.c (scm_ramapc): Reindent. commit 2c001086b2b954b912005cfcc09e80a975c0d3b2 Author: Daniel Llorens <[email protected]> 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 <[email protected]> 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
