cs: fix {u,s}16vector-{ref,set!} when memory is not bytes?
When a {u,s}16vector points to memory that's not bytes (e.g. from ffi) then referencing or setting the memory results in a Chez error: ``` foreign-set!: unrecognized type 'int16 ``` The fix is to change the type argument to `'integer-16` and `'unsigned-16`.
This commit is contained in:
parent
bff1a3c012
commit
72a852ca43
|
@ -1039,6 +1039,27 @@
|
|||
(test (+ (expt 2 100) #x55FF) bior (+ #x5555 (expt 2 100)))
|
||||
(test (+ (expt 2 100) #x55AA) bxor (+ #x5555 (expt 2 100)))
|
||||
|
||||
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Make sure {u,s}16vector-{ref,set!} work when underlying
|
||||
;; memory is not `bytes?`
|
||||
|
||||
(module mem racket/base
|
||||
(provide c-malloc)
|
||||
(require ffi/unsafe)
|
||||
(define c-malloc
|
||||
(get-ffi-obj 'malloc (ffi-lib #f) (_fun _int -> (_cpointer #f)))))
|
||||
|
||||
(require 'mem)
|
||||
(let ((uv (u16vector 0)))
|
||||
(unsafe-struct*-set! uv 0 (c-malloc 2))
|
||||
(test (void) u16vector-set! uv 0 99)
|
||||
(test 99 u16vector-ref uv 0))
|
||||
|
||||
(let ((sv (s16vector 0)))
|
||||
(unsafe-struct*-set! sv 0 (c-malloc 2))
|
||||
(test (void) s16vector-set! sv 0 -99)
|
||||
(test -99 s16vector-ref sv 0))
|
||||
|
||||
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(report-errs)
|
||||
|
|
|
@ -121,14 +121,14 @@
|
|||
[k (fx* k 2)])
|
||||
(if (bytes? mem)
|
||||
(bytevector-s16-native-ref mem k)
|
||||
(foreign-ref 'int16 mem k))))
|
||||
(foreign-ref 'integer-16 mem k))))
|
||||
(define (unsafe-s16vector-set! s16 k v)
|
||||
(let* ([cptr (unsafe-struct*-ref s16 0)]
|
||||
[mem (cpointer-memory cptr)]
|
||||
[k (fx* k 2)])
|
||||
(if (bytes? mem)
|
||||
(bytevector-s16-native-set! mem k v)
|
||||
(foreign-set! 'int16 mem k v))))
|
||||
(foreign-set! 'integer-16 mem k v))))
|
||||
|
||||
(define (unsafe-u16vector-ref u16 k)
|
||||
(let* ([cptr (unsafe-struct*-ref u16 0)]
|
||||
|
@ -136,14 +136,14 @@
|
|||
[k (fx* k 2)])
|
||||
(if (bytes? mem)
|
||||
(bytevector-u16-native-ref mem k)
|
||||
(foreign-ref 'uint16 mem k))))
|
||||
(foreign-ref 'unsigned-16 mem k))))
|
||||
(define (unsafe-u16vector-set! u16 k v)
|
||||
(let* ([cptr (unsafe-struct*-ref u16 0)]
|
||||
[mem (cpointer-memory cptr)]
|
||||
[k (fx* k 2)])
|
||||
(if (bytes? mem)
|
||||
(bytevector-u16-native-set! mem k v)
|
||||
(foreign-set! 'uint16 mem k v))))
|
||||
(foreign-set! 'unsigned-16 mem k v))))
|
||||
|
||||
(define (unsafe-f64vector-ref f64 k)
|
||||
(let* ([cptr (unsafe-struct*-ref f64 0)]
|
||||
|
|
Loading…
Reference in New Issue
Block a user