diff --git a/libguile/array-map.c b/libguile/array-map.c index 0bbc095d5..028f79b2d 100644 --- a/libguile/array-map.c +++ b/libguile/array-map.c @@ -651,6 +651,7 @@ scm_i_array_rebase (SCM a, size_t base) return b; } +/* SCM_DEFINE (scm_array_for_each_cell, "array-for-each-cell", 2, 0, 1, (SCM frame_rank, SCM op, SCM args), "Apply @var{op} to each of the cells of rank rank(@var{arg})-@var{frame_rank}\n" @@ -675,23 +676,22 @@ SCM_DEFINE (scm_array_for_each_cell, "array-for-each-cell", 2, 0, 1, { int const N = scm_ilength (args); int const frank = scm_to_int (frame_rank); - - // wish C had better stack support + SCM dargs_ = SCM_EOL; size_t stack_size = 0; stack_size += N*sizeof (scm_t_array_handle); stack_size += N*sizeof (SCM); stack_size += N*sizeof (scm_t_array_dim *); stack_size += N*sizeof (int); - stack_size += frank*sizeof (ssize_t); + stack_size += frank*sizeof (ssize_t); stack_size += N*sizeof (SCM); stack_size += N*sizeof (SCM *); stack_size += frank*sizeof (ssize_t); - stack_size += frank*sizeof (int); + stack_size += frank*sizeof (int); stack_size += N*sizeof (size_t); - char * stack = scm_gc_malloc_pointerless (stack_size, "stack"); + char * stack = scm_gc_malloc (stack_size, "stack"); #define AFIC_ALLOC_ADVANCE(stack, count, type, name) \ type * name = (void *)stack; \ @@ -702,14 +702,14 @@ SCM_DEFINE (scm_array_for_each_cell, "array-for-each-cell", 2, 0, 1, AFIC_ALLOC_ADVANCE (stack, N, SCM, args_); AFIC_ALLOC_ADVANCE (stack, N, scm_t_array_dim *, as); AFIC_ALLOC_ADVANCE (stack, N, int, rank); - AFIC_ALLOC_ADVANCE (stack, frank, ssize_t, s); + AFIC_ALLOC_ADVANCE (stack, frank, ssize_t, s); AFIC_ALLOC_ADVANCE (stack, N, SCM, ai); AFIC_ALLOC_ADVANCE (stack, N, SCM *, dargs); AFIC_ALLOC_ADVANCE (stack, frank, ssize_t, i); - AFIC_ALLOC_ADVANCE (stack, frank, int, order); - AFIC_ALLOC_ADVANCE(stack, N, size_t, base); + AFIC_ALLOC_ADVANCE (stack, frank, int, order); + AFIC_ALLOC_ADVANCE (stack, N, size_t, base); assert((stack0+stack_size==stack) && "internal error"); #undef AFIC_ALLOC_ADVANCE @@ -725,56 +725,71 @@ SCM_DEFINE (scm_array_for_each_cell, "array-for-each-cell", 2, 0, 1, if (frank<0) { msg = "bad frame rank"; - } else + } + else { - for (int n=0; n!=N; ++n) { - if (rank[n]typed-array 'f64 2 '((9 1) (7 8)))) (y (f64vector 99 99))) (array-for-each-cell 1 (lambda (y x) (array-set! y (- (array-ref x 0) (array-ref x 1)))) y x) - y))) + y)) + + (pass-if-equal "regression: zero-sized frame loop without unrolling" + 99 + (let* ((x 99) + (o (make-array 0. 0 3 2))) + (array-for-each-cell 2 + (lambda (o a0 a1) + (set! x 0)) + o + (make-shared-array (make-array 1. 0 1) (const '(0 0)) 0 3) + (make-array 2. 0 3)) + x)))