make f64vector-ref and f64vector-set! use the unsafe versions after checking
svn: r17071
This commit is contained in:
parent
5e9ead0e26
commit
d3fb995de1
|
@ -1,7 +1,7 @@
|
||||||
#lang scheme/base
|
#lang scheme/base
|
||||||
|
|
||||||
;; Foreign Scheme interface
|
;; Foreign Scheme interface
|
||||||
(require '#%foreign setup/dirs
|
(require '#%foreign setup/dirs scheme/unsafe/ops
|
||||||
(for-syntax scheme/base scheme/list syntax/stx))
|
(for-syntax scheme/base scheme/list syntax/stx))
|
||||||
|
|
||||||
;; This module is full of unsafe bindings that are not provided to requiring
|
;; This module is full of unsafe bindings that are not provided to requiring
|
||||||
|
@ -1081,7 +1081,8 @@
|
||||||
[TAG-set! (id "" "-set!")]
|
[TAG-set! (id "" "-set!")]
|
||||||
[_TAG (id "_" "")]
|
[_TAG (id "_" "")]
|
||||||
[_TAG* (id "_" "*")]
|
[_TAG* (id "_" "*")]
|
||||||
[TAGname name])
|
[TAGname name]
|
||||||
|
[f64? (if (eq? (syntax-e #'TAG) 'f64) #'#t #'#f)])
|
||||||
#'(begin
|
#'(begin
|
||||||
(define-struct TAG (ptr length))
|
(define-struct TAG (ptr length))
|
||||||
(provide TAG? TAG-length (rename-out [TAG s:TAG]))
|
(provide TAG? TAG-length (rename-out [TAG s:TAG]))
|
||||||
|
@ -1102,14 +1103,19 @@
|
||||||
(define* (TAG-ref v i)
|
(define* (TAG-ref v i)
|
||||||
(if (TAG? v)
|
(if (TAG? v)
|
||||||
(if (and (exact-nonnegative-integer? i) (< i (TAG-length v)))
|
(if (and (exact-nonnegative-integer? i) (< i (TAG-length v)))
|
||||||
(ptr-ref (TAG-ptr v) type i)
|
(if f64? ;; use JIT-inlined operation
|
||||||
|
(unsafe-f64vector-ref v i)
|
||||||
|
(ptr-ref (TAG-ptr v) type i))
|
||||||
(error 'TAG-ref "bad index ~e for ~a bounds of 0..~e"
|
(error 'TAG-ref "bad index ~e for ~a bounds of 0..~e"
|
||||||
i 'TAG (sub1 (TAG-length v))))
|
i 'TAG (sub1 (TAG-length v))))
|
||||||
(raise-type-error 'TAG-ref TAGname v)))
|
(raise-type-error 'TAG-ref TAGname v)))
|
||||||
(define* (TAG-set! v i x)
|
(define* (TAG-set! v i x)
|
||||||
(if (TAG? v)
|
(if (TAG? v)
|
||||||
(if (and (exact-nonnegative-integer? i) (< i (TAG-length v)))
|
(if (and (exact-nonnegative-integer? i) (< i (TAG-length v)))
|
||||||
(ptr-set! (TAG-ptr v) type i x)
|
(if (and f64? ;; use JIT-inlined operation
|
||||||
|
(inexact-real? x))
|
||||||
|
(unsafe-f64vector-set! v i x)
|
||||||
|
(ptr-set! (TAG-ptr v) type i x))
|
||||||
(error 'TAG-set! "bad index ~e for ~a bounds of 0..~e"
|
(error 'TAG-set! "bad index ~e for ~a bounds of 0..~e"
|
||||||
i 'TAG (sub1 (TAG-length v))))
|
i 'TAG (sub1 (TAG-length v))))
|
||||||
(raise-type-error 'TAG-set! TAGname v)))
|
(raise-type-error 'TAG-set! TAGname v)))
|
||||||
|
@ -1264,7 +1270,8 @@
|
||||||
(raise-type-error 'cast "ctype" to-type))
|
(raise-type-error 'cast "ctype" to-type))
|
||||||
(unless (= (ctype-sizeof to-type)
|
(unless (= (ctype-sizeof to-type)
|
||||||
(ctype-sizeof from-type))
|
(ctype-sizeof from-type))
|
||||||
(raise-mismatch-error (format "representation sizes of types differ: ~e to "
|
(raise-mismatch-error 'cast
|
||||||
|
(format "representation sizes of types differ: ~e to "
|
||||||
from-type)
|
from-type)
|
||||||
to-type))
|
to-type))
|
||||||
(let ([p2 (malloc from-type)])
|
(let ([p2 (malloc from-type)])
|
||||||
|
|
Loading…
Reference in New Issue
Block a user