diff --git a/collects/ffi/unsafe.rkt b/collects/ffi/unsafe.rkt index 4773809474..05df278e56 100644 --- a/collects/ffi/unsafe.rkt +++ b/collects/ffi/unsafe.rkt @@ -996,11 +996,11 @@ (define-struct array (ptr type length)) (define array-ref (case-lambda - [(a i) - (let ([len (array-length a)]) - (if (< -1 i len) - (ptr-ref (array-ptr a) (array-type a) i) - (raise-mismatch-error 'array-ref "index out of bounds: " i)))] + [(a i) + (define len (array-length a)) + (if (< -1 i len) + (ptr-ref (array-ptr a) (array-type a) i) + (raise-mismatch-error 'array-ref "index out of bounds: " i))] [(a . is) (let loop ([a a] [is is]) (if (null? is) @@ -1009,15 +1009,15 @@ (define array-set! (case-lambda [(a i v) - (let ([len (array-length a)]) - (if (< -1 i len) - (ptr-set! (array-ptr a) (array-type a) i v) - (raise-mismatch-error 'array-ref "index out of bounds: " i)))] + (define len (array-length a)) + (if (< -1 i len) + (ptr-set! (array-ptr a) (array-type a) i v) + (raise-mismatch-error 'array-ref "index out of bounds: " i))] [(a i i1 . is+v) (let ([is+v (reverse (list* i i1 is+v))]) (define v (car is+v)) (define i (cadr is+v)) - (let loop ([a a] [is (cddr is+v)]) + (let loop ([a a] [is (reverse (cddr is+v))]) (if (null? is) (array-set! a i v) (loop (array-ref a (car is)) (cdr is)))))])) diff --git a/collects/tests/racket/foreign-test.rktl b/collects/tests/racket/foreign-test.rktl index e70481c8ca..e29ebf3806 100644 --- a/collects/tests/racket/foreign-test.rktl +++ b/collects/tests/racket/foreign-test.rktl @@ -430,6 +430,14 @@ 0)) (test 44 values (cast d _gcpointer _intptr)))) +;; test multi-dimension arrays +(let ([_t (_array _int 20 10 5)]) + (define ar (ptr-ref (malloc _t) _t)) + (define (t n) + (test (void) array-set! ar 19 9 4 n) + (test n array-ref ar 19 9 4)) + (for-each t '(1 2 3))) + (delete-test-files) (report-errs)