5878 lines
197 KiB
Scheme
5878 lines
197 KiB
Scheme
|
;;; ftype.ms
|
||
|
;;; Copyright 1984-2017 Cisco Systems, Inc.
|
||
|
;;;
|
||
|
;;; Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
;;; you may not use this file except in compliance with the License.
|
||
|
;;; You may obtain a copy of the License at
|
||
|
;;;
|
||
|
;;; http://www.apache.org/licenses/LICENSE-2.0
|
||
|
;;;
|
||
|
;;; Unless required by applicable law or agreed to in writing, software
|
||
|
;;; distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
;;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
;;; See the License for the specific language governing permissions and
|
||
|
;;; limitations under the License.
|
||
|
|
||
|
(mat ftype-sizeof
|
||
|
(equal?
|
||
|
(list
|
||
|
(ftype-sizeof integer-8)
|
||
|
(ftype-sizeof unsigned-8)
|
||
|
(ftype-sizeof integer-16)
|
||
|
(ftype-sizeof unsigned-16)
|
||
|
(ftype-sizeof integer-24)
|
||
|
(ftype-sizeof unsigned-24)
|
||
|
(ftype-sizeof integer-32)
|
||
|
(ftype-sizeof unsigned-32)
|
||
|
(ftype-sizeof integer-40)
|
||
|
(ftype-sizeof unsigned-40)
|
||
|
(ftype-sizeof integer-48)
|
||
|
(ftype-sizeof unsigned-48)
|
||
|
(ftype-sizeof integer-56)
|
||
|
(ftype-sizeof unsigned-56)
|
||
|
(ftype-sizeof integer-64)
|
||
|
(ftype-sizeof unsigned-64)
|
||
|
(ftype-sizeof single-float)
|
||
|
(ftype-sizeof double-float))
|
||
|
'(1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 4 8))
|
||
|
(eqv? (ftype-sizeof char) (foreign-sizeof 'char))
|
||
|
(eqv? (ftype-sizeof wchar) (foreign-sizeof 'wchar))
|
||
|
(eqv? (ftype-sizeof short) (foreign-sizeof 'short))
|
||
|
(eqv? (ftype-sizeof unsigned-short) (foreign-sizeof 'unsigned-short))
|
||
|
(eqv? (ftype-sizeof int) (foreign-sizeof 'int))
|
||
|
(eqv? (ftype-sizeof unsigned) (foreign-sizeof 'unsigned))
|
||
|
(eqv? (ftype-sizeof unsigned-int) (foreign-sizeof 'unsigned-int))
|
||
|
(eqv? (ftype-sizeof long) (foreign-sizeof 'long))
|
||
|
(eqv? (ftype-sizeof unsigned-long) (foreign-sizeof 'unsigned-long))
|
||
|
(eqv? (ftype-sizeof long-long) (foreign-sizeof 'long-long))
|
||
|
(eqv? (ftype-sizeof unsigned-long-long) (foreign-sizeof 'unsigned-long-long))
|
||
|
(eqv? (ftype-sizeof float) (foreign-sizeof 'float))
|
||
|
(eqv? (ftype-sizeof single-float) (foreign-sizeof 'single-float))
|
||
|
(eqv? (ftype-sizeof double) (foreign-sizeof 'double))
|
||
|
(eqv? (ftype-sizeof double-float) (foreign-sizeof 'double-float))
|
||
|
(eqv? (ftype-sizeof void*) (foreign-sizeof 'void*))
|
||
|
(eqv? (ftype-sizeof iptr) (foreign-sizeof 'iptr))
|
||
|
(eqv? (ftype-sizeof uptr) (foreign-sizeof 'uptr))
|
||
|
)
|
||
|
|
||
|
(mat ftype-setup
|
||
|
(begin
|
||
|
(define max-integer-alignment
|
||
|
(if (or (> (fixnum-width) 32)
|
||
|
(memq (machine-type) '(i3nt ti3nt i3qnx ti3qnx arm32le tarm32le ppc32le tppc32le)))
|
||
|
8
|
||
|
4))
|
||
|
(define max-float-alignment
|
||
|
(if (or (> (fixnum-width) 32)
|
||
|
(memq (machine-type) '(i3nt ti3nt arm32le tarm32le ppc32le tppc32le)))
|
||
|
8
|
||
|
4))
|
||
|
(define-syntax fptr-free
|
||
|
(syntax-rules ()
|
||
|
[(_ fptr)
|
||
|
(begin
|
||
|
(foreign-free (ftype-pointer-address fptr))
|
||
|
(set! fptr #f))]))
|
||
|
(define-syntax free-after
|
||
|
(syntax-rules ()
|
||
|
[(_ fptr e1 e2 ...)
|
||
|
(let ([ans (begin e1 e2 ...)])
|
||
|
(fptr-free fptr)
|
||
|
ans)]))
|
||
|
#t)
|
||
|
)
|
||
|
|
||
|
(mat ftype
|
||
|
(error? ; misplaced function type
|
||
|
(define-ftype IV1 (struct [i integer-8] [f (function (int) int)])))
|
||
|
|
||
|
(error? ; misplaced function type
|
||
|
(define-ftype IV1 (union [i uptr] [f (function (int) int)])))
|
||
|
|
||
|
(error? ; misplaced function type
|
||
|
(define-ftype IV1 (array 10 (function (int) int))))
|
||
|
|
||
|
(error? ; misplaced function type
|
||
|
(let ()
|
||
|
(define-ftype F1 (function (int) int))
|
||
|
(define-ftype IV1 (struct [i integer-8] [f F1]))
|
||
|
3))
|
||
|
|
||
|
(error? ; misplaced function type
|
||
|
(let ()
|
||
|
(define-ftype F1 (function (int) int))
|
||
|
(define-ftype IV1 (union [i uptr] [f F1]))
|
||
|
3))
|
||
|
|
||
|
(error? ; misplaced function type
|
||
|
(let ()
|
||
|
(define-ftype F1 (function (int) int))
|
||
|
(define-ftype IV1 (array 10 F1))
|
||
|
3))
|
||
|
|
||
|
(error? ; misplaced function type
|
||
|
(let ()
|
||
|
(define-ftype
|
||
|
[F1 (function (int) int)]
|
||
|
[IV1 (struct [i integer-8] [f F1])])
|
||
|
3))
|
||
|
|
||
|
(begin
|
||
|
(define-ftype F1 (function (int) int))
|
||
|
#t)
|
||
|
|
||
|
(error? ; function ftypes have unknown size
|
||
|
(ftype-sizeof F1))
|
||
|
|
||
|
(error? ; cannot calculate offset for function index 10
|
||
|
(ftype-ref F1 () (make-ftype-pointer F1 0) 10))
|
||
|
|
||
|
(error? ; cannot calculate offset for function index 1
|
||
|
(ftype-&ref F1 () (make-ftype-pointer F1 0) 1))
|
||
|
|
||
|
(error? ; cannot assign non-scalar type
|
||
|
(ftype-set! F1 () (make-ftype-pointer F1 0) 0 'foo))
|
||
|
|
||
|
(begin
|
||
|
(define-ftype F2 (struct [a1 int] [f (* (function (int) int))]))
|
||
|
#t)
|
||
|
|
||
|
(error? ; cannot calculate offset for function index 1
|
||
|
(ftype-ref F2 (f 1) (make-ftype-pointer F2 0)))
|
||
|
|
||
|
(error? ; cannot calculate offset for function index 14
|
||
|
(ftype-&ref F2 (f 14) (make-ftype-pointer F2 0)))
|
||
|
|
||
|
(error? ; cannot calculate offset for function index 7
|
||
|
(ftype-set! F2 (f 7) (make-ftype-pointer F2 0) 'foo))
|
||
|
|
||
|
|
||
|
; ----------------
|
||
|
(begin
|
||
|
(define-ftype Aa (struct [a1 integer-8] [a2 integer-16] [a3 integer-8]))
|
||
|
(define-ftype Ab (struct [b1 integer-8]))
|
||
|
(define-ftype Ac (struct [c1 Aa] [c2 Ab] [c3 double]))
|
||
|
#t)
|
||
|
|
||
|
(equal?
|
||
|
(let ([x (make-ftype-pointer Ac 0)])
|
||
|
(list
|
||
|
(ftype-sizeof Aa)
|
||
|
(ftype-sizeof Ab)
|
||
|
(ftype-sizeof Ac)
|
||
|
(ftype-pointer-address (ftype-&ref Ac (c1 a1) x))
|
||
|
(ftype-pointer-address (ftype-&ref Ac (c1 a2) x))
|
||
|
(ftype-pointer-address (ftype-&ref Ac (c1 a3) x))
|
||
|
(ftype-pointer-address (ftype-&ref Ac (c2 b1) x))
|
||
|
(ftype-pointer-address (ftype-&ref Ac (c3) x))))
|
||
|
'(6 1 16 0 2 4 6 8))
|
||
|
|
||
|
(begin
|
||
|
(define addr (foreign-alloc (ftype-sizeof Ac)))
|
||
|
(define x (make-ftype-pointer Ac addr))
|
||
|
#t)
|
||
|
|
||
|
(ftype-pointer? x)
|
||
|
(ftype-pointer? Ac x)
|
||
|
(not (ftype-pointer? Ab x))
|
||
|
(eqv? (ftype-pointer-address x) addr)
|
||
|
(eqv? (ftype-pointer-address (ftype-&ref Ac (c1 a1) x)) (+ addr 0))
|
||
|
(eqv? (ftype-pointer-address (ftype-&ref Ac (c1 a2) x)) (+ addr 2))
|
||
|
(eqv? (ftype-pointer-address (ftype-&ref Ac (c1 a3) x)) (+ addr 4))
|
||
|
(eqv? (ftype-pointer-address (ftype-&ref Ac (c2 b1) x)) (+ addr 6))
|
||
|
(eqv? (ftype-pointer-address (ftype-&ref Ac (c3) x)) (+ addr 8))
|
||
|
|
||
|
(error? ; not an ftype pointer
|
||
|
(ftype-&ref Aa (a1) 75))
|
||
|
(error? ; ftype mismatch
|
||
|
(ftype-&ref Ab (b1) x))
|
||
|
|
||
|
(eqv? (ftype-pointer-address (ftype-&ref Ac (c1) x)) (+ addr 0))
|
||
|
|
||
|
(error? ; unexpected accessor b1
|
||
|
(ftype-&ref Ac (b1) x))
|
||
|
(error? ; unexpected accessor 0
|
||
|
(ftype-&ref Ac (c1 0) x))
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! Ac (c1 a1) x 7)
|
||
|
(ftype-set! Ac (c1 a2) x 30000)
|
||
|
(ftype-set! Ac (c1 a3) x -15)
|
||
|
(ftype-set! Ac (c2 b1) x #xFF)
|
||
|
(ftype-set! Ac (c3) x 3.25)
|
||
|
#t)
|
||
|
|
||
|
(error? ; unexpected accessor b1
|
||
|
(ftype-set! Ac (b1) x 7))
|
||
|
(error? ; unexpected accessor 0
|
||
|
(ftype-set! Ac (c1 0) x 7))
|
||
|
(error? ; ftype mismatch
|
||
|
(ftype-set! Ab (b1) x 7))
|
||
|
(error? ; #\a is not an integer-8
|
||
|
(ftype-set! Ac (c1 a1) x #\a))
|
||
|
(error? ; 30000 is not an integer-8
|
||
|
(ftype-set! Ac (c1 a1) x 30000))
|
||
|
|
||
|
(eqv? (ftype-ref Ac (c1 a1) x) 7)
|
||
|
(eqv? (ftype-ref Ac (c1 a2) x) 30000)
|
||
|
(eqv? (ftype-ref Ac (c1 a3) x) -15)
|
||
|
(eqv? (ftype-ref Ac (c2 b1) x) -1)
|
||
|
(eqv? (ftype-ref Ac (c3) x) 3.25)
|
||
|
(eqv? (ftype-ref Aa (a1) (ftype-&ref Ac (c1) x)) 7)
|
||
|
(eqv? (ftype-ref Aa (a2) (ftype-&ref Ac (c1) x)) 30000)
|
||
|
(eqv? (ftype-ref Aa (a3) (ftype-&ref Ac (c1) x)) -15)
|
||
|
(eqv? (ftype-ref Ab (b1) (ftype-&ref Ac (c2) x)) -1)
|
||
|
(eqv? (ftype-ref double () (ftype-&ref Ac (c3) x)) 3.25)
|
||
|
(let ([y (ftype-&ref Ac (c3) x)])
|
||
|
(= (ftype-pointer-address (ftype-&ref double () y))
|
||
|
(ftype-pointer-address y)))
|
||
|
(eqv? (foreign-ref 'double (ftype-pointer-address (ftype-&ref Ac (c3) x)) 0) 3.25)
|
||
|
(let ()
|
||
|
(define-syntax cast
|
||
|
(syntax-rules ()
|
||
|
[(_ ftype x)
|
||
|
(make-ftype-pointer ftype (ftype-pointer-address x))]))
|
||
|
(define-ftype double-array (array 1 double))
|
||
|
(eqv? (ftype-ref double-array (0)
|
||
|
(cast double-array (ftype-&ref Ac (c3) x)))
|
||
|
3.25))
|
||
|
(let ()
|
||
|
(define-syntax cast
|
||
|
(syntax-rules ()
|
||
|
[(_ ftype x)
|
||
|
(make-ftype-pointer ftype (ftype-pointer-address x))]))
|
||
|
(define-ftype double-array (array 1 double))
|
||
|
(let ([y (cast double-array (ftype-&ref Ac (c3) x))])
|
||
|
(and (ftype-pointer? y)
|
||
|
(eqv? (ftype-pointer-address y) (ftype-pointer-address (ftype-&ref Ac (c3) x)))
|
||
|
(ftype-pointer=? y (ftype-&ref Ac (c3) x))
|
||
|
(eqv? (ftype-ref double-array (0) y) 3.25))))
|
||
|
|
||
|
(error? ; unexpected accessor b1
|
||
|
(ftype-ref Ac (b1) x))
|
||
|
(error? ; unexpected accessor 0
|
||
|
(ftype-ref Ac (c1 0) x))
|
||
|
(error? ; ftype mismatch
|
||
|
(ftype-ref Ab (b1) x))
|
||
|
(error? ; ftype mismatch
|
||
|
(ftype-ref Aa (a1) (ftype-&ref Ac (c2) x)))
|
||
|
|
||
|
(begin
|
||
|
(foreign-free addr)
|
||
|
#t)
|
||
|
|
||
|
; ----------------
|
||
|
|
||
|
(begin
|
||
|
(define-ftype Ba (struct [a1 integer-8] [a2 integer-32] [a3 integer-8]))
|
||
|
(define-ftype Bb (struct [b1 integer-8]))
|
||
|
(define-ftype Bc (struct [c1 Ba] [c2 Bb] [c3 double]))
|
||
|
#t)
|
||
|
|
||
|
(equal?
|
||
|
(let ([x (make-ftype-pointer Bc 0)])
|
||
|
(list
|
||
|
(ftype-sizeof Ba)
|
||
|
(ftype-sizeof Bb)
|
||
|
(ftype-sizeof Bc)
|
||
|
(ftype-pointer-address (ftype-&ref Bc (c1 a1) x))
|
||
|
(ftype-pointer-address (ftype-&ref Bc (c1 a2) x))
|
||
|
(ftype-pointer-address (ftype-&ref Bc (c1 a3) x))
|
||
|
(ftype-pointer-address (ftype-&ref Bc (c2 b1) x))
|
||
|
(ftype-pointer-address (ftype-&ref Bc (c3) x))))
|
||
|
'(12 1 24 0 4 8 12 16))
|
||
|
|
||
|
; ----------------
|
||
|
|
||
|
(begin
|
||
|
(define-ftype Ca (struct [a1 integer-8] [a2 double] [a3 integer-8]))
|
||
|
(define-ftype Cb (struct [b1 integer-8]))
|
||
|
(define-ftype Cc (struct [c1 Ca] [c2 Cb] [c3 double]))
|
||
|
#t)
|
||
|
|
||
|
(equal?
|
||
|
(let ([x (make-ftype-pointer Cc 0)])
|
||
|
(list
|
||
|
(ftype-sizeof Ca)
|
||
|
(ftype-sizeof Cb)
|
||
|
(ftype-sizeof Cc)
|
||
|
(ftype-pointer-address (ftype-&ref Cc (c1 a1) x))
|
||
|
(ftype-pointer-address (ftype-&ref Cc (c1 a2) x))
|
||
|
(ftype-pointer-address (ftype-&ref Cc (c1 a3) x))
|
||
|
(ftype-pointer-address (ftype-&ref Cc (c2 b1) x))
|
||
|
(ftype-pointer-address (ftype-&ref Cc (c3) x))))
|
||
|
(if (< max-float-alignment 8)
|
||
|
'(16 1 28 0 4 12 16 20)
|
||
|
'(24 1 40 0 8 16 24 32)))
|
||
|
|
||
|
; ----------------
|
||
|
|
||
|
(begin
|
||
|
(define-ftype Da (struct [a1 integer-8] [a2 integer-64] [a3 integer-8]))
|
||
|
(define-ftype Db (struct [b1 integer-8]))
|
||
|
(define-ftype Dc (struct [c1 Da] [c2 Db] [c3 integer-64]))
|
||
|
#t)
|
||
|
|
||
|
(equal?
|
||
|
(let ([x (make-ftype-pointer Dc 0)])
|
||
|
(list
|
||
|
(ftype-sizeof Da)
|
||
|
(ftype-sizeof Db)
|
||
|
(ftype-sizeof Dc)
|
||
|
(ftype-pointer-address (ftype-&ref Dc (c1 a1) x))
|
||
|
(ftype-pointer-address (ftype-&ref Dc (c1 a2) x))
|
||
|
(ftype-pointer-address (ftype-&ref Dc (c1 a3) x))
|
||
|
(ftype-pointer-address (ftype-&ref Dc (c2 b1) x))
|
||
|
(ftype-pointer-address (ftype-&ref Dc (c3) x))))
|
||
|
(if (< max-integer-alignment 8)
|
||
|
'(16 1 28 0 4 12 16 20)
|
||
|
'(24 1 40 0 8 16 24 32)))
|
||
|
|
||
|
; ----------------
|
||
|
|
||
|
(begin
|
||
|
(define-ftype Ea
|
||
|
(struct
|
||
|
[x integer-32]
|
||
|
[y double-float]
|
||
|
[z (array 25 (struct [_ integer-16] [b integer-16]))]
|
||
|
[w (struct
|
||
|
[a integer-32]
|
||
|
[b (union
|
||
|
[b1 (struct [a integer-32] [b integer-32])]
|
||
|
[b2 (struct [a integer-8] [b double])])])]
|
||
|
[v (* Ac)]))
|
||
|
#t)
|
||
|
|
||
|
(equal?
|
||
|
(let ([x (make-ftype-pointer Ea 0)])
|
||
|
(list
|
||
|
(ftype-sizeof Ea)
|
||
|
(ftype-pointer-address (ftype-&ref Ea (x) x))
|
||
|
(ftype-pointer-address (ftype-&ref Ea (y) x))
|
||
|
(ftype-pointer-address (ftype-&ref Ea (z) x))
|
||
|
(ftype-pointer-address (ftype-&ref Ea (w) x))
|
||
|
(ftype-pointer-address (ftype-&ref Ea (v) x))
|
||
|
(ftype-pointer-address (ftype-&ref Ea (z 0) x))
|
||
|
(ftype-pointer-address (ftype-&ref Ea (z 4 b) x))
|
||
|
(ftype-pointer-address (ftype-&ref Ea (w a) x))
|
||
|
(ftype-pointer-address (ftype-&ref Ea (w b) x))
|
||
|
(ftype-pointer-address (ftype-&ref Ea (w b b1) x))
|
||
|
(ftype-pointer-address (ftype-&ref Ea (w b b1 a) x))
|
||
|
(ftype-pointer-address (ftype-&ref Ea (w b b1 b) x))
|
||
|
(ftype-pointer-address (ftype-&ref Ea (w b b2) x))
|
||
|
(ftype-pointer-address (ftype-&ref Ea (w b b2 a) x))
|
||
|
(ftype-pointer-address (ftype-&ref Ea (w b b2 b) x))))
|
||
|
(if (< max-float-alignment 8)
|
||
|
'(132 0 4 12 112 128 12 30 112 116 116 116 120 116 116 120)
|
||
|
'(152 0 8 16 120 144 16 34 120 128 128 128 132 128 128 136)))
|
||
|
|
||
|
(begin
|
||
|
(define-ftype Eb
|
||
|
(packed
|
||
|
(struct
|
||
|
[x integer-32]
|
||
|
[y double-float]
|
||
|
[z (array 25 (struct [_ integer-16] [b integer-16]))]
|
||
|
[w (struct
|
||
|
[a integer-32]
|
||
|
[b (union
|
||
|
[b1 (struct [a integer-32] [b integer-32])]
|
||
|
[b2 (struct [a integer-8] [b double])])])]
|
||
|
[v (* Ac)])))
|
||
|
#t)
|
||
|
|
||
|
(equal?
|
||
|
(let ([x (make-ftype-pointer Eb 0)])
|
||
|
(list
|
||
|
(ftype-sizeof Eb)
|
||
|
(ftype-pointer-address (ftype-&ref Eb (x) x))
|
||
|
(ftype-pointer-address (ftype-&ref Eb (y) x))
|
||
|
(ftype-pointer-address (ftype-&ref Eb (z) x))
|
||
|
(ftype-pointer-address (ftype-&ref Eb (w) x))
|
||
|
(ftype-pointer-address (ftype-&ref Eb (v) x))
|
||
|
(ftype-pointer-address (ftype-&ref Eb (z 0) x))
|
||
|
(ftype-pointer-address (ftype-&ref Eb (z 4 b) x))
|
||
|
(ftype-pointer-address (ftype-&ref Eb (w a) x))
|
||
|
(ftype-pointer-address (ftype-&ref Eb (w b) x))
|
||
|
(ftype-pointer-address (ftype-&ref Eb (w b b1) x))
|
||
|
(ftype-pointer-address (ftype-&ref Eb (w b b1 a) x))
|
||
|
(ftype-pointer-address (ftype-&ref Eb (w b b1 b) x))
|
||
|
(ftype-pointer-address (ftype-&ref Eb (w b b2) x))
|
||
|
(ftype-pointer-address (ftype-&ref Eb (w b b2 a) x))
|
||
|
(ftype-pointer-address (ftype-&ref Eb (w b b2 b) x))))
|
||
|
(if (< (fixnum-width) 32)
|
||
|
'(129 0 4 12 112 125 12 30 112 116 116 116 120 116 116 117)
|
||
|
'(133 0 4 12 112 125 12 30 112 116 116 116 120 116 116 117)))
|
||
|
|
||
|
; ----------------
|
||
|
|
||
|
(equal?
|
||
|
(let ()
|
||
|
(define-ftype A (struct [a1 integer-32]))
|
||
|
(define-ftype B (struct [b1 A] [b2 (* A)]))
|
||
|
(define x (make-ftype-pointer B (foreign-alloc (ftype-sizeof B))))
|
||
|
(define y (make-ftype-pointer A (foreign-alloc (ftype-sizeof A))))
|
||
|
(ftype-set! B (b2) x y)
|
||
|
(ftype-set! A (a1) y 72)
|
||
|
(ftype-set! B (b1 a1) x -35)
|
||
|
(free-after x
|
||
|
(free-after y
|
||
|
(list (ftype-ref A (a1) y) (ftype-ref B (b1 a1) x) (ftype-ref B (b2 * a1) x)))))
|
||
|
'(72 -35 72))
|
||
|
|
||
|
(begin
|
||
|
(define base-ftype*
|
||
|
`((short . "short")
|
||
|
(unsigned-short . "unsigned short")
|
||
|
(int . "int")
|
||
|
(unsigned . "unsigned")
|
||
|
(unsigned-int . "unsigned int")
|
||
|
(long . "long")
|
||
|
(unsigned-long . "unsigned long")
|
||
|
(long-long . "int64_t")
|
||
|
(unsigned-long-long . "uint64_t")
|
||
|
(char . "char")
|
||
|
(wchar . "wchar")
|
||
|
(float . "float")
|
||
|
(double . "double")
|
||
|
(void* . "void *")
|
||
|
(iptr . ,(if (< (fixnum-width) 32) "int32_t" "int64_t"))
|
||
|
(uptr . ,(if (< (fixnum-width) 32) "uint32_t" "uint64_t"))
|
||
|
(fixnum . ,(if (< (fixnum-width) 32) "int32_t" "int64_t"))
|
||
|
(boolean . "int")
|
||
|
(integer-8 . "int8_t")
|
||
|
(unsigned-8 . "uint8_t")
|
||
|
(integer-16 . "int16_t")
|
||
|
(unsigned-16 . "uint16_t")
|
||
|
(integer-32 . "int32_t")
|
||
|
(unsigned-32 . "uint32_t")
|
||
|
(integer-64 . "int64_t")
|
||
|
(unsigned-64 . "uint64_t")
|
||
|
(single-float . "float")
|
||
|
(double-float . "double")))
|
||
|
|
||
|
(define ftype-paths
|
||
|
(lambda (name ftype alist)
|
||
|
(map reverse
|
||
|
(let f ([ftype ftype] [path (list name)] [path* '()])
|
||
|
(if (symbol? ftype)
|
||
|
(cond
|
||
|
[(assq ftype alist) =>
|
||
|
(lambda (a) (f (cdr a) path path*))]
|
||
|
[else (cons path path*)])
|
||
|
(cons path
|
||
|
(record-case ftype
|
||
|
[(struct) field*
|
||
|
(fold-right
|
||
|
(lambda (field path*)
|
||
|
(f (cadr field) (cons (car field) path) path*))
|
||
|
path* field*)]
|
||
|
[(union) field*
|
||
|
(fold-right
|
||
|
(lambda (field path*)
|
||
|
(f (cadr field) (cons (car field) path) path*))
|
||
|
path* field*)]
|
||
|
[(array) (length ftype)
|
||
|
(if (= length 0)
|
||
|
path*
|
||
|
(f ftype (cons (- length 1) path) path*))]
|
||
|
[(*) (ftype) path*]
|
||
|
[else
|
||
|
(errorf 'ftype-paths "can't handle ~s" ftype)])))))))
|
||
|
|
||
|
(define ftype-code
|
||
|
(lambda (ftype name)
|
||
|
(if (symbol? ftype)
|
||
|
(cond
|
||
|
[(assq ftype base-ftype*) =>
|
||
|
(lambda (a) (format "~a ~a;" (cdr a) name))]
|
||
|
[else (format "typedef_~a ~a;" ftype name)])
|
||
|
(record-case ftype
|
||
|
[(struct) field*
|
||
|
(format "struct { ~{~a ~}} ~a;"
|
||
|
(map
|
||
|
(lambda (field) (ftype-code (cadr field) (car field)))
|
||
|
field*)
|
||
|
name)]
|
||
|
[(union) field*
|
||
|
(format "union { ~{~a ~}} ~a;"
|
||
|
(map
|
||
|
(lambda (field) (ftype-code (cadr field) (car field)))
|
||
|
field*)
|
||
|
name)]
|
||
|
[(array) (length ftype)
|
||
|
(ftype-code ftype (format "~a[~d]" name length))]
|
||
|
[(*) (ftype)
|
||
|
(ftype-code ftype (format "*~a" name))]
|
||
|
[else
|
||
|
(errorf 'ftype-code "can't handle ~s" ftype)]))))
|
||
|
|
||
|
(define C-test-code
|
||
|
(lambda (ftype-defn* path* ndefs npaths i* j*)
|
||
|
(let ([ndefs (length ftype-defn*)])
|
||
|
(printf "#include \"~a/ftype.h\"\n\
|
||
|
#define offset(x, y) (int)((char *)&y - (char *)&x)\n\
|
||
|
EXPORT int *foo() {\n\
|
||
|
~{~a\n~}\
|
||
|
static int a[~d];\n\
|
||
|
~{~a\n~}\
|
||
|
~{~a\n~}\
|
||
|
return a;\
|
||
|
}\n"
|
||
|
*mats-dir*
|
||
|
(map
|
||
|
(lambda (ftype-defn)
|
||
|
(format "typedef ~a typedef_~a ~a;"
|
||
|
(ftype-code (cdr ftype-defn) (format "typedef_~a" (car ftype-defn)))
|
||
|
(car ftype-defn)
|
||
|
(car ftype-defn)))
|
||
|
ftype-defn*)
|
||
|
(+ ndefs npaths)
|
||
|
(map
|
||
|
(lambda (i ftype-defn)
|
||
|
(format "a[~a] = sizeof(~a);" i (car ftype-defn)))
|
||
|
i* ftype-defn*)
|
||
|
(map
|
||
|
(lambda (j path)
|
||
|
(format "a[~d] = offset(~a,~a~{~a~});"
|
||
|
j
|
||
|
(car path)
|
||
|
(car path)
|
||
|
(map (lambda (x)
|
||
|
(if (and (integer? x) (exact? x))
|
||
|
(format "[~d]" x)
|
||
|
(format ".~a" x)))
|
||
|
(cdr path))))
|
||
|
j* path*)))))
|
||
|
|
||
|
(define C-compile&load
|
||
|
(lambda (testfile thunk)
|
||
|
(let ([testfile.c (format "testfile-~a.c" testfile)]
|
||
|
[testfile.so (format "testfile-~a.~:[so~;dll~]" testfile
|
||
|
(windows?))])
|
||
|
(with-output-to-file testfile.c thunk 'replace)
|
||
|
(unless (= (case (machine-type)
|
||
|
[(i3osx ti3osx)
|
||
|
(system (format "cc -m32 -dynamiclib -o ~a ~a" testfile.so testfile.c))]
|
||
|
[(a6osx a6osx)
|
||
|
(system (format "cc -m64 -dynamiclib -o ~a ~a" testfile.so testfile.c))]
|
||
|
[(a6nt ta6nt)
|
||
|
(system (format "set cl= && ~a\\..\\c\\vs.bat amd64 && cl /DWIN32 /Fe~a /LD /MD /nologo ~a"
|
||
|
(patch-exec-path *mats-dir*) testfile.so testfile.c))]
|
||
|
[(i3nt ti3nt)
|
||
|
(system (format "set cl= && ~a\\..\\c\\vs.bat x86 && cl /DWIN32 /Fe~a /LD /MD /nologo ~a"
|
||
|
(patch-exec-path *mats-dir*) testfile.so testfile.c))]
|
||
|
[(arm32le tarm32le)
|
||
|
(system (format "cc -fPIC -shared -o ~a ~a" testfile.so testfile.c))]
|
||
|
[else ; this should work for most intel-based systems that use gcc...
|
||
|
(if (> (fixnum-width) 32)
|
||
|
(system (format "cc -m64 -fPIC -shared -o ~a ~a" testfile.so testfile.c))
|
||
|
(system (format "cc -m32 -fPIC -shared -o ~a ~a" testfile.so testfile.c)))])
|
||
|
0)
|
||
|
(errorf 'ftype-test "C compilation failed"))
|
||
|
(load-shared-object (format "./~a" testfile.so)))))
|
||
|
|
||
|
(define-syntax ftype-test
|
||
|
(lambda (x)
|
||
|
(syntax-case x ()
|
||
|
[(_ testfile (id ftype) ...)
|
||
|
(with-syntax ([((path ...) ...)
|
||
|
(let ([id* (datum (id ...))]
|
||
|
[ftype* (datum (ftype ...))])
|
||
|
(let ([alist (map cons id* ftype*)])
|
||
|
(map
|
||
|
(lambda (id ftype)
|
||
|
(map (lambda (x) (datum->syntax #'* x))
|
||
|
(ftype-paths id ftype alist)))
|
||
|
id* ftype*)))])
|
||
|
(let ([ndefs (length #'(ftype ...))]
|
||
|
[npaths (length #'(path ... ...))])
|
||
|
(with-syntax ([(i ...) (enumerate #'(ftype ...))]
|
||
|
[(j ...) (list-tail (enumerate #'(ftype ... path ... ...)) ndefs)]
|
||
|
[((idx . pathx) ...) #'(path ... ...)])
|
||
|
#`(begin
|
||
|
(define-ftype id ftype) ...
|
||
|
(define-ftype result-type (array #,(+ ndefs npaths) int))
|
||
|
(C-compile&load testfile
|
||
|
(lambda ()
|
||
|
(C-test-code
|
||
|
'((id . ftype) ...) '(path ... ...)
|
||
|
#,ndefs #,npaths
|
||
|
'(i ...) '(j ...))))
|
||
|
|
||
|
(let ([results (make-ftype-pointer result-type
|
||
|
((foreign-procedure "foo" () void*)))]
|
||
|
[status #t])
|
||
|
(let ([Scheme-size (ftype-sizeof id)] [C-size (ftype-ref result-type (i) results)])
|
||
|
(unless (= Scheme-size C-size)
|
||
|
(printf "sizeof check failed for ~s (C says ~s, Scheme says ~s)\n" 'ftype C-size Scheme-size)
|
||
|
(set! status #f)))
|
||
|
...
|
||
|
(let ([Scheme-addr (ftype-pointer-address (ftype-&ref idx pathx (make-ftype-pointer idx 0)))]
|
||
|
[C-addr (ftype-ref result-type (j) results)])
|
||
|
(unless (= Scheme-addr C-addr)
|
||
|
(printf "address check failed for ~s (C says ~s, Scheme says ~s)\n"
|
||
|
(cons 'idx 'pathx) C-addr Scheme-addr)
|
||
|
(set! status #f)))
|
||
|
...
|
||
|
status)))))])))
|
||
|
|
||
|
#t)
|
||
|
|
||
|
; can pack as many of these together as we want
|
||
|
; should avoid too many ftype-test forms to avoid
|
||
|
; excessive number of shared object
|
||
|
; NB. choose a different testfile name for each
|
||
|
(ftype-test "ftype1"
|
||
|
[Aa (struct [a1 integer-8] [a2 integer-16] [a3 integer-8])]
|
||
|
[Ab (struct [b1 integer-8])]
|
||
|
[Ac (struct [c1 Aa] [c2 Ab] [c3 double])]
|
||
|
|
||
|
[A int]
|
||
|
[B (struct [a int] [b char])]
|
||
|
[C (struct [c1 B] [c2 A] [c3 double])]
|
||
|
[D (struct
|
||
|
[x integer-32]
|
||
|
[y double-float]
|
||
|
[z (array 25 (struct [a integer-16] [b integer-16]))]
|
||
|
[w (struct
|
||
|
[a integer-32]
|
||
|
[b (union
|
||
|
[b1 (struct [a integer-32] [b integer-32])]
|
||
|
[b2 (struct [a integer-8] [b double])])])]
|
||
|
[v (* C)])]
|
||
|
[E (struct
|
||
|
[z (array 25 (struct [a unsigned-short] [b unsigned]))]
|
||
|
[x unsigned-long]
|
||
|
[w (struct
|
||
|
[a long-long]
|
||
|
[b (union
|
||
|
[b1 (struct [a int] [b int])]
|
||
|
[b2 (struct [a char] [b double])])])]
|
||
|
[y double]
|
||
|
[u (array 9 float)]
|
||
|
[v (* C)]
|
||
|
[t char])]
|
||
|
[F (struct
|
||
|
[a integer-32]
|
||
|
[b double])]
|
||
|
[G (struct
|
||
|
[a double]
|
||
|
[b integer-32])]
|
||
|
[H (struct
|
||
|
[a integer-32]
|
||
|
[b (union
|
||
|
[b1 double]
|
||
|
[b2 (struct [b2a integer-32] [b2b integer-32])])])]
|
||
|
[I (struct
|
||
|
[a integer-32]
|
||
|
[b (array 1 double)])]
|
||
|
[J (struct
|
||
|
[a (array 1 double)]
|
||
|
[b integer-32])]
|
||
|
[K1 (union
|
||
|
[a double]
|
||
|
[b (struct
|
||
|
[a integer-32]
|
||
|
[b integer-32])])]
|
||
|
[K2 (struct
|
||
|
[a K1]
|
||
|
[b integer-32])]
|
||
|
[K2x (struct
|
||
|
[a integer-32]
|
||
|
[b (union
|
||
|
[a double]
|
||
|
[b (struct
|
||
|
[a integer-32]
|
||
|
[b integer-32])])])]
|
||
|
[K3 (struct
|
||
|
[a integer-32]
|
||
|
[b K1])]
|
||
|
[K3x (struct
|
||
|
[a integer-32]
|
||
|
[b (union
|
||
|
[a double]
|
||
|
[b (struct
|
||
|
[a integer-32]
|
||
|
[b integer-32])])])]
|
||
|
[M1 (union
|
||
|
[b (struct
|
||
|
[a integer-32]
|
||
|
[b double])]
|
||
|
[a double])]
|
||
|
[M2 (struct [a M1] [b integer-32])]
|
||
|
[M3 (struct [a integer-32] [b M1])]
|
||
|
[N1 (struct [a integer-32] [b integer-64])]
|
||
|
)
|
||
|
|
||
|
; ----------------
|
||
|
|
||
|
(equal?
|
||
|
(let ()
|
||
|
(define-ftype A
|
||
|
(struct
|
||
|
[a1 double]
|
||
|
[a2 float]
|
||
|
[a3 long-long]
|
||
|
[a4 unsigned-long-long]
|
||
|
[a5 long]
|
||
|
[a6 unsigned-long]
|
||
|
[a7 int]
|
||
|
[a8 unsigned]
|
||
|
[a9 unsigned-int]
|
||
|
[a10 short]
|
||
|
[a11 unsigned-short]
|
||
|
[a12 wchar]
|
||
|
[a13 char]
|
||
|
[a14 boolean]
|
||
|
[a15 fixnum]
|
||
|
[a16 iptr]
|
||
|
[a17 uptr]
|
||
|
[a18 void*]))
|
||
|
(define a (make-ftype-pointer A (foreign-alloc (ftype-sizeof A))))
|
||
|
(free-after a
|
||
|
(ftype-set! A (a1) a 3.5)
|
||
|
(ftype-set! A (a2) a -4.5)
|
||
|
(ftype-set! A (a3) a -30000)
|
||
|
(ftype-set! A (a4) a #xabcdef02)
|
||
|
(ftype-set! A (a5) a -30001)
|
||
|
(ftype-set! A (a6) a #xabcdef03)
|
||
|
(ftype-set! A (a7) a -30002)
|
||
|
(ftype-set! A (a8) a #xabcdef04)
|
||
|
(ftype-set! A (a9) a #xabcdef05)
|
||
|
(ftype-set! A (a10) a -30003)
|
||
|
(ftype-set! A (a11) a #xab06)
|
||
|
(ftype-set! A (a12) a #\a)
|
||
|
(ftype-set! A (a13) a #\b)
|
||
|
(ftype-set! A (a14) a 'hello)
|
||
|
(ftype-set! A (a15) a (most-positive-fixnum))
|
||
|
(ftype-set! A (a16) a -30004)
|
||
|
(ftype-set! A (a17) a #xabcdef07)
|
||
|
(ftype-set! A (a18) a 25000)
|
||
|
(list
|
||
|
(ftype-ref A (a1) a)
|
||
|
(ftype-ref A (a2) a)
|
||
|
(ftype-ref A (a3) a)
|
||
|
(ftype-ref A (a4) a)
|
||
|
(ftype-ref A (a5) a)
|
||
|
(ftype-ref A (a6) a)
|
||
|
(ftype-ref A (a7) a)
|
||
|
(ftype-ref A (a8) a)
|
||
|
(ftype-ref A (a9) a)
|
||
|
(ftype-ref A (a10) a)
|
||
|
(ftype-ref A (a11) a)
|
||
|
(ftype-ref A (a12) a)
|
||
|
(ftype-ref A (a13) a)
|
||
|
(ftype-ref A (a14) a)
|
||
|
(ftype-ref A (a15) a)
|
||
|
(ftype-ref A (a16) a)
|
||
|
(ftype-ref A (a17) a)
|
||
|
(ftype-ref A (a18) a))))
|
||
|
`(3.5
|
||
|
-4.5
|
||
|
-30000
|
||
|
#xabcdef02
|
||
|
-30001
|
||
|
#xabcdef03
|
||
|
-30002
|
||
|
#xabcdef04
|
||
|
#xabcdef05
|
||
|
-30003
|
||
|
#xab06
|
||
|
#\a
|
||
|
#\b
|
||
|
#t
|
||
|
,(most-positive-fixnum)
|
||
|
-30004
|
||
|
#xabcdef07
|
||
|
25000))
|
||
|
|
||
|
(begin
|
||
|
(define-ftype A
|
||
|
(array 3
|
||
|
(struct
|
||
|
[a int]
|
||
|
[b short])))
|
||
|
(define x (make-ftype-pointer A (foreign-alloc (ftype-sizeof A))))
|
||
|
(do ([i 0 (fx+ i 1)])
|
||
|
((fx= i 3))
|
||
|
(ftype-set! A (i a) x (expt 2 i))
|
||
|
(ftype-set! A (i b) x (- 1 (expt 2 i))))
|
||
|
#t)
|
||
|
|
||
|
(eqv? (ftype-ref A (0 a) x) 1)
|
||
|
(eqv? (ftype-ref A (0 b) x) 0)
|
||
|
(eqv? (ftype-ref A (1 a) x) 2)
|
||
|
(eqv? (ftype-ref A (1 b) x) -1)
|
||
|
(eqv? (ftype-ref A (2 a) x) 4)
|
||
|
(eqv? (ftype-ref A (2 b) x) -3)
|
||
|
|
||
|
(error? ; invalid index
|
||
|
(ftype-ref A (3 a) x))
|
||
|
(error? ; invalid index
|
||
|
(ftype-ref A (-1 a) x))
|
||
|
(error? ; invalid index
|
||
|
(ftype-ref A (x a) x))
|
||
|
(error? ; invalid index
|
||
|
(ftype-ref A (1.0 a) x))
|
||
|
(error? ; invalid index
|
||
|
(ftype-&ref A (3) x))
|
||
|
(error? ; invalid index
|
||
|
(ftype-&ref A (-1) x))
|
||
|
(error? ; invalid index
|
||
|
(ftype-&ref A (x) x))
|
||
|
(error? ; invalid index
|
||
|
(ftype-&ref A (1.0) x))
|
||
|
(error? ; invalid index
|
||
|
(ftype-&ref A (3 a) x))
|
||
|
(error? ; invalid index
|
||
|
(ftype-&ref A (-1 a) x))
|
||
|
(error? ; invalid index
|
||
|
(ftype-&ref A (x a) x))
|
||
|
(error? ; invalid index
|
||
|
(ftype-&ref A (1.0 a) x))
|
||
|
(error? ; invalid index
|
||
|
(ftype-set! A (3 a) x 0))
|
||
|
(error? ; invalid index
|
||
|
(ftype-set! A (-1 a) x 0))
|
||
|
(error? ; invalid index
|
||
|
(ftype-set! A (x a) x 0))
|
||
|
(error? ; invalid index
|
||
|
(ftype-set! A (1.0 a) x 0))
|
||
|
(error? ; invalid value
|
||
|
(ftype-set! A (1 a) x 3.2))
|
||
|
(error? ; invalid index
|
||
|
(ftype-set! A (1 a) x #\a))
|
||
|
(error? ; invalid index
|
||
|
(ftype-set! A (1 a) x (expt 2 1000)))
|
||
|
(error? ; target cannot be referenced
|
||
|
(ftype-ref A (1) x))
|
||
|
(error? ; target cannot be assigned
|
||
|
(ftype-set! A (1) x 0))
|
||
|
|
||
|
(begin
|
||
|
(fptr-free x)
|
||
|
#t)
|
||
|
|
||
|
; ----------------
|
||
|
|
||
|
(begin
|
||
|
(define-ftype Q
|
||
|
(struct
|
||
|
[x integer-16]
|
||
|
[y (array 100 integer-32)]))
|
||
|
(define x (make-ftype-pointer Q (foreign-alloc (- (ftype-sizeof Q) (* (ftype-sizeof integer-32) (- 100 10))))))
|
||
|
#t)
|
||
|
(eqv? (ftype-sizeof Q) 404)
|
||
|
(eqv? (ftype-pointer-address (ftype-&ref Q (y) (make-ftype-pointer Q 0))) 4)
|
||
|
(begin
|
||
|
(do ([i 0 (fx+ i 1)])
|
||
|
((fx= i 10))
|
||
|
(ftype-set! Q (y i) x (+ (* i 3) 2)))
|
||
|
#t)
|
||
|
(equal?
|
||
|
(map (lambda (i) (ftype-ref Q (y i) x)) (iota 10))
|
||
|
(map (lambda (i) (+ (* i 3) 2)) (iota 10)))
|
||
|
(begin
|
||
|
(fptr-free x)
|
||
|
#t)
|
||
|
|
||
|
; ----------------
|
||
|
(begin
|
||
|
(define-ftype A (struct [x double]))
|
||
|
(define-ftype B (struct [head int] [tail (* A)]))
|
||
|
(define a (make-ftype-pointer A (foreign-alloc (ftype-sizeof A))))
|
||
|
(define b (make-ftype-pointer B (foreign-alloc (ftype-sizeof B))))
|
||
|
(ftype-set! B (tail) b a)
|
||
|
(ftype-set! B (head) b 17)
|
||
|
(ftype-set! A (x) a 3.25)
|
||
|
#t)
|
||
|
(equal?
|
||
|
(ftype-pointer->sexpr a)
|
||
|
'(struct [x 3.25]))
|
||
|
(equal?
|
||
|
(ftype-pointer->sexpr b)
|
||
|
'(struct [head 17] [tail (* (struct [x 3.25]))]))
|
||
|
(error? ; not a scalar
|
||
|
(ftype-ref B (tail *) b))
|
||
|
(ftype-pointer? (ftype-ref B (tail) b))
|
||
|
(begin
|
||
|
(ftype-set! A (x) (ftype-ref B (tail) b) -5.5)
|
||
|
#t)
|
||
|
(eqv? (ftype-ref B (tail * x) b) -5.5)
|
||
|
|
||
|
(begin
|
||
|
(fptr-free a)
|
||
|
(fptr-free b)
|
||
|
#t)
|
||
|
; ----------------
|
||
|
(begin
|
||
|
(define-ftype Qlist
|
||
|
(struct
|
||
|
[head int]
|
||
|
[tail (* Qlist)]))
|
||
|
(define x (make-ftype-pointer Qlist (foreign-alloc (ftype-sizeof Qlist))))
|
||
|
(ftype-set! Qlist (head) x 17)
|
||
|
(ftype-set! Qlist (tail) x x)
|
||
|
#t)
|
||
|
(eqv? (ftype-ref Qlist (head) x) 17)
|
||
|
(eqv? (ftype-ref Qlist (tail * head) x) 17)
|
||
|
(eqv? (ftype-ref Qlist (tail * tail * tail * tail * head) x) 17)
|
||
|
(equal?
|
||
|
(ftype-pointer->sexpr x)
|
||
|
'#0=(struct [head 17] [tail (* #0#)]))
|
||
|
(begin
|
||
|
(fptr-free x)
|
||
|
#t)
|
||
|
|
||
|
; ----------------
|
||
|
(begin
|
||
|
(define-ftype
|
||
|
[Qfrob (struct
|
||
|
[head int]
|
||
|
[tail (* Qsnark)])]
|
||
|
[Qsnark (struct
|
||
|
[head int]
|
||
|
[tail (* Qfrob)])])
|
||
|
(define x (make-ftype-pointer Qfrob (foreign-alloc (ftype-sizeof Qfrob))))
|
||
|
(ftype-set! Qfrob (head) x 17)
|
||
|
(define y (make-ftype-pointer Qsnark (foreign-alloc (ftype-sizeof Qsnark))))
|
||
|
(ftype-set! Qfrob (tail) x y)
|
||
|
(ftype-set! Qfrob (tail * head) x -57)
|
||
|
(ftype-set! Qfrob (tail * tail) x x)
|
||
|
#t)
|
||
|
(eqv? (ftype-ref Qfrob (head) x) 17)
|
||
|
(eqv? (ftype-ref Qfrob (tail * head) x) -57)
|
||
|
(eqv? (ftype-ref Qfrob (tail * tail * tail * tail * head) x) 17)
|
||
|
(eqv? (ftype-ref Qfrob (tail * tail * tail * tail * tail * head) x) -57)
|
||
|
(eqv? (ftype-ref Qsnark (head) (ftype-ref Qfrob (tail) x)) -57)
|
||
|
(equal?
|
||
|
(ftype-pointer->sexpr x)
|
||
|
'#1=(struct
|
||
|
[head 17]
|
||
|
[tail (* (struct [head -57] [tail (* #1#)]))]))
|
||
|
(begin
|
||
|
(fptr-free x)
|
||
|
(fptr-free y)
|
||
|
#t)
|
||
|
|
||
|
; ----------------
|
||
|
(error? ; invalid recursive or forward reference
|
||
|
(define-ftype
|
||
|
[Qfrob (struct
|
||
|
[head int]
|
||
|
[xtra Qfrob]
|
||
|
[tail (* Qsnark)])]
|
||
|
[Qsnark (struct
|
||
|
[head int]
|
||
|
[tail (* Qfrob)])]))
|
||
|
(error? ; invalid recursive or forward reference
|
||
|
(define-ftype
|
||
|
[Qfrob (struct
|
||
|
[head int]
|
||
|
[xtra Qsnark]
|
||
|
[tail (* Qsnark)])]
|
||
|
[Qsnark (struct
|
||
|
[head int]
|
||
|
[tail (* Qfrob)])]))
|
||
|
|
||
|
; ----------------
|
||
|
(begin
|
||
|
(define-ftype
|
||
|
[Qfrob (struct
|
||
|
[head int]
|
||
|
[tail (* Qsnark)])]
|
||
|
[Qsnark (struct
|
||
|
[head int]
|
||
|
[xtra Qfrob]
|
||
|
[tail (* Qfrob)])])
|
||
|
(define x (make-ftype-pointer Qfrob (foreign-alloc (ftype-sizeof Qfrob))))
|
||
|
(ftype-set! Qfrob (head) x 17)
|
||
|
(define y (make-ftype-pointer Qsnark (foreign-alloc (ftype-sizeof Qsnark))))
|
||
|
(ftype-set! Qfrob (tail) x y)
|
||
|
(ftype-set! Qfrob (tail * head) x -57)
|
||
|
(ftype-set! Qfrob (tail * tail) x x)
|
||
|
(ftype-set! Qfrob (tail * xtra head) x 83)
|
||
|
(ftype-set! Qfrob (tail * xtra tail) x (ftype-ref Qfrob (tail) x))
|
||
|
#t)
|
||
|
(eqv? (ftype-ref Qfrob (head) x) 17)
|
||
|
(eqv? (ftype-ref Qfrob (tail * head) x) -57)
|
||
|
(eqv? (ftype-ref Qfrob (tail * tail * tail * tail * head) x) 17)
|
||
|
(eqv? (ftype-ref Qfrob (tail * tail * tail * tail * tail * head) x) -57)
|
||
|
(eqv? (ftype-ref Qsnark (head) (ftype-ref Qfrob (tail) x)) -57)
|
||
|
(eqv? (ftype-ref Qfrob (tail * xtra head) x) 83)
|
||
|
(eqv? (ftype-ref Qfrob (tail * xtra tail * head) x) -57)
|
||
|
(equal?
|
||
|
(ftype-pointer-ftype x)
|
||
|
'(struct
|
||
|
[head int]
|
||
|
[tail (* Qsnark)]))
|
||
|
(equal?
|
||
|
(ftype-pointer-ftype (ftype-ref Qfrob (tail) x))
|
||
|
'(struct
|
||
|
[head int]
|
||
|
[xtra Qfrob]
|
||
|
[tail (* Qfrob)]))
|
||
|
(equal?
|
||
|
(ftype-pointer->sexpr x)
|
||
|
'#2=(struct
|
||
|
[head 17]
|
||
|
[tail (* #3=(struct
|
||
|
[head -57]
|
||
|
[xtra (struct [head 83] [tail (* #3#)])]
|
||
|
[tail (* #2#)]))]))
|
||
|
(begin
|
||
|
(fptr-free x)
|
||
|
(fptr-free y)
|
||
|
#t)
|
||
|
|
||
|
; ----------------
|
||
|
(begin
|
||
|
(define-ftype A (bits [x unsigned 3] [y unsigned 5]))
|
||
|
(define-ftype B (* A))
|
||
|
(define a (make-ftype-pointer A (foreign-alloc (ftype-sizeof A))))
|
||
|
(define b (make-ftype-pointer B (foreign-alloc (ftype-sizeof B))))
|
||
|
(ftype-set! B () b a)
|
||
|
#t)
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! A (x) a 3)
|
||
|
(ftype-set! A (y) a 31)
|
||
|
#t)
|
||
|
|
||
|
(eqv? (ftype-ref A (x) a) 3)
|
||
|
(eqv? (ftype-ref A (y) a) 31)
|
||
|
(eqv? (ftype-ref B (* x) b) 3)
|
||
|
(eqv? (ftype-ref B (* y) b) 31)
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! A (x) a 6)
|
||
|
(ftype-set! A (y) a 21)
|
||
|
#t)
|
||
|
|
||
|
(eqv? (ftype-ref A (x) a) 6)
|
||
|
(eqv? (ftype-ref A (y) a) 21)
|
||
|
(eqv? (ftype-ref B (* x) b) 6)
|
||
|
(eqv? (ftype-ref B (* y) b) 21)
|
||
|
|
||
|
(begin
|
||
|
(fptr-free a)
|
||
|
(fptr-free b)
|
||
|
#t)
|
||
|
|
||
|
; ----------------
|
||
|
(begin
|
||
|
(define-ftype Q
|
||
|
(struct
|
||
|
[x integer-16]
|
||
|
[y (array 0 iptr)]))
|
||
|
(define qlen 17)
|
||
|
(define q (make-ftype-pointer Q (foreign-alloc (+ (ftype-sizeof Q) (* qlen (ftype-sizeof iptr))))))
|
||
|
(do ([i 0 (fx+ i 1)]) ((fx= i qlen)) (ftype-set! Q (y i) q (* i 7)))
|
||
|
#t)
|
||
|
|
||
|
(error? ; invalid index
|
||
|
(ftype-ref Q (y -1) q))
|
||
|
(error? ; invalid index
|
||
|
(ftype-ref Q (y 3.2) q))
|
||
|
(error? ; invalid index
|
||
|
(ftype-ref Q (y (+ (most-positive-fixnum) 1)) q))
|
||
|
(error? ; invalid index
|
||
|
(ftype-set! Q (y -1) q 7))
|
||
|
(error? ; invalid index
|
||
|
(ftype-set! Q (y 3.2) q 7))
|
||
|
(error? ; invalid index
|
||
|
(ftype-set! Q (y (+ (most-positive-fixnum) 1)) q 7))
|
||
|
(error? ; invalid index
|
||
|
(ftype-&ref Q (y -1) q))
|
||
|
(error? ; invalid index
|
||
|
(ftype-&ref Q (y 3.2) q))
|
||
|
(error? ; invalid index
|
||
|
(ftype-&ref Q (y (+ (most-positive-fixnum) 1)) q))
|
||
|
(error? ; invalid index
|
||
|
(ftype-locked-incr! Q (y -1) q))
|
||
|
(error? ; invalid index
|
||
|
(ftype-locked-decr! Q (y 3.2) q))
|
||
|
(error? ; invalid index
|
||
|
(ftype-lock! Q (y (+ (most-positive-fixnum) 1)) q))
|
||
|
(error? ; invalid index
|
||
|
(ftype-spin-lock! Q (y (+ (most-positive-fixnum) 1)) q))
|
||
|
(eqv? (ftype-ref Q (y 0) q) 0)
|
||
|
(eqv? (ftype-ref Q (y 7) q) 49)
|
||
|
(eqv? (ftype-ref Q (y 16) q) 112)
|
||
|
|
||
|
(begin
|
||
|
(fptr-free q)
|
||
|
#t)
|
||
|
|
||
|
; ----------------
|
||
|
(guard (c [(and (message-condition? c)
|
||
|
(equal? (condition-message c) "non-fixnum overall size for ftype"))
|
||
|
#t])
|
||
|
(eval
|
||
|
'(meta-cond
|
||
|
[(= (fixnum-width) 30)
|
||
|
(define-ftype Q
|
||
|
(struct
|
||
|
[x integer-16]
|
||
|
[y (array #xFFFFFFF integer-32)]))]
|
||
|
[(= (fixnum-width) 61)
|
||
|
(define-ftype Q
|
||
|
(struct
|
||
|
[x integer-16]
|
||
|
[y (array #xFFFFFFFFFFFFFFF integer-32)]))]
|
||
|
[else (errorf #f "unexpected fixnum-width")]))
|
||
|
#t)
|
||
|
|
||
|
; ----------------
|
||
|
(begin
|
||
|
(define-syntax $dfvalerr
|
||
|
(syntax-rules ()
|
||
|
[(_ type)
|
||
|
(let ()
|
||
|
(define-ftype A (endian big type))
|
||
|
(define x (make-ftype-pointer A (foreign-alloc (ftype-sizeof A))))
|
||
|
(guard (c [#t (fptr-free x) (raise c)])
|
||
|
(ftype-set! A () x 'oops)))]))
|
||
|
#t)
|
||
|
|
||
|
(error? ($dfvalerr (* float)))
|
||
|
(error? ($dfvalerr integer-8))
|
||
|
(error? ($dfvalerr unsigned-8))
|
||
|
(error? ($dfvalerr integer-16))
|
||
|
(error? ($dfvalerr unsigned-16))
|
||
|
(error? ($dfvalerr integer-32))
|
||
|
(error? ($dfvalerr unsigned-32))
|
||
|
(error? ($dfvalerr integer-64))
|
||
|
(error? ($dfvalerr unsigned-64))
|
||
|
(error? ($dfvalerr double-float))
|
||
|
(error? ($dfvalerr single-float))
|
||
|
(error? ($dfvalerr char))
|
||
|
(error? ($dfvalerr wchar))
|
||
|
(error? ($dfvalerr fixnum))
|
||
|
(error? ($dfvalerr iptr))
|
||
|
(error? ($dfvalerr uptr))
|
||
|
(error? ($dfvalerr void*))
|
||
|
(error? ($dfvalerr int))
|
||
|
(error? ($dfvalerr unsigned))
|
||
|
(error? ($dfvalerr unsigned-int))
|
||
|
(error? ($dfvalerr short))
|
||
|
(error? ($dfvalerr unsigned-short))
|
||
|
(error? ($dfvalerr long))
|
||
|
(error? ($dfvalerr unsigned-long))
|
||
|
(error? ($dfvalerr long-long))
|
||
|
(error? ($dfvalerr unsigned-long-long))
|
||
|
(error? ($dfvalerr double))
|
||
|
(error? ($dfvalerr float))
|
||
|
|
||
|
; ----------------
|
||
|
(begin
|
||
|
(define-syntax $dfvalerr
|
||
|
(syntax-rules ()
|
||
|
[(_ type)
|
||
|
(let ()
|
||
|
(define-ftype A (endian little type))
|
||
|
(define x (make-ftype-pointer A (foreign-alloc (ftype-sizeof A))))
|
||
|
(guard (c [#t (fptr-free x) (raise c)])
|
||
|
(ftype-set! A () x 'oops)))]))
|
||
|
#t)
|
||
|
|
||
|
(error? ($dfvalerr (* float)))
|
||
|
(error? ($dfvalerr integer-8))
|
||
|
(error? ($dfvalerr unsigned-8))
|
||
|
(error? ($dfvalerr integer-16))
|
||
|
(error? ($dfvalerr unsigned-16))
|
||
|
(error? ($dfvalerr integer-32))
|
||
|
(error? ($dfvalerr unsigned-32))
|
||
|
(error? ($dfvalerr integer-64))
|
||
|
(error? ($dfvalerr unsigned-64))
|
||
|
(error? ($dfvalerr double-float))
|
||
|
(error? ($dfvalerr single-float))
|
||
|
(error? ($dfvalerr char))
|
||
|
(error? ($dfvalerr wchar))
|
||
|
(error? ($dfvalerr fixnum))
|
||
|
(error? ($dfvalerr iptr))
|
||
|
(error? ($dfvalerr uptr))
|
||
|
(error? ($dfvalerr void*))
|
||
|
(error? ($dfvalerr int))
|
||
|
(error? ($dfvalerr unsigned))
|
||
|
(error? ($dfvalerr unsigned-int))
|
||
|
(error? ($dfvalerr short))
|
||
|
(error? ($dfvalerr unsigned-short))
|
||
|
(error? ($dfvalerr long))
|
||
|
(error? ($dfvalerr unsigned-long))
|
||
|
(error? ($dfvalerr long-long))
|
||
|
(error? ($dfvalerr unsigned-long-long))
|
||
|
(error? ($dfvalerr double))
|
||
|
(error? ($dfvalerr float))
|
||
|
|
||
|
; ----------------
|
||
|
(begin
|
||
|
(define-syntax $dfvalerr
|
||
|
(syntax-rules ()
|
||
|
[(_ type)
|
||
|
(begin
|
||
|
(with-output-to-file "testfile.ss"
|
||
|
(lambda ()
|
||
|
(pretty-print
|
||
|
'(let ()
|
||
|
(define-ftype A type)
|
||
|
(define x (make-ftype-pointer A 0))
|
||
|
(ftype-set! A () x 'oops))))
|
||
|
'replace)
|
||
|
(load "testfile.ss"))]))
|
||
|
#t)
|
||
|
|
||
|
(error? ($dfvalerr (* float)))
|
||
|
(error? ($dfvalerr integer-8))
|
||
|
(error? ($dfvalerr unsigned-8))
|
||
|
(error? ($dfvalerr integer-16))
|
||
|
(error? ($dfvalerr unsigned-16))
|
||
|
(error? ($dfvalerr integer-32))
|
||
|
(error? ($dfvalerr unsigned-32))
|
||
|
(error? ($dfvalerr integer-64))
|
||
|
(error? ($dfvalerr unsigned-64))
|
||
|
(error? ($dfvalerr double-float))
|
||
|
(error? ($dfvalerr single-float))
|
||
|
(error? ($dfvalerr char))
|
||
|
(error? ($dfvalerr wchar))
|
||
|
(error? ($dfvalerr fixnum))
|
||
|
(error? ($dfvalerr iptr))
|
||
|
(error? ($dfvalerr uptr))
|
||
|
(error? ($dfvalerr void*))
|
||
|
(error? ($dfvalerr int))
|
||
|
(error? ($dfvalerr unsigned))
|
||
|
(error? ($dfvalerr unsigned-int))
|
||
|
(error? ($dfvalerr short))
|
||
|
(error? ($dfvalerr unsigned-short))
|
||
|
(error? ($dfvalerr long))
|
||
|
(error? ($dfvalerr unsigned-long))
|
||
|
(error? ($dfvalerr long-long))
|
||
|
(error? ($dfvalerr unsigned-long-long))
|
||
|
(error? ($dfvalerr double))
|
||
|
(error? ($dfvalerr float))
|
||
|
|
||
|
; ----------------
|
||
|
(error? ; invalid syntax
|
||
|
(ftype-sizeof (struct [a int])))
|
||
|
(error? ; invalid syntax
|
||
|
(make-ftype-pointer (struct [a int]) 0))
|
||
|
(error? ; invalid syntax
|
||
|
(ftype-pointer? (struct [a int]) 0))
|
||
|
(error? ; invalid syntax
|
||
|
(ftype-&ref (struct [a int]) (a) x))
|
||
|
(error? ; invalid syntax
|
||
|
(ftype-ref (struct [a int]) (a) x))
|
||
|
(error? ; invalid syntax
|
||
|
(ftype-set! (struct [a int]) (a) x 0))
|
||
|
|
||
|
; ----------------
|
||
|
(begin
|
||
|
(define-ftype A (packed (struct [a char] [b int])))
|
||
|
(define-ftype B (struct [a A] [b (* A)]))
|
||
|
(define b (make-ftype-pointer B (foreign-alloc (ftype-sizeof B))))
|
||
|
#t)
|
||
|
|
||
|
(ftype-pointer? A (ftype-&ref B (a) b))
|
||
|
(ftype-pointer? A (ftype-ref B (b) b))
|
||
|
|
||
|
(begin
|
||
|
(fptr-free b)
|
||
|
#t)
|
||
|
|
||
|
; ----------------
|
||
|
(begin
|
||
|
;; Bind a native built-in type as a normal ftype (note this fixes the endianness).
|
||
|
(define-ftype integer-8 integer-8)
|
||
|
(define-ftype float float)
|
||
|
(define-ftype S (struct [i integer-8] [f float]))
|
||
|
#t)
|
||
|
(let ([int-fptr (make-ftype-pointer integer-8 (foreign-alloc (ftype-sizeof integer-8)))]
|
||
|
[flo-fptr (make-ftype-pointer float (foreign-alloc (ftype-sizeof float)))]
|
||
|
[s-fptr (make-ftype-pointer S (foreign-alloc (ftype-sizeof S)))])
|
||
|
(ftype-set! integer-8 () int-fptr 42)
|
||
|
(ftype-set! float () flo-fptr 7.125)
|
||
|
(ftype-set! S (i) s-fptr 75)
|
||
|
(ftype-set! S (f) s-fptr 8.25)
|
||
|
(let ([a (ftype-ref integer-8 () int-fptr)]
|
||
|
[b (ftype-ref float () flo-fptr)]
|
||
|
[c (ftype-ref S (i) s-fptr)]
|
||
|
[d (ftype-ref S (f) s-fptr)])
|
||
|
(foreign-free (ftype-pointer-address int-fptr))
|
||
|
(foreign-free (ftype-pointer-address flo-fptr))
|
||
|
(foreign-free (ftype-pointer-address s-fptr))
|
||
|
(equal? (list a b c d) (list 42 7.125 75 8.25))))
|
||
|
|
||
|
(begin
|
||
|
;; Show that binding does not interfere with native types.
|
||
|
(define-syntax unsigned-16 (make-compile-time-value "Non-interfering binding"))
|
||
|
(let ([fptr (make-ftype-pointer unsigned-16 0)])
|
||
|
(= (ftype-pointer-address fptr) 0)))
|
||
|
)
|
||
|
|
||
|
(mat ftype-pointer-address-optimizations
|
||
|
(begin
|
||
|
(define-ftype A (struct (x iptr)))
|
||
|
(define-ftype B (struct (x uptr)))
|
||
|
(define a1 (make-ftype-pointer A 0))
|
||
|
(define a1-also (make-ftype-pointer A 0))
|
||
|
(define a2 (make-ftype-pointer A (+ (most-positive-fixnum) 1)))
|
||
|
(define a2-also (make-ftype-pointer A (+ (most-positive-fixnum) 1)))
|
||
|
#t)
|
||
|
|
||
|
(error? (ftype-pointer-null? '()))
|
||
|
(error? (ftype-pointer=? "oops" a1))
|
||
|
(error? (ftype-pointer=? a1 17))
|
||
|
|
||
|
(ftype-pointer-null? a1)
|
||
|
(= (ftype-pointer-address a1) 0)
|
||
|
(r6rs:= (ftype-pointer-address a1) 0)
|
||
|
(eqv? (ftype-pointer-address a1) 0)
|
||
|
(equal? (ftype-pointer-address a1) 0)
|
||
|
(= 0 (ftype-pointer-address a1))
|
||
|
(r6rs:= 0 (ftype-pointer-address a1))
|
||
|
(eqv? 0 (ftype-pointer-address a1))
|
||
|
(equal? 0 (ftype-pointer-address a1))
|
||
|
(not (< (ftype-pointer-address a1) 0))
|
||
|
|
||
|
(not (ftype-pointer-null? a2))
|
||
|
(not (= (ftype-pointer-address a2) 0))
|
||
|
(not (r6rs:= (ftype-pointer-address a2) 0))
|
||
|
(not (eqv? (ftype-pointer-address a2) 0))
|
||
|
(not (equal? (ftype-pointer-address a2) 0))
|
||
|
(not (= 0 (ftype-pointer-address a2)))
|
||
|
(not (r6rs:= 0 (ftype-pointer-address a2)))
|
||
|
(not (eqv? 0 (ftype-pointer-address a2)))
|
||
|
(not (equal? 0 (ftype-pointer-address a2)))
|
||
|
(not (< (ftype-pointer-address a2) 0))
|
||
|
|
||
|
(ftype-pointer=? a1 a1-also)
|
||
|
(= (ftype-pointer-address a1) (ftype-pointer-address a1-also))
|
||
|
(r6rs:= (ftype-pointer-address a1) (ftype-pointer-address a1-also))
|
||
|
(eqv? (ftype-pointer-address a1) (ftype-pointer-address a1-also))
|
||
|
(equal? (ftype-pointer-address a1) (ftype-pointer-address a1-also))
|
||
|
(ftype-pointer=? a2 a2-also)
|
||
|
(= (ftype-pointer-address a2) (ftype-pointer-address a2-also))
|
||
|
(r6rs:= (ftype-pointer-address a2) (ftype-pointer-address a2-also))
|
||
|
(eqv? (ftype-pointer-address a2) (ftype-pointer-address a2-also))
|
||
|
(equal? (ftype-pointer-address a2) (ftype-pointer-address a2-also))
|
||
|
(not (ftype-pointer=? a1 a2))
|
||
|
(not (= (ftype-pointer-address a2) (ftype-pointer-address a1)))
|
||
|
(not (r6rs:= (ftype-pointer-address a2) (ftype-pointer-address a1)))
|
||
|
(not (eqv? (ftype-pointer-address a2) (ftype-pointer-address a1)))
|
||
|
(not (equal? (ftype-pointer-address a2) (ftype-pointer-address a1)))
|
||
|
|
||
|
(begin
|
||
|
(define $f1
|
||
|
(lambda (a)
|
||
|
(ftype-pointer-null? a)))
|
||
|
(define $f2a
|
||
|
(lambda (a)
|
||
|
(#%= (#3%ftype-pointer-address a1) 0)))
|
||
|
(define $f2b
|
||
|
(lambda (a)
|
||
|
(#%r6rs:= (#3%ftype-pointer-address a1) 0)))
|
||
|
(define $f3
|
||
|
(lambda (a)
|
||
|
(#%eqv? (#3%ftype-pointer-address a) 0)))
|
||
|
(define $f4
|
||
|
(lambda (a)
|
||
|
(#%equal? (#3%ftype-pointer-address a) 0)))
|
||
|
(define $f5a
|
||
|
(lambda (a)
|
||
|
(#%= 0 (#3%ftype-pointer-address a))))
|
||
|
(define $f5b
|
||
|
(lambda (a)
|
||
|
(#%r6rs:= 0 (#3%ftype-pointer-address a))))
|
||
|
(define $f6
|
||
|
(lambda (a)
|
||
|
(#%eqv? 0 (#3%ftype-pointer-address a))))
|
||
|
(define $f7
|
||
|
(lambda (a)
|
||
|
(#%equal? 0 (#3%ftype-pointer-address a))))
|
||
|
(define $f8
|
||
|
(lambda (a b)
|
||
|
(ftype-pointer=? a b)))
|
||
|
(define $f9a
|
||
|
(lambda (a b)
|
||
|
(#%= (#3%ftype-pointer-address b) (#3%ftype-pointer-address a))))
|
||
|
(define $f9b
|
||
|
(lambda (a b)
|
||
|
(#%r6rs:= (#3%ftype-pointer-address b) (#3%ftype-pointer-address a))))
|
||
|
(define $f10
|
||
|
(lambda (a b)
|
||
|
(#%eqv? (#3%ftype-pointer-address b) (#3%ftype-pointer-address a))))
|
||
|
(define $f11
|
||
|
(lambda (a b)
|
||
|
(#%equal? (#3%ftype-pointer-address b) (#3%ftype-pointer-address a))))
|
||
|
#t)
|
||
|
|
||
|
; check to make sure we don't allocate a bignum while checking
|
||
|
(let ([s0 (statistics)])
|
||
|
(do ([n 1000 (fx- n 1)])
|
||
|
((fx= n 0))
|
||
|
($f1 a1)
|
||
|
($f2a a1)
|
||
|
($f2b a1)
|
||
|
($f3 a1)
|
||
|
($f4 a1)
|
||
|
($f5a a1)
|
||
|
($f5b a1)
|
||
|
($f6 a1)
|
||
|
($f7 a1))
|
||
|
(let ([s1 (statistics)])
|
||
|
(<= (- (sstats-bytes s1) (sstats-bytes s0)) 1000)))
|
||
|
|
||
|
(or (eq? (current-eval) interpret)
|
||
|
(eq? (compile-profile) 'source)
|
||
|
(let ([s0 (statistics)])
|
||
|
(do ([n 1000 (fx- n 1)])
|
||
|
((fx= n 0))
|
||
|
($f1 a2)
|
||
|
($f2a a2)
|
||
|
($f2b a2)
|
||
|
($f3 a2)
|
||
|
($f4 a2)
|
||
|
($f5a a2)
|
||
|
($f5b a2)
|
||
|
($f6 a2)
|
||
|
($f7 a2))
|
||
|
(let ([s1 (statistics)])
|
||
|
(<= (- (sstats-bytes s1) (sstats-bytes s0)) 1000))))
|
||
|
|
||
|
(let ([s0 (statistics)])
|
||
|
(do ([n 1000 (fx- n 1)])
|
||
|
((fx= n 0))
|
||
|
($f8 a1-also a1)
|
||
|
($f9a a1-also a1)
|
||
|
($f9b a1-also a1)
|
||
|
($f10 a1-also a1)
|
||
|
($f11 a1-also a1))
|
||
|
(let ([s1 (statistics)])
|
||
|
(<= (- (sstats-bytes s1) (sstats-bytes s0)) 1000)))
|
||
|
|
||
|
(or (eq? (current-eval) interpret)
|
||
|
(eq? (compile-profile) 'source)
|
||
|
(let ([s0 (statistics)])
|
||
|
(do ([n 1000 (fx- n 1)])
|
||
|
((fx= n 0))
|
||
|
($f8 a1 a2)
|
||
|
($f9a a1 a2)
|
||
|
($f9b a1 a2)
|
||
|
($f10 a1 a2)
|
||
|
($f11 a1 a2))
|
||
|
(let ([s1 (statistics)])
|
||
|
(<= (- (sstats-bytes s1) (sstats-bytes s0)) 1000))))
|
||
|
|
||
|
(or (eq? (current-eval) interpret)
|
||
|
(eq? (compile-profile) 'source)
|
||
|
(let ([s0 (statistics)])
|
||
|
(do ([n 1000 (fx- n 1)])
|
||
|
((fx= n 0))
|
||
|
($f8 a2-also a2)
|
||
|
($f9a a2-also a2)
|
||
|
($f9b a2-also a2)
|
||
|
($f10 a2-also a2)
|
||
|
($f11 a2-also a2))
|
||
|
(let ([s1 (statistics)])
|
||
|
(<= (- (sstats-bytes s1) (sstats-bytes s0)) 1000))))
|
||
|
|
||
|
(begin
|
||
|
(define x (make-ftype-pointer A (foreign-alloc (ftype-sizeof A))))
|
||
|
#t)
|
||
|
(begin
|
||
|
(define $not-much-alloc?
|
||
|
(lambda (require-cp0? p)
|
||
|
(or (eq? (current-eval) interpret)
|
||
|
(#%$suppress-primitive-inlining)
|
||
|
(eq? (compile-profile) 'source)
|
||
|
(not (= (optimize-level) 3))
|
||
|
(and require-cp0? (not (enable-cp0)))
|
||
|
(let ([s0 (statistics)])
|
||
|
(and (let f ([n 1000])
|
||
|
(or (fx= n 0)
|
||
|
(begin
|
||
|
(let ([x (p n)]) (unless (eq? x #t) (errorf #f "p returned non-#t value ~s for n=~s" x n)))
|
||
|
(f (fx- n 1)))))
|
||
|
(let ([s1 (statistics)])
|
||
|
(<= (- (sstats-bytes s1) (sstats-bytes s0)) 1000)))))))
|
||
|
#t)
|
||
|
|
||
|
; might should also check ftype-&ref, ftype-locked-decr!, ftype-init-lock,
|
||
|
; ftype-lock!, ftype-spin-lock!, and ftype-unlock!, plus more flavors of
|
||
|
; ftype-ref (including bit-field references) and all the others.
|
||
|
($not-much-alloc? #f
|
||
|
(lambda (n)
|
||
|
(ftype-set! A (x) x (fx+ n 10))
|
||
|
(and (fx= (ftype-ref B (x) (make-ftype-pointer B (ftype-pointer-address x))) (fx+ n 10))
|
||
|
(begin
|
||
|
(ftype-set! B (x) (make-ftype-pointer B (ftype-pointer-address x)) (fx+ n 19))
|
||
|
(and (fx= (ftype-ref A (x) x) (fx+ n 19))
|
||
|
(begin
|
||
|
(ftype-locked-incr! B (x) (make-ftype-pointer B (ftype-pointer-address x)))
|
||
|
(fx= (ftype-ref A (x) x) (fx+ n 20))))))))
|
||
|
|
||
|
(begin
|
||
|
(define $ftp1 (make-ftype-pointer A 0))
|
||
|
(define $ftp2 (make-ftype-pointer A (+ (most-positive-fixnum) 1)))
|
||
|
; this should cost the same at o=3 whether address is a fixnum or bignum
|
||
|
(define $mkftp (lambda (x) (make-ftype-pointer B (ftype-pointer-address x))))
|
||
|
#t)
|
||
|
|
||
|
(or (eq? (current-eval) interpret)
|
||
|
(#%$suppress-primitive-inlining)
|
||
|
(eq? (compile-profile) 'source)
|
||
|
(not (= (optimize-level) 3))
|
||
|
(<=
|
||
|
-100
|
||
|
(- (let ([s0 (statistics)])
|
||
|
(ftype-pointer?
|
||
|
(do ([n 100 (fx- n 1)] [x $ftp1 ($mkftp x)])
|
||
|
((fx= n 0) x)))
|
||
|
(let ([s1 (statistics)])
|
||
|
(- (sstats-bytes s1) (sstats-bytes s0))))
|
||
|
(let ([s0 (statistics)])
|
||
|
(ftype-pointer?
|
||
|
(do ([n 100 (fx- n 1)] [x $ftp2 ($mkftp x)])
|
||
|
((fx= n 0) x)))
|
||
|
(let ([s1 (statistics)])
|
||
|
(- (sstats-bytes s1) (sstats-bytes s0)))))
|
||
|
100))
|
||
|
|
||
|
(begin
|
||
|
(fptr-free x)
|
||
|
#t)
|
||
|
|
||
|
($not-much-alloc? #t
|
||
|
(let ()
|
||
|
(define-ftype A (struct [x (array 10 int)] [y (bits [y1 unsigned 3] [y2 unsigned 12] [y3 signed 17])]))
|
||
|
(define-ftype B (* A))
|
||
|
(define a (make-ftype-pointer A (foreign-alloc (ftype-sizeof A))))
|
||
|
(define b (make-ftype-pointer B (foreign-alloc (ftype-sizeof B))))
|
||
|
(lambda (n)
|
||
|
(and
|
||
|
(eqv? (ftype-set! B () b a) (void))
|
||
|
(eqv? (ftype-set! A (x 3) a 17) (void))
|
||
|
(eqv? (ftype-set! A (y y1) a 5) (void))
|
||
|
(eqv? (ftype-set! A (y y2) a 2795) (void))
|
||
|
(eqv? (ftype-set! A (y y3) a -9493) (void))
|
||
|
(eqv? (ftype-ref A (x 3) (ftype-ref B () b)) 17)
|
||
|
(eqv? (ftype-set! A (x 3) (ftype-ref B () b) 37) (void))
|
||
|
(eqv? (ftype-ref A (x 3) (ftype-ref B () b)) 37)
|
||
|
(eqv? (ftype-ref A (y y1) (ftype-ref B () b)) 5)
|
||
|
(eqv? (ftype-ref A (y y2) (ftype-ref B () b)) 2795)
|
||
|
(eqv? (ftype-ref A (y y3) (ftype-ref B () b)) -9493)
|
||
|
(eqv? (ftype-set! A (y y1) (ftype-ref B () b) 6) (void))
|
||
|
(eqv? (ftype-set! A (y y2) (ftype-ref B () b) 1037) (void))
|
||
|
(eqv? (ftype-set! A (y y3) (ftype-ref B () b) 9493) (void))
|
||
|
(eqv? (ftype-ref A (y y1) (ftype-ref B () b)) 6)
|
||
|
(eqv? (ftype-ref A (y y2) (ftype-ref B () b)) 1037)
|
||
|
(eqv? (ftype-ref A (y y3) (ftype-ref B () b)) 9493)))))
|
||
|
|
||
|
($not-much-alloc? #t
|
||
|
(let ()
|
||
|
(define-ftype A (struct [x (array 10 int)] [y (bits [y1 unsigned 3] [y2 unsigned 12] [y3 signed 17])]))
|
||
|
(define-ftype B (* A))
|
||
|
(define-ftype BB (struct [b1 char] [b2 B]))
|
||
|
(define-ftype BBB (* BB))
|
||
|
(define a (make-ftype-pointer A (foreign-alloc (ftype-sizeof A))))
|
||
|
(define bb (make-ftype-pointer BB (foreign-alloc (ftype-sizeof BB))))
|
||
|
(define bbb (make-ftype-pointer BBB (foreign-alloc (ftype-sizeof BBB))))
|
||
|
(lambda (n)
|
||
|
(and
|
||
|
(eqv? (ftype-set! BB (b2) bb a) (void))
|
||
|
(eqv? (ftype-set! BBB () bbb bb) (void))
|
||
|
(eqv? (ftype-set! A (x 3) a 17) (void))
|
||
|
(eqv? (ftype-set! A (y y1) a 5) (void))
|
||
|
(eqv? (ftype-set! A (y y2) a 2795) (void))
|
||
|
(eqv? (ftype-set! A (y y3) a -9493) (void))
|
||
|
(eqv? (ftype-ref A (x 3) (ftype-ref B () (ftype-&ref BB (b2) (ftype-ref BBB () bbb)))) 17)
|
||
|
(eqv? (ftype-set! A (x 3) (ftype-ref B () (ftype-&ref BB (b2) (ftype-ref BBB () bbb))) 37) (void))
|
||
|
(eqv? (ftype-ref A (x 3) (ftype-ref B () (ftype-&ref BB (b2) (ftype-ref BBB () bbb)))) 37)
|
||
|
(eqv? (ftype-ref A (y y1) (ftype-ref B () (ftype-&ref BB (b2) (ftype-ref BBB () bbb)))) 5)
|
||
|
(eqv? (ftype-ref A (y y2) (ftype-ref B () (ftype-&ref BB (b2) (ftype-ref BBB () bbb)))) 2795)
|
||
|
(eqv? (ftype-ref A (y y3) (ftype-ref B () (ftype-&ref BB (b2) (ftype-ref BBB () bbb)))) -9493)
|
||
|
(eqv? (ftype-set! A (y y1) (ftype-ref B () (ftype-&ref BB (b2) (ftype-ref BBB () bbb))) 6) (void))
|
||
|
(eqv? (ftype-set! A (y y2) (ftype-ref B () (ftype-&ref BB (b2) (ftype-ref BBB () bbb))) 1037) (void))
|
||
|
(eqv? (ftype-set! A (y y3) (ftype-ref B () (ftype-&ref BB (b2) (ftype-ref BBB () bbb))) 9493) (void))
|
||
|
(eqv? (ftype-ref A (y y1) (ftype-ref B () (ftype-&ref BB (b2) (ftype-ref BBB () bbb)))) 6)
|
||
|
(eqv? (ftype-ref A (y y2) (ftype-ref B () (ftype-&ref BB (b2) (ftype-ref BBB () bbb)))) 1037)
|
||
|
(eqv? (ftype-ref A (y y3) (ftype-ref B () (ftype-&ref BB (b2) (ftype-ref BBB () bbb)))) 9493)))))
|
||
|
|
||
|
($not-much-alloc? #t
|
||
|
(let ()
|
||
|
(define-ftype A (struct [x (array 10 int)] [y (bits [y1 unsigned 3] [y2 unsigned 12] [y3 signed 17])]))
|
||
|
(define-ftype C (struct [c1 int] [c2 A]))
|
||
|
(define a (make-ftype-pointer A (foreign-alloc (ftype-sizeof A))))
|
||
|
(define c (make-ftype-pointer C (foreign-alloc (ftype-sizeof C))))
|
||
|
(lambda (n)
|
||
|
(and
|
||
|
(ftype-set! C (c2 x 7) c 53)
|
||
|
(eqv? (ftype-ref A (x 7) (ftype-&ref C (c2) c)) 53)
|
||
|
(eqv? (ftype-set! A (x 7) (ftype-&ref C (c2) c) 71) (void))
|
||
|
(eqv? (ftype-ref A (x 7) (ftype-&ref C (c2) c)) 71)))))
|
||
|
|
||
|
($not-much-alloc? #t
|
||
|
(let ()
|
||
|
(define-ftype A (struct [x (array 10 int)] [y (bits [y1 unsigned 3] [y2 unsigned 12] [y3 signed 17])]))
|
||
|
(define a (make-ftype-pointer A (foreign-alloc (ftype-sizeof A))))
|
||
|
(define a-addr (ftype-pointer-address a))
|
||
|
(lambda (n)
|
||
|
(and
|
||
|
(eqv? (ftype-set! A (x 3) (make-ftype-pointer A (ftype-pointer-address a)) n) (void))
|
||
|
(eqv? (ftype-ref A (x 3) (make-ftype-pointer A (ftype-pointer-address a))) n)
|
||
|
(eqv? (ftype-set! A (x 3) (make-ftype-pointer A (ftype-pointer-address a)) (- n 3)) (void))
|
||
|
(eqv? (ftype-ref A (x 3) (make-ftype-pointer A a-addr)) (- n 3))))))
|
||
|
|
||
|
($not-much-alloc? #t
|
||
|
(let ()
|
||
|
(define-ftype A iptr)
|
||
|
(define-ftype B (* A))
|
||
|
(define a (make-ftype-pointer A (foreign-alloc (ftype-sizeof A))))
|
||
|
(define b (make-ftype-pointer B (foreign-alloc (ftype-sizeof B))))
|
||
|
(ftype-set! A () a 0)
|
||
|
(ftype-set! B () b a)
|
||
|
(lambda (n)
|
||
|
(and
|
||
|
(not (ftype-locked-incr! A () (ftype-ref B () b)))
|
||
|
(ftype-locked-decr! A () (ftype-ref B () b))))))
|
||
|
|
||
|
($not-much-alloc? #t
|
||
|
(let ()
|
||
|
(define-ftype A iptr)
|
||
|
(define-ftype B (* A))
|
||
|
(define-ftype BB (* B))
|
||
|
(define a (make-ftype-pointer A (foreign-alloc (ftype-sizeof A))))
|
||
|
(define b (make-ftype-pointer B (foreign-alloc (ftype-sizeof B))))
|
||
|
(define bb (make-ftype-pointer BB (foreign-alloc (ftype-sizeof BB))))
|
||
|
(ftype-set! A () a 0)
|
||
|
(ftype-set! B () b a)
|
||
|
(ftype-set! BB () bb b)
|
||
|
(lambda (n)
|
||
|
(and
|
||
|
(eq? (ftype-spin-lock! A () (ftype-ref B () (ftype-ref BB () bb))) (void))
|
||
|
(eq? (ftype-unlock! A () (ftype-ref B () (ftype-ref BB () bb))) (void))))))
|
||
|
)
|
||
|
|
||
|
(mat ftype-odd
|
||
|
(begin
|
||
|
(define-ftype O
|
||
|
(struct
|
||
|
[i (struct
|
||
|
[i24 integer-24]
|
||
|
[i40 integer-40]
|
||
|
[i48 integer-48]
|
||
|
[i56 integer-56])]
|
||
|
[u (struct
|
||
|
[u56 unsigned-56]
|
||
|
[u48 unsigned-48]
|
||
|
[u40 unsigned-40]
|
||
|
[u24 unsigned-24])]))
|
||
|
#t)
|
||
|
|
||
|
(equal?
|
||
|
(let ([x (make-ftype-pointer O 0)])
|
||
|
(list
|
||
|
(ftype-sizeof O)
|
||
|
(ftype-pointer-address (ftype-&ref O (i i24) x))
|
||
|
(ftype-pointer-address (ftype-&ref O (i i40) x))
|
||
|
(ftype-pointer-address (ftype-&ref O (i i48) x))
|
||
|
(ftype-pointer-address (ftype-&ref O (i i56) x))
|
||
|
(ftype-pointer-address (ftype-&ref O (u u56) x))
|
||
|
(ftype-pointer-address (ftype-&ref O (u u48) x))
|
||
|
(ftype-pointer-address (ftype-&ref O (u u40) x))
|
||
|
(ftype-pointer-address (ftype-&ref O (u u24) x))))
|
||
|
'(44 0 3 8 14 22 30 36 41))
|
||
|
|
||
|
(begin
|
||
|
(define o (make-ftype-pointer O (foreign-alloc (ftype-sizeof O))))
|
||
|
#t)
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! O (i i24) o 0)
|
||
|
(ftype-set! O (i i40) o 0)
|
||
|
(ftype-set! O (i i48) o 0)
|
||
|
(ftype-set! O (i i56) o 0)
|
||
|
(ftype-set! O (u u24) o 0)
|
||
|
(ftype-set! O (u u40) o 0)
|
||
|
(ftype-set! O (u u48) o 0)
|
||
|
(ftype-set! O (u u56) o 0)
|
||
|
(equal?
|
||
|
(list
|
||
|
(ftype-ref O (i i24) o)
|
||
|
(ftype-ref O (i i40) o)
|
||
|
(ftype-ref O (i i48) o)
|
||
|
(ftype-ref O (i i56) o)
|
||
|
(ftype-ref O (u u24) o)
|
||
|
(ftype-ref O (u u40) o)
|
||
|
(ftype-ref O (u u48) o)
|
||
|
(ftype-ref O (u u56) o))
|
||
|
'(0 0 0 0 0 0 0 0)))
|
||
|
|
||
|
(let ([n24 (- (ash 1 24) 1)]
|
||
|
[n40 (- (ash 1 40) 1)]
|
||
|
[n48 (- (ash 1 48) 1)]
|
||
|
[n56 (- (ash 1 56) 1)])
|
||
|
(ftype-set! O (i i24) o -1)
|
||
|
(ftype-set! O (i i40) o -1)
|
||
|
(ftype-set! O (i i48) o -1)
|
||
|
(ftype-set! O (i i56) o -1)
|
||
|
(ftype-set! O (u u24) o -1)
|
||
|
(ftype-set! O (u u40) o -1)
|
||
|
(ftype-set! O (u u48) o -1)
|
||
|
(ftype-set! O (u u56) o -1)
|
||
|
(equal?
|
||
|
(list
|
||
|
(ftype-ref O (i i24) o)
|
||
|
(ftype-ref O (i i40) o)
|
||
|
(ftype-ref O (i i48) o)
|
||
|
(ftype-ref O (i i56) o)
|
||
|
(ftype-ref O (u u24) o)
|
||
|
(ftype-ref O (u u40) o)
|
||
|
(ftype-ref O (u u48) o)
|
||
|
(ftype-ref O (u u56) o))
|
||
|
(list -1 -1 -1 -1 n24 n40 n48 n56)))
|
||
|
|
||
|
(let ([n24 (- (ash 1 24) 1)]
|
||
|
[n40 (- (ash 1 40) 1)]
|
||
|
[n48 (- (ash 1 48) 1)]
|
||
|
[n56 (- (ash 1 56) 1)])
|
||
|
(ftype-set! O (i i24) o n24)
|
||
|
(ftype-set! O (i i40) o n40)
|
||
|
(ftype-set! O (i i48) o n48)
|
||
|
(ftype-set! O (i i56) o n56)
|
||
|
(ftype-set! O (u u24) o n24)
|
||
|
(ftype-set! O (u u40) o n40)
|
||
|
(ftype-set! O (u u48) o n48)
|
||
|
(ftype-set! O (u u56) o n56)
|
||
|
(equal?
|
||
|
(list
|
||
|
(ftype-ref O (i i24) o)
|
||
|
(ftype-ref O (i i40) o)
|
||
|
(ftype-ref O (i i48) o)
|
||
|
(ftype-ref O (i i56) o)
|
||
|
(ftype-ref O (u u24) o)
|
||
|
(ftype-ref O (u u40) o)
|
||
|
(ftype-ref O (u u48) o)
|
||
|
(ftype-ref O (u u56) o))
|
||
|
(list -1 -1 -1 -1 n24 n40 n48 n56)))
|
||
|
|
||
|
(let ([n24 (- (ash 1 23))]
|
||
|
[n40 (- (ash 1 39))]
|
||
|
[n48 (- (ash 1 47))]
|
||
|
[n56 (- (ash 1 55))])
|
||
|
(ftype-set! O (i i24) o n24)
|
||
|
(ftype-set! O (i i40) o n40)
|
||
|
(ftype-set! O (i i48) o n48)
|
||
|
(ftype-set! O (i i56) o n56)
|
||
|
(ftype-set! O (u u24) o n24)
|
||
|
(ftype-set! O (u u40) o n40)
|
||
|
(ftype-set! O (u u48) o n48)
|
||
|
(ftype-set! O (u u56) o n56)
|
||
|
(equal?
|
||
|
(list
|
||
|
(ftype-ref O (i i24) o)
|
||
|
(ftype-ref O (i i40) o)
|
||
|
(ftype-ref O (i i48) o)
|
||
|
(ftype-ref O (i i56) o)
|
||
|
(ftype-ref O (u u24) o)
|
||
|
(ftype-ref O (u u40) o)
|
||
|
(ftype-ref O (u u48) o)
|
||
|
(ftype-ref O (u u56) o))
|
||
|
(list n24 n40 n48 n56 (- n24) (- n40) (- n48) (- n56))))
|
||
|
|
||
|
(equal?
|
||
|
(ftype-pointer->sexpr o)
|
||
|
'(struct
|
||
|
[i (struct
|
||
|
[i24 #x-800000]
|
||
|
[i40 #x-8000000000]
|
||
|
[i48 #x-800000000000]
|
||
|
[i56 #x-80000000000000])]
|
||
|
[u (struct
|
||
|
[u56 #x80000000000000]
|
||
|
[u48 #x800000000000]
|
||
|
[u40 #x8000000000]
|
||
|
[u24 #x800000])]))
|
||
|
|
||
|
(do ([i 1000 (fx- i 1)])
|
||
|
((fx= i 0) #t)
|
||
|
(let ([i24 (- (random (ash 1 24)) (ash 1 23))]
|
||
|
[i40 (- (random (ash 1 40)) (ash 1 39))]
|
||
|
[i48 (- (random (ash 1 48)) (ash 1 47))]
|
||
|
[i56 (- (random (ash 1 56)) (ash 1 55))]
|
||
|
[u24 (- (random (ash #b11 23)) (ash 1 23))]
|
||
|
[u40 (- (random (ash #b11 39)) (ash 1 39))]
|
||
|
[u48 (- (random (ash #b11 47)) (ash 1 47))]
|
||
|
[u56 (- (random (ash #b11 55)) (ash 1 55))])
|
||
|
(ftype-set! O (i i24) o i24)
|
||
|
(ftype-set! O (i i40) o i40)
|
||
|
(ftype-set! O (i i48) o i48)
|
||
|
(ftype-set! O (i i56) o i56)
|
||
|
(ftype-set! O (u u24) o u24)
|
||
|
(ftype-set! O (u u40) o u40)
|
||
|
(ftype-set! O (u u48) o u48)
|
||
|
(ftype-set! O (u u56) o u56)
|
||
|
(and
|
||
|
(= (ftype-ref O (i i24) o) i24)
|
||
|
(= (ftype-ref O (i i40) o) i40)
|
||
|
(= (ftype-ref O (i i48) o) i48)
|
||
|
(= (ftype-ref O (i i56) o) i56)
|
||
|
(= (ftype-ref O (u u24) o) u24)
|
||
|
(= (ftype-ref O (u u40) o) u40)
|
||
|
(= (ftype-ref O (u u48) o) u48)
|
||
|
(= (ftype-ref O (u u56) o) u56))))
|
||
|
|
||
|
(do ([i 1000 (fx- i 1)])
|
||
|
((fx= i 0) #t)
|
||
|
(let ([i24 (- (random (ash 1 24)) (ash 1 23))]
|
||
|
[i40 (- (random (ash 1 40)) (ash 1 39))]
|
||
|
[i48 (- (random (ash 1 48)) (ash 1 47))]
|
||
|
[i56 (- (random (ash 1 56)) (ash 1 55))]
|
||
|
[u24 (- (random (ash #b11 23)) (ash 1 23))]
|
||
|
[u40 (- (random (ash #b11 39)) (ash 1 39))]
|
||
|
[u48 (- (random (ash #b11 47)) (ash 1 47))]
|
||
|
[u56 (- (random (ash #b11 55)) (ash 1 55))])
|
||
|
(ftype-set! O (u u56) o u56)
|
||
|
(ftype-set! O (u u48) o u48)
|
||
|
(ftype-set! O (u u40) o u40)
|
||
|
(ftype-set! O (u u24) o u24)
|
||
|
(ftype-set! O (i i56) o i56)
|
||
|
(ftype-set! O (i i48) o i48)
|
||
|
(ftype-set! O (i i40) o i40)
|
||
|
(ftype-set! O (i i24) o i24)
|
||
|
(and
|
||
|
(= (ftype-ref O (i i24) o) i24)
|
||
|
(= (ftype-ref O (i i40) o) i40)
|
||
|
(= (ftype-ref O (i i48) o) i48)
|
||
|
(= (ftype-ref O (i i56) o) i56)
|
||
|
(= (ftype-ref O (u u24) o) u24)
|
||
|
(= (ftype-ref O (u u40) o) u40)
|
||
|
(= (ftype-ref O (u u48) o) u48)
|
||
|
(= (ftype-ref O (u u56) o) u56))))
|
||
|
|
||
|
(begin
|
||
|
(fptr-free o)
|
||
|
#t)
|
||
|
|
||
|
; ----------------
|
||
|
|
||
|
(begin
|
||
|
(define-ftype O
|
||
|
(packed
|
||
|
; NB: tests with this version will cause unaligned access errors on
|
||
|
; NB: machines that don't support unalinged accesses
|
||
|
(struct
|
||
|
[i (struct
|
||
|
[i24 integer-24]
|
||
|
[i40 integer-40]
|
||
|
[i48 integer-48]
|
||
|
[i56 integer-56])]
|
||
|
[u (struct
|
||
|
[u56 unsigned-56]
|
||
|
[u48 unsigned-48]
|
||
|
[u40 unsigned-40]
|
||
|
[u24 unsigned-24])])))
|
||
|
#t)
|
||
|
|
||
|
(equal?
|
||
|
(let ([x (make-ftype-pointer O 0)])
|
||
|
(list
|
||
|
(ftype-sizeof O)
|
||
|
(ftype-pointer-address (ftype-&ref O (i i24) x))
|
||
|
(ftype-pointer-address (ftype-&ref O (i i40) x))
|
||
|
(ftype-pointer-address (ftype-&ref O (i i48) x))
|
||
|
(ftype-pointer-address (ftype-&ref O (i i56) x))
|
||
|
(ftype-pointer-address (ftype-&ref O (u u56) x))
|
||
|
(ftype-pointer-address (ftype-&ref O (u u48) x))
|
||
|
(ftype-pointer-address (ftype-&ref O (u u40) x))
|
||
|
(ftype-pointer-address (ftype-&ref O (u u24) x))))
|
||
|
'(42 0 3 8 14 21 28 34 39))
|
||
|
|
||
|
(begin
|
||
|
(define o (make-ftype-pointer O (foreign-alloc (ftype-sizeof O))))
|
||
|
#t)
|
||
|
|
||
|
(do ([i 1000 (fx- i 1)])
|
||
|
((fx= i 0) #t)
|
||
|
(let ([i24 (- (random (ash 1 24)) (ash 1 23))]
|
||
|
[i40 (- (random (ash 1 40)) (ash 1 39))]
|
||
|
[i48 (- (random (ash 1 48)) (ash 1 47))]
|
||
|
[i56 (- (random (ash 1 56)) (ash 1 55))]
|
||
|
[u24 (- (random (ash #b11 23)) (ash 1 23))]
|
||
|
[u40 (- (random (ash #b11 39)) (ash 1 39))]
|
||
|
[u48 (- (random (ash #b11 47)) (ash 1 47))]
|
||
|
[u56 (- (random (ash #b11 55)) (ash 1 55))])
|
||
|
(ftype-set! O (i i24) o i24)
|
||
|
(ftype-set! O (i i40) o i40)
|
||
|
(ftype-set! O (i i48) o i48)
|
||
|
(ftype-set! O (i i56) o i56)
|
||
|
(ftype-set! O (u u24) o u24)
|
||
|
(ftype-set! O (u u40) o u40)
|
||
|
(ftype-set! O (u u48) o u48)
|
||
|
(ftype-set! O (u u56) o u56)
|
||
|
(and
|
||
|
(= (ftype-ref O (i i24) o) i24)
|
||
|
(= (ftype-ref O (i i40) o) i40)
|
||
|
(= (ftype-ref O (i i48) o) i48)
|
||
|
(= (ftype-ref O (i i56) o) i56)
|
||
|
(= (ftype-ref O (u u24) o) u24)
|
||
|
(= (ftype-ref O (u u40) o) u40)
|
||
|
(= (ftype-ref O (u u48) o) u48)
|
||
|
(= (ftype-ref O (u u56) o) u56))))
|
||
|
|
||
|
(do ([i 1000 (fx- i 1)])
|
||
|
((fx= i 0) #t)
|
||
|
(let ([i24 (- (random (ash 1 24)) (ash 1 23))]
|
||
|
[i40 (- (random (ash 1 40)) (ash 1 39))]
|
||
|
[i48 (- (random (ash 1 48)) (ash 1 47))]
|
||
|
[i56 (- (random (ash 1 56)) (ash 1 55))]
|
||
|
[u24 (- (random (ash #b11 23)) (ash 1 23))]
|
||
|
[u40 (- (random (ash #b11 39)) (ash 1 39))]
|
||
|
[u48 (- (random (ash #b11 47)) (ash 1 47))]
|
||
|
[u56 (- (random (ash #b11 55)) (ash 1 55))])
|
||
|
(ftype-set! O (u u56) o u56)
|
||
|
(ftype-set! O (u u48) o u48)
|
||
|
(ftype-set! O (u u40) o u40)
|
||
|
(ftype-set! O (u u24) o u24)
|
||
|
(ftype-set! O (i i56) o i56)
|
||
|
(ftype-set! O (i i48) o i48)
|
||
|
(ftype-set! O (i i40) o i40)
|
||
|
(ftype-set! O (i i24) o i24)
|
||
|
(and
|
||
|
(= (ftype-ref O (i i24) o) i24)
|
||
|
(= (ftype-ref O (i i40) o) i40)
|
||
|
(= (ftype-ref O (i i48) o) i48)
|
||
|
(= (ftype-ref O (i i56) o) i56)
|
||
|
(= (ftype-ref O (u u24) o) u24)
|
||
|
(= (ftype-ref O (u u40) o) u40)
|
||
|
(= (ftype-ref O (u u48) o) u48)
|
||
|
(= (ftype-ref O (u u56) o) u56))))
|
||
|
|
||
|
(begin
|
||
|
(fptr-free o)
|
||
|
#t)
|
||
|
)
|
||
|
|
||
|
(mat ftype-indexing
|
||
|
(begin
|
||
|
(define-ftype pdouble (* double))
|
||
|
(define ftype-indexing-test
|
||
|
(lambda (init-array!)
|
||
|
(define ls '(2.17 3.14 1.85 10.75 18.32))
|
||
|
(equal?
|
||
|
(let ([doubles (make-ftype-pointer double (foreign-alloc (* (ftype-sizeof double) 5)))]
|
||
|
[pdoubles (make-ftype-pointer pdouble (foreign-alloc (ftype-sizeof pdouble)))])
|
||
|
(ftype-set! pdouble () pdoubles doubles)
|
||
|
(init-array! doubles ls)
|
||
|
(let ([v (list
|
||
|
(ftype-ref double () doubles)
|
||
|
(ftype-ref double () doubles *)
|
||
|
(ftype-ref double () doubles 0)
|
||
|
(ftype-ref double () doubles 1)
|
||
|
(ftype-ref double () doubles 2)
|
||
|
(ftype-ref double () doubles 3)
|
||
|
(ftype-ref double () doubles 4)
|
||
|
(ftype-ref pdouble (*) pdoubles)
|
||
|
(ftype-ref pdouble (0) pdoubles)
|
||
|
(ftype-ref pdouble (1) pdoubles)
|
||
|
(ftype-ref pdouble (2) pdoubles)
|
||
|
(ftype-ref pdouble (3) pdoubles)
|
||
|
(ftype-ref pdouble (4) pdoubles))])
|
||
|
(foreign-free (ftype-pointer-address doubles))
|
||
|
(foreign-free (ftype-pointer-address pdoubles))
|
||
|
v))
|
||
|
`(,(car ls) ,(car ls) ,@ls ,(car ls) ,@ls))))
|
||
|
#t)
|
||
|
|
||
|
(ftype-indexing-test
|
||
|
(lambda (d ls)
|
||
|
(unless (null? ls)
|
||
|
(let f ([dbl (car ls)] [ls (cdr ls)] [d d])
|
||
|
(ftype-set! double () d dbl)
|
||
|
(unless (null? ls)
|
||
|
(f (car ls) (cdr ls)
|
||
|
(make-ftype-pointer double
|
||
|
(+ (ftype-sizeof double)
|
||
|
(ftype-pointer-address d)))))))))
|
||
|
(ftype-indexing-test
|
||
|
(lambda (d ls)
|
||
|
(unless (null? ls)
|
||
|
(let f ([dbl (car ls)] [ls (cdr ls)] [idx 0])
|
||
|
(ftype-set! double () d idx dbl)
|
||
|
(unless (null? ls)
|
||
|
(f (car ls) (cdr ls) (fx+ idx 1)))))))
|
||
|
(ftype-indexing-test
|
||
|
(lambda (d ls)
|
||
|
(unless (null? ls)
|
||
|
(let f ([dbl (car ls)] [ls (cdr ls)] [idx 0])
|
||
|
(ftype-set! double () (ftype-&ref double () d idx) * dbl)
|
||
|
(unless (null? ls)
|
||
|
(f (car ls) (cdr ls) (fx+ idx 1)))))))
|
||
|
(ftype-indexing-test
|
||
|
(lambda (d ls)
|
||
|
(unless (null? ls)
|
||
|
(let ([pdbl (make-ftype-pointer pdouble (foreign-alloc (ftype-sizeof pdouble)))])
|
||
|
(ftype-set! pdouble () pdbl (ftype-&ref double () d *))
|
||
|
(let f ([dbl (car ls)] [ls (cdr ls)] [idx 0])
|
||
|
(ftype-set! pdouble (idx) pdbl * dbl)
|
||
|
(unless (null? ls)
|
||
|
(f (car ls) (cdr ls) (fx+ idx 1))))))))
|
||
|
(ftype-indexing-test
|
||
|
(lambda (d ls)
|
||
|
(unless (null? ls)
|
||
|
(let ([pdbl (make-ftype-pointer pdouble (foreign-alloc (ftype-sizeof pdouble)))])
|
||
|
(ftype-set! pdouble () pdbl (ftype-&ref double () d (length ls)))
|
||
|
(let ([ls (reverse ls)])
|
||
|
(let f ([dbl (car ls)] [ls (cdr ls)] [idx 0])
|
||
|
(ftype-set! pdouble ((- -1 idx)) pdbl * dbl)
|
||
|
(unless (null? ls)
|
||
|
(f (car ls) (cdr ls) (fx+ idx 1)))))))))
|
||
|
|
||
|
(error? ; invalid index
|
||
|
(let ([doubles (make-ftype-pointer double 0)])
|
||
|
(ftype-&ref double () doubles 4.5)))
|
||
|
(error? ; invalid index
|
||
|
(let ([doubles (make-ftype-pointer double 0)])
|
||
|
(ftype-&ref double () doubles (most-positive-fixnum))))
|
||
|
(error? ; invalid index
|
||
|
(let ([doubles (make-ftype-pointer double (foreign-alloc (* (ftype-sizeof double) 5)))]
|
||
|
[pdoubles (make-ftype-pointer pdouble (foreign-alloc (ftype-sizeof pdouble)))])
|
||
|
(ftype-set! pdouble () pdoubles doubles)
|
||
|
(guard (c [#t (foreign-free (ftype-pointer-address doubles))
|
||
|
(foreign-free (ftype-pointer-address pdoubles))
|
||
|
(raise c)])
|
||
|
(pretty-print (ftype-&ref pdouble ('a) pdoubles)))))
|
||
|
(error? ; invalid index
|
||
|
(let ([doubles (make-ftype-pointer double 0)])
|
||
|
(ftype-ref double () doubles 4.5)))
|
||
|
(error? ; invalid index
|
||
|
(let ([doubles (make-ftype-pointer double 0)])
|
||
|
(ftype-ref double () doubles (most-positive-fixnum))))
|
||
|
(error? ; invalid index
|
||
|
(let ([doubles (make-ftype-pointer double (foreign-alloc (* (ftype-sizeof double) 5)))]
|
||
|
[pdoubles (make-ftype-pointer pdouble (foreign-alloc (ftype-sizeof pdouble)))])
|
||
|
(ftype-set! pdouble () pdoubles doubles)
|
||
|
(guard (c [#t (foreign-free (ftype-pointer-address doubles))
|
||
|
(foreign-free (ftype-pointer-address pdoubles))
|
||
|
(raise c)])
|
||
|
(pretty-print (ftype-ref pdouble ('a) pdoubles)))))
|
||
|
(error? ; invalid index
|
||
|
(let ([doubles (make-ftype-pointer double 0)])
|
||
|
(ftype-set! double () doubles 4.5 7.0)))
|
||
|
(error? ; invalid index
|
||
|
(let ([doubles (make-ftype-pointer double 0)])
|
||
|
(ftype-set! double () doubles (most-positive-fixnum) 7.0)))
|
||
|
(error? ; invalid index
|
||
|
(let ([doubles (make-ftype-pointer double (foreign-alloc (* (ftype-sizeof double) 5)))]
|
||
|
[pdoubles (make-ftype-pointer pdouble (foreign-alloc (ftype-sizeof pdouble)))])
|
||
|
(ftype-set! pdouble () pdoubles doubles)
|
||
|
(guard (c [#t (foreign-free (ftype-pointer-address doubles))
|
||
|
(foreign-free (ftype-pointer-address pdoubles))
|
||
|
(raise c)])
|
||
|
(pretty-print (ftype-set! pdouble ('a) pdoubles 7.0)))))
|
||
|
|
||
|
(begin
|
||
|
(define-ftype A (struct [x int] [y double]))
|
||
|
(define-ftype pA (* A))
|
||
|
(define ftype-indexing-test
|
||
|
(lambda (init-array!)
|
||
|
(define int* '(2 3 4 -5 -6))
|
||
|
(define dbl* '(2.0 3.0 4.0 -5.0 -6.0))
|
||
|
(let ([array (make-ftype-pointer A (foreign-alloc (* (ftype-sizeof A) (length int*))))]
|
||
|
[parray (make-ftype-pointer pA (foreign-alloc (ftype-sizeof pA)))])
|
||
|
(ftype-set! pA () parray array)
|
||
|
(init-array! array int* dbl*)
|
||
|
(let ([v (and (eqv? (ftype-ref A (x) array) (car int*))
|
||
|
(eqv? (ftype-ref A (y) array) (car dbl*))
|
||
|
(eqv? (ftype-ref A (x) array *) (car int*))
|
||
|
(eqv? (ftype-ref A (y) array *) (car dbl*))
|
||
|
(andmap
|
||
|
(lambda (int dbl i)
|
||
|
(and
|
||
|
(eqv? (ftype-ref A (x) array i) int)
|
||
|
(eqv? (ftype-ref A (y) array i) dbl)))
|
||
|
int* dbl* (enumerate int*))
|
||
|
(eqv? (ftype-ref pA (* x) parray) (car int*))
|
||
|
(eqv? (ftype-ref pA (* y) parray) (car dbl*))
|
||
|
(andmap
|
||
|
(lambda (int dbl i)
|
||
|
(and
|
||
|
(eqv? (ftype-ref pA (i x) parray) int)
|
||
|
(eqv? (ftype-ref pA (i y) parray) dbl)))
|
||
|
int* dbl* (enumerate int*)))])
|
||
|
(foreign-free (ftype-pointer-address array))
|
||
|
(foreign-free (ftype-pointer-address parray))
|
||
|
v))))
|
||
|
#t)
|
||
|
|
||
|
(ftype-indexing-test
|
||
|
(lambda (array int* dbl*)
|
||
|
(unless (null? int*)
|
||
|
(for-each
|
||
|
(lambda (int dbl i)
|
||
|
(ftype-set! A (x)
|
||
|
(make-ftype-pointer A
|
||
|
(+ (ftype-pointer-address array)
|
||
|
(* (ftype-sizeof A) i)))
|
||
|
int)
|
||
|
(ftype-set! A (y)
|
||
|
(make-ftype-pointer A
|
||
|
(+ (ftype-pointer-address array)
|
||
|
(* (ftype-sizeof A) i)))
|
||
|
dbl))
|
||
|
int* dbl* (enumerate int*)))))
|
||
|
(ftype-indexing-test
|
||
|
(lambda (array int* dbl*)
|
||
|
(unless (null? int*)
|
||
|
(for-each
|
||
|
(lambda (int dbl i)
|
||
|
(ftype-set! A (x) array i int)
|
||
|
(ftype-set! A (y) array i dbl))
|
||
|
int* dbl* (enumerate int*)))))
|
||
|
|
||
|
; test for source info attached to index errors
|
||
|
; ...first with invalid value for optional index subform
|
||
|
(begin
|
||
|
(with-output-to-file "testfile.ss"
|
||
|
(lambda ()
|
||
|
(for-each pretty-print
|
||
|
'((define-ftype A int)
|
||
|
(define (foo x i) (ftype-&ref A () x i))
|
||
|
(foo (make-ftype-pointer A 0) 'q))))
|
||
|
'replace)
|
||
|
#t)
|
||
|
(error? ; invalid index q w/source info
|
||
|
(load "testfile.ss"))
|
||
|
|
||
|
(begin
|
||
|
(with-output-to-file "testfile.ss"
|
||
|
(lambda ()
|
||
|
(for-each pretty-print
|
||
|
'((define-ftype A int)
|
||
|
(define (foo x i) (ftype-ref A () x i))
|
||
|
(foo (make-ftype-pointer A 0) 'q))))
|
||
|
'replace)
|
||
|
#t)
|
||
|
(error? ; invalid index q w/source info
|
||
|
(load "testfile.ss"))
|
||
|
|
||
|
(begin
|
||
|
(with-output-to-file "testfile.ss"
|
||
|
(lambda ()
|
||
|
(for-each pretty-print
|
||
|
'((define-ftype A int)
|
||
|
(define (foo x i) (ftype-set! A () x i 55))
|
||
|
(foo (make-ftype-pointer A 0) 'q))))
|
||
|
'replace)
|
||
|
#t)
|
||
|
(error? ; invalid index q w/source info
|
||
|
(load "testfile.ss"))
|
||
|
|
||
|
(begin
|
||
|
(with-output-to-file "testfile.ss"
|
||
|
(lambda ()
|
||
|
(for-each pretty-print
|
||
|
'((define-ftype A uptr)
|
||
|
(define (foo x i) (ftype-locked-incr! A () x i))
|
||
|
(foo (make-ftype-pointer A 0) 'q))))
|
||
|
'replace)
|
||
|
#t)
|
||
|
(error? ; invalid index q w/source info
|
||
|
(load "testfile.ss"))
|
||
|
|
||
|
; now with invalid array accessor
|
||
|
(begin
|
||
|
(with-output-to-file "testfile.ss"
|
||
|
(lambda ()
|
||
|
(for-each pretty-print
|
||
|
'((define-ftype A (array 17 int))
|
||
|
(define (foo x i) (ftype-&ref A (i) x))
|
||
|
(foo (make-ftype-pointer A 0) 25))))
|
||
|
'replace)
|
||
|
#t)
|
||
|
(error? ; invalid index 25 w/source info
|
||
|
(load "testfile.ss"))
|
||
|
|
||
|
(begin
|
||
|
(with-output-to-file "testfile.ss"
|
||
|
(lambda ()
|
||
|
(for-each pretty-print
|
||
|
'((define-ftype A (array 17 int))
|
||
|
(define (foo x i) (ftype-ref A (i) x))
|
||
|
(foo (make-ftype-pointer A 0) 25))))
|
||
|
'replace)
|
||
|
#t)
|
||
|
(error? ; invalid index 25 w/source info
|
||
|
(load "testfile.ss"))
|
||
|
|
||
|
(begin
|
||
|
(with-output-to-file "testfile.ss"
|
||
|
(lambda ()
|
||
|
(for-each pretty-print
|
||
|
'((define-ftype A (array 17 int))
|
||
|
(define (foo x i) (ftype-set! A (i) x 55))
|
||
|
(foo (make-ftype-pointer A 0) 25))))
|
||
|
'replace)
|
||
|
#t)
|
||
|
(error? ; invalid index 25 w/source info
|
||
|
(load "testfile.ss"))
|
||
|
|
||
|
(begin
|
||
|
(with-output-to-file "testfile.ss"
|
||
|
(lambda ()
|
||
|
(for-each pretty-print
|
||
|
'((define-ftype A (array 17 uptr))
|
||
|
(define (foo x i) (ftype-locked-incr! A (i) x))
|
||
|
(foo (make-ftype-pointer A 0) 25))))
|
||
|
'replace)
|
||
|
#t)
|
||
|
(error? ; invalid index 25 w/source info
|
||
|
(load "testfile.ss"))
|
||
|
|
||
|
(begin
|
||
|
(with-output-to-file "testfile.ss"
|
||
|
(lambda ()
|
||
|
(for-each pretty-print
|
||
|
'((define-ftype A (array 17 int))
|
||
|
(eval '(define (foo x i) (ftype-&ref A (i) x)))
|
||
|
(foo (make-ftype-pointer A 0) 25))))
|
||
|
'replace)
|
||
|
#t)
|
||
|
(error? ; invalid index 25 w/o source info
|
||
|
(load "testfile.ss"))
|
||
|
|
||
|
; test for source info attached to fptr errors
|
||
|
(begin
|
||
|
(with-output-to-file "testfile.ss"
|
||
|
(lambda ()
|
||
|
(for-each pretty-print
|
||
|
'((define-ftype A int)
|
||
|
(define (foo x) (ftype-&ref A () x))
|
||
|
(foo (make-ftype-pointer double 0)))))
|
||
|
'replace)
|
||
|
#t)
|
||
|
(error? ; ftype mismatch w/source info
|
||
|
(load "testfile.ss"))
|
||
|
|
||
|
(begin
|
||
|
(with-output-to-file "testfile.ss"
|
||
|
(lambda ()
|
||
|
(for-each pretty-print
|
||
|
'((define-ftype A int)
|
||
|
(define (foo x) (ftype-ref A () x))
|
||
|
(foo 17))))
|
||
|
'replace)
|
||
|
#t)
|
||
|
(error? ; 17 is not an fptr w/source info
|
||
|
(load "testfile.ss"))
|
||
|
|
||
|
(begin
|
||
|
(with-output-to-file "testfile.ss"
|
||
|
(lambda ()
|
||
|
(for-each pretty-print
|
||
|
'((define-ftype A int)
|
||
|
(define (foo x) (ftype-set! A () x 55))
|
||
|
(foo (make-ftype-pointer double 0)))))
|
||
|
'replace)
|
||
|
#t)
|
||
|
(error? ; ftype mismatch w/source info
|
||
|
(load "testfile.ss"))
|
||
|
|
||
|
(begin
|
||
|
(with-output-to-file "testfile.ss"
|
||
|
(lambda ()
|
||
|
(for-each pretty-print
|
||
|
'((define-ftype A int)
|
||
|
(define (foo x y) (ftype-set! A () x y))
|
||
|
(foo (make-ftype-pointer A 0) (make-ftype-pointer double 0)))))
|
||
|
'replace)
|
||
|
#t)
|
||
|
(error? ; ftype mismatch w/source info
|
||
|
(load "testfile.ss"))
|
||
|
|
||
|
(begin
|
||
|
(with-output-to-file "testfile.ss"
|
||
|
(lambda ()
|
||
|
(for-each pretty-print
|
||
|
'((define-ftype A uptr)
|
||
|
(define (foo x) (ftype-locked-incr! A () x))
|
||
|
(foo 17))))
|
||
|
'replace)
|
||
|
#t)
|
||
|
(error? ; 17 is not an fptr w/source info
|
||
|
(load "testfile.ss"))
|
||
|
|
||
|
(begin
|
||
|
(with-output-to-file "testfile.ss"
|
||
|
(lambda ()
|
||
|
(for-each pretty-print
|
||
|
'((define-ftype A uptr)
|
||
|
(eval '(define (foo x) (ftype-locked-incr! A () x)))
|
||
|
(foo 17))))
|
||
|
'replace)
|
||
|
#t)
|
||
|
(error? ; 17 is not an fptr w/o source info
|
||
|
(load "testfile.ss"))
|
||
|
|
||
|
(begin
|
||
|
(with-output-to-file "testfile.ss"
|
||
|
(lambda ()
|
||
|
(for-each pretty-print
|
||
|
'((define-ftype A (* uptr))
|
||
|
(define (foo x n) (ftype-ref A (n) x))
|
||
|
(define x (make-ftype-pointer A (foreign-alloc (ftype-sizeof A))))
|
||
|
(define y (make-ftype-pointer uptr (foreign-alloc (ftype-sizeof uptr))))
|
||
|
(ftype-set! A () x y)
|
||
|
(guard (c [else
|
||
|
(foreign-free (ftype-pointer-address x))
|
||
|
(foreign-free (ftype-pointer-address y))
|
||
|
(raise c)])
|
||
|
(foo x 'a)))))
|
||
|
'replace)
|
||
|
#t)
|
||
|
(error? ; invalid index a for A
|
||
|
(load "testfile.ss"))
|
||
|
)
|
||
|
|
||
|
(mat ftype-inheritance
|
||
|
(begin
|
||
|
(define-ftype A (struct [a double] [b int]))
|
||
|
(define-ftype Bl (endian little (struct [a double] [b int])))
|
||
|
(define-ftype Bb (endian big (struct [a double] [b int])))
|
||
|
(define-ftype C (union [a int] [b unsigned]))
|
||
|
(define-ftype D double)
|
||
|
(define-ftype Dl (endian little double))
|
||
|
(define-ftype Db (endian big double))
|
||
|
(define-ftype E (packed (struct [a double] [b int])))
|
||
|
(define-ftype G (packed (array 5 double)))
|
||
|
(define-ftype Gu (array 5 double))
|
||
|
(define-ftype H (struct [a (endian big G)] [b int]))
|
||
|
(define-ftype I (struct [a Gu] [b int]))
|
||
|
(define a (make-ftype-pointer A (foreign-alloc (ftype-sizeof A))))
|
||
|
(define bl (make-ftype-pointer Bl (foreign-alloc (ftype-sizeof Bl))))
|
||
|
(define bb (make-ftype-pointer Bb (foreign-alloc (ftype-sizeof Bb))))
|
||
|
(define c (make-ftype-pointer C (foreign-alloc (ftype-sizeof C))))
|
||
|
(define d (make-ftype-pointer D (foreign-alloc (ftype-sizeof D))))
|
||
|
(define e (make-ftype-pointer E (foreign-alloc (ftype-sizeof E))))
|
||
|
(define f (make-ftype-pointer double (foreign-alloc (ftype-sizeof double))))
|
||
|
(define g (make-ftype-pointer G (foreign-alloc (ftype-sizeof G))))
|
||
|
(define h (make-ftype-pointer H (foreign-alloc (ftype-sizeof H))))
|
||
|
(define i (make-ftype-pointer I (foreign-alloc (ftype-sizeof I))))
|
||
|
(ftype-set! A (a) a 3.14)
|
||
|
(ftype-set! A (b) a 75)
|
||
|
(ftype-set! Bl (a) bl -3.14)
|
||
|
(ftype-set! Bl (b) bl -75)
|
||
|
(ftype-set! Bb (a) bb -3.14)
|
||
|
(ftype-set! Bb (b) bb -75)
|
||
|
(ftype-set! C (a) c -750)
|
||
|
(ftype-set! D () d 3.0)
|
||
|
(ftype-set! E (a) e -3.1415)
|
||
|
(ftype-set! E (b) e -7755)
|
||
|
(ftype-set! G (0) g 88.5)
|
||
|
(ftype-set! H (a 0) h 100.5)
|
||
|
(ftype-set! I (a 0) i 100.5)
|
||
|
(ftype-set! double () f -3.0)
|
||
|
#t)
|
||
|
|
||
|
(error? ; ftype mismatch
|
||
|
(ftype-ref A (a) bl))
|
||
|
(error? ; ftype mismatch
|
||
|
(ftype-ref A (a) bb))
|
||
|
(error? ; ftype mismatch
|
||
|
(ftype-ref A (a) c))
|
||
|
(error? ; ftype mismatch
|
||
|
(ftype-ref A (a) d))
|
||
|
(error? ; ftype mismatch
|
||
|
(ftype-ref A (a) e))
|
||
|
(error? ; ftype mismatch
|
||
|
(ftype-ref A (a) f))
|
||
|
|
||
|
(error? ; ftype mismatch
|
||
|
(ftype-ref Bl (b) a))
|
||
|
(error? ; ftype mismatch
|
||
|
(ftype-ref Bl (b) c))
|
||
|
(error? ; ftype mismatch
|
||
|
(ftype-ref Bl (b) d))
|
||
|
(error? ; ftype mismatch
|
||
|
(ftype-ref Bl (b) e))
|
||
|
(error? ; ftype mismatch
|
||
|
(ftype-ref Bl (b) f))
|
||
|
|
||
|
(error? ; ftype mismatch
|
||
|
(ftype-set! E (a) a 0.0))
|
||
|
(error? ; ftype mismatch
|
||
|
(ftype-set! E (a) bl 0.0))
|
||
|
(error? ; ftype mismatch
|
||
|
(ftype-set! E (a) bb 0.0))
|
||
|
(error? ; ftype mismatch
|
||
|
(ftype-set! E (a) c 0))
|
||
|
(error? ; ftype mismatch
|
||
|
(ftype-set! E (a) d 0.0))
|
||
|
(error? ; ftype mismatch
|
||
|
(ftype-set! E (a) f 0.0))
|
||
|
|
||
|
(error? ; ftype mismatch
|
||
|
(ftype-ref int () c))
|
||
|
(error? ; ftype mismatch
|
||
|
(ftype-ref unsigned () c))
|
||
|
(error? ; ftype mismatch
|
||
|
(ftype-set! int () c 0))
|
||
|
(error? ; ftype mismatch
|
||
|
(ftype-set! unsigned () c 0))
|
||
|
|
||
|
(eqv? (ftype-ref A (a) a) 3.14)
|
||
|
(eqv? (ftype-ref D () a) 3.14)
|
||
|
(eqv? (ftype-ref double () a) 3.14)
|
||
|
(eqv? (ftype-set! D () a -3.5) (void))
|
||
|
(eqv? (ftype-ref A (a) a) -3.5)
|
||
|
(eqv? (ftype-set! double () a 666.6) (void))
|
||
|
(eqv? (ftype-ref A (a) a) 666.6)
|
||
|
|
||
|
(error? ; ftype mismatch
|
||
|
(ftype-ref int () a))
|
||
|
|
||
|
(eqv? (ftype-ref Bl (a) bl) -3.14)
|
||
|
(or (not (eq? (native-endianness) 'little))
|
||
|
(eqv? (ftype-ref D () bl) -3.14))
|
||
|
(eqv? (ftype-ref Dl () bl) -3.14)
|
||
|
(or (not (eq? (native-endianness) 'little))
|
||
|
(eqv? (ftype-ref double () bl) -3.14))
|
||
|
(error? ; invalid syntax
|
||
|
(ftype-ref (endian little double) () bl))
|
||
|
|
||
|
(eqv? (ftype-ref Bb (a) bb) -3.14)
|
||
|
(or (not (eq? (native-endianness) 'big))
|
||
|
(eqv? (ftype-ref D () bb) -3.14))
|
||
|
(eqv? (ftype-ref Db () bb) -3.14)
|
||
|
(or (not (eq? (native-endianness) 'big))
|
||
|
(eqv? (ftype-ref double () bb) -3.14))
|
||
|
(error? ; invalid syntax
|
||
|
(ftype-ref (endian big double) () bb))
|
||
|
|
||
|
(eqv? (ftype-ref E (a) e) -3.1415)
|
||
|
(eqv? (ftype-ref D () e) -3.1415)
|
||
|
(eqv? (ftype-ref double () e) -3.1415)
|
||
|
(eqv? (ftype-set! D () e 3.1416) (void))
|
||
|
(eqv? (ftype-ref E (a) e) 3.1416)
|
||
|
(eqv? (ftype-set! double () e -3.1416) (void))
|
||
|
(eqv? (ftype-ref E (a) e) -3.1416)
|
||
|
|
||
|
(eqv? (ftype-ref G (0) g) 88.5)
|
||
|
(eqv? (ftype-ref D () g) 88.5)
|
||
|
(eqv? (ftype-ref double () g) 88.5)
|
||
|
(eqv? (ftype-set! D () g 3.1416) (void))
|
||
|
(eqv? (ftype-ref G (0) g) 3.1416)
|
||
|
(eqv? (ftype-set! double () g -3.1416) (void))
|
||
|
(eqv? (ftype-ref G (0) g) -3.1416)
|
||
|
|
||
|
(eqv? (ftype-ref H (a 0) h) 100.5)
|
||
|
(eqv? (ftype-ref G (0) h) 100.5)
|
||
|
(eqv? (ftype-ref D () h) 100.5)
|
||
|
(eqv? (ftype-ref double () h) 100.5)
|
||
|
(eqv? (ftype-set! D () h 3.1416) (void))
|
||
|
(eqv? (ftype-ref H (a 0) h) 3.1416)
|
||
|
(eqv? (ftype-set! double () h -3.1416) (void))
|
||
|
(eqv? (ftype-ref H (a 0) h) -3.1416)
|
||
|
|
||
|
(eqv? (ftype-ref I (a 0) i) 100.5)
|
||
|
(eqv? (ftype-ref Gu (0) i) 100.5)
|
||
|
(eqv? (ftype-ref D () i) 100.5)
|
||
|
(eqv? (ftype-ref double () i) 100.5)
|
||
|
(eqv? (ftype-set! D () i 3.1416) (void))
|
||
|
(eqv? (ftype-ref I (a 0) i) 3.1416)
|
||
|
(eqv? (ftype-set! double () i -3.1416) (void))
|
||
|
(eqv? (ftype-ref I (a 0) i) -3.1416)
|
||
|
|
||
|
(begin
|
||
|
(fptr-free a)
|
||
|
(fptr-free bl)
|
||
|
(fptr-free bb)
|
||
|
(fptr-free c)
|
||
|
(fptr-free d)
|
||
|
(fptr-free e)
|
||
|
(fptr-free f)
|
||
|
(fptr-free g)
|
||
|
(fptr-free h)
|
||
|
(fptr-free i)
|
||
|
#t)
|
||
|
)
|
||
|
|
||
|
(mat ftype-lock-operations ; also tested in thread.ms
|
||
|
(begin
|
||
|
(meta-cond
|
||
|
[(eq? (native-endianness) 'little)
|
||
|
(define-ftype swapped-iptr (endian big iptr))]
|
||
|
[else
|
||
|
(define-ftype swapped-iptr (endian little iptr))])
|
||
|
(define-ftype A
|
||
|
(struct
|
||
|
[a double]
|
||
|
[b wchar]
|
||
|
[c uptr]
|
||
|
[d float]
|
||
|
[e integer-16]
|
||
|
[f (struct
|
||
|
(f1 iptr)
|
||
|
(f2 (array 3 (union (f3a fixnum) (f3b iptr)))))]
|
||
|
[g (* iptr)]
|
||
|
[h swapped-iptr]))
|
||
|
(define g (make-ftype-pointer iptr (foreign-alloc (ftype-sizeof iptr))))
|
||
|
(define x (make-ftype-pointer A (foreign-alloc (ftype-sizeof A))))
|
||
|
(ftype-set! A (g) x g)
|
||
|
(define $idx 2)
|
||
|
#t)
|
||
|
|
||
|
(error? ; invalid syntax
|
||
|
(ftype-locked-incr!))
|
||
|
(error? ; invalid syntax
|
||
|
(ftype-locked-incr! A))
|
||
|
(error? ; invalid syntax
|
||
|
(ftype-locked-incr! A x))
|
||
|
(error? ; invalid syntax
|
||
|
(ftype-locked-incr! A (a . b) x))
|
||
|
(error? ; not an ftype
|
||
|
(ftype-locked-incr! x () x))
|
||
|
(error? ; unsupported non-integer or non-word-size
|
||
|
(ftype-locked-incr! A (a) x))
|
||
|
(error? ; unsupported non-integer or non-word-size
|
||
|
(ftype-locked-incr! A (b) x))
|
||
|
(error? ; unsupported non-integer or non-word-size
|
||
|
(ftype-locked-incr! A (d) x))
|
||
|
(error? ; unsupported non-integer or non-word-size
|
||
|
(ftype-locked-incr! A (e) x))
|
||
|
(error? ; unsupported non-base
|
||
|
(ftype-locked-incr! A (f) x))
|
||
|
(error? ; unsupported non-base
|
||
|
(ftype-locked-incr! A (f f2) x))
|
||
|
(error? ; unsupported non-base
|
||
|
(ftype-locked-incr! A (f f2) x))
|
||
|
(error? ; unsupported non-base
|
||
|
(ftype-locked-incr! A (f f2 0) x))
|
||
|
(error? ; unsupported non-integer or non-word-size
|
||
|
(ftype-locked-incr! A (f f2 0 f3a) x))
|
||
|
(error? ; unsupported non-base
|
||
|
(ftype-locked-incr! A (g) x))
|
||
|
(error? ; unsupported swapped
|
||
|
(ftype-locked-incr! A (h) x))
|
||
|
|
||
|
(error? ; invalid syntax
|
||
|
(ftype-locked-decr!))
|
||
|
(error? ; invalid syntax
|
||
|
(ftype-locked-decr! A))
|
||
|
(error? ; invalid syntax
|
||
|
(ftype-locked-decr! A x))
|
||
|
(error? ; invalid syntax
|
||
|
(ftype-locked-decr! A (a . b) x))
|
||
|
(error? ; not an ftype
|
||
|
(ftype-locked-decr! x () x))
|
||
|
(error? ; unsupported non-integer or non-word-size
|
||
|
(ftype-locked-decr! A (a) x))
|
||
|
(error? ; unsupported non-integer or non-word-size
|
||
|
(ftype-locked-decr! A (b) x))
|
||
|
(error? ; unsupported non-integer or non-word-size
|
||
|
(ftype-locked-decr! A (d) x))
|
||
|
(error? ; unsupported non-integer or non-word-size
|
||
|
(ftype-locked-decr! A (e) x))
|
||
|
(error? ; unsupported non-base
|
||
|
(ftype-locked-decr! A (f) x))
|
||
|
(error? ; unsupported non-base
|
||
|
(ftype-locked-decr! A (f f2) x))
|
||
|
(error? ; unsupported non-base
|
||
|
(ftype-locked-decr! A (f f2) x))
|
||
|
(error? ; unsupported non-base
|
||
|
(ftype-locked-decr! A (f f2 0) x))
|
||
|
(error? ; unsupported non-integer or non-word-size
|
||
|
(ftype-locked-decr! A (f f2 0 f3a) x))
|
||
|
(error? ; unsupported non-base
|
||
|
(ftype-locked-decr! A (g) x))
|
||
|
(error? ; unsupported swapped
|
||
|
(ftype-locked-decr! A (h) x))
|
||
|
|
||
|
(error? ; invalid syntax
|
||
|
(ftype-init-lock!))
|
||
|
(error? ; invalid syntax
|
||
|
(ftype-init-lock! A))
|
||
|
(error? ; invalid syntax
|
||
|
(ftype-init-lock! A x))
|
||
|
(error? ; invalid syntax
|
||
|
(ftype-init-lock! A (a . b) x))
|
||
|
(error? ; not an ftype
|
||
|
(ftype-init-lock! x () x))
|
||
|
(error? ; unsupported non-integer or non-word-size
|
||
|
(ftype-init-lock! A (a) x))
|
||
|
(error? ; unsupported non-integer or non-word-size
|
||
|
(ftype-init-lock! A (b) x))
|
||
|
(error? ; unsupported non-integer or non-word-size
|
||
|
(ftype-init-lock! A (d) x))
|
||
|
(error? ; unsupported non-integer or non-word-size
|
||
|
(ftype-init-lock! A (e) x))
|
||
|
(error? ; unsupported non-base
|
||
|
(ftype-init-lock! A (f) x))
|
||
|
(error? ; unsupported non-base
|
||
|
(ftype-init-lock! A (f f2) x))
|
||
|
(error? ; unsupported non-base
|
||
|
(ftype-init-lock! A (f f2) x))
|
||
|
(error? ; unsupported non-base
|
||
|
(ftype-init-lock! A (f f2 0) x))
|
||
|
(error? ; unsupported non-integer or non-word-size
|
||
|
(ftype-init-lock! A (f f2 0 f3a) x))
|
||
|
(error? ; unsupported non-base
|
||
|
(ftype-init-lock! A (g) x))
|
||
|
(error? ; unsupported swapped
|
||
|
(ftype-init-lock! A (h) x))
|
||
|
|
||
|
(error? ; invalid syntax
|
||
|
(ftype-lock!))
|
||
|
(error? ; invalid syntax
|
||
|
(ftype-lock! A))
|
||
|
(error? ; invalid syntax
|
||
|
(ftype-lock! A x))
|
||
|
(error? ; invalid syntax
|
||
|
(ftype-lock! A (a . b) x))
|
||
|
(error? ; not an ftype
|
||
|
(ftype-lock! x () x))
|
||
|
(error? ; unsupported non-integer or non-word-size
|
||
|
(ftype-lock! A (a) x))
|
||
|
(error? ; unsupported non-integer or non-word-size
|
||
|
(ftype-lock! A (b) x))
|
||
|
(error? ; unsupported non-integer or non-word-size
|
||
|
(ftype-lock! A (d) x))
|
||
|
(error? ; unsupported non-integer or non-word-size
|
||
|
(ftype-lock! A (e) x))
|
||
|
(error? ; unsupported non-base
|
||
|
(ftype-lock! A (f) x))
|
||
|
(error? ; unsupported non-base
|
||
|
(ftype-lock! A (f f2) x))
|
||
|
(error? ; unsupported non-base
|
||
|
(ftype-lock! A (f f2) x))
|
||
|
(error? ; unsupported non-base
|
||
|
(ftype-lock! A (f f2 0) x))
|
||
|
(error? ; unsupported non-integer or non-word-size
|
||
|
(ftype-lock! A (f f2 0 f3a) x))
|
||
|
(error? ; unsupported non-base
|
||
|
(ftype-lock! A (g) x))
|
||
|
(error? ; unsupported swapped
|
||
|
(ftype-lock! A (h) x))
|
||
|
|
||
|
(error? ; invalid syntax
|
||
|
(ftype-spin-lock!))
|
||
|
(error? ; invalid syntax
|
||
|
(ftype-spin-lock! A))
|
||
|
(error? ; invalid syntax
|
||
|
(ftype-spin-lock! A x))
|
||
|
(error? ; invalid syntax
|
||
|
(ftype-spin-lock! A (a . b) x))
|
||
|
(error? ; not an ftype
|
||
|
(ftype-spin-lock! x () x))
|
||
|
(error? ; unsupported non-integer or non-word-size
|
||
|
(ftype-spin-lock! A (a) x))
|
||
|
(error? ; unsupported non-integer or non-word-size
|
||
|
(ftype-spin-lock! A (b) x))
|
||
|
(error? ; unsupported non-integer or non-word-size
|
||
|
(ftype-spin-lock! A (d) x))
|
||
|
(error? ; unsupported non-integer or non-word-size
|
||
|
(ftype-spin-lock! A (e) x))
|
||
|
(error? ; unsupported non-base
|
||
|
(ftype-spin-lock! A (f) x))
|
||
|
(error? ; unsupported non-base
|
||
|
(ftype-spin-lock! A (f f2) x))
|
||
|
(error? ; unsupported non-base
|
||
|
(ftype-spin-lock! A (f f2) x))
|
||
|
(error? ; unsupported non-base
|
||
|
(ftype-spin-lock! A (f f2 0) x))
|
||
|
(error? ; unsupported non-integer or non-word-size
|
||
|
(ftype-spin-lock! A (f f2 0 f3a) x))
|
||
|
(error? ; unsupported non-base
|
||
|
(ftype-spin-lock! A (g) x))
|
||
|
(error? ; unsupported swapped
|
||
|
(ftype-spin-lock! A (h) x))
|
||
|
|
||
|
(error? ; invalid syntax
|
||
|
(ftype-unlock!))
|
||
|
(error? ; invalid syntax
|
||
|
(ftype-unlock! A))
|
||
|
(error? ; invalid syntax
|
||
|
(ftype-unlock! A x))
|
||
|
(error? ; invalid syntax
|
||
|
(ftype-unlock! A (a . b) x))
|
||
|
(error? ; not an ftype
|
||
|
(ftype-unlock! x () x))
|
||
|
(error? ; unsupported non-integer or non-word-size
|
||
|
(ftype-unlock! A (a) x))
|
||
|
(error? ; unsupported non-integer or non-word-size
|
||
|
(ftype-unlock! A (b) x))
|
||
|
(error? ; unsupported non-integer or non-word-size
|
||
|
(ftype-unlock! A (d) x))
|
||
|
(error? ; unsupported non-integer or non-word-size
|
||
|
(ftype-unlock! A (e) x))
|
||
|
(error? ; unsupported non-base
|
||
|
(ftype-unlock! A (f) x))
|
||
|
(error? ; unsupported non-base
|
||
|
(ftype-unlock! A (f f2) x))
|
||
|
(error? ; unsupported non-base
|
||
|
(ftype-unlock! A (f f2) x))
|
||
|
(error? ; unsupported non-base
|
||
|
(ftype-unlock! A (f f2 0) x))
|
||
|
(error? ; unsupported non-integer or non-word-size
|
||
|
(ftype-unlock! A (f f2 0 f3a) x))
|
||
|
(error? ; unsupported non-base
|
||
|
(ftype-unlock! A (g) x))
|
||
|
(error? ; unsupported swapped
|
||
|
(ftype-unlock! A (h) x))
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! A (c) x 0)
|
||
|
(ftype-set! A (f f1) x 0)
|
||
|
(ftype-set! A (f f2 1 f3b) x 0)
|
||
|
(ftype-set! A (f f2 $idx f3b) x 0)
|
||
|
(ftype-set! A (g *) x 0)
|
||
|
#t)
|
||
|
|
||
|
(not (ftype-locked-incr! A (c) x))
|
||
|
(not (ftype-locked-incr! A (f f1) x))
|
||
|
(not (ftype-locked-incr! A (f f2 1 f3b) x))
|
||
|
(not (ftype-locked-incr! A (f f2 $idx f3b) x))
|
||
|
(not (ftype-locked-incr! A (g *) x))
|
||
|
|
||
|
(ftype-locked-decr! A (c) x)
|
||
|
(ftype-locked-decr! A (f f1) x)
|
||
|
(ftype-locked-decr! A (f f2 1 f3b) x)
|
||
|
(ftype-locked-decr! A (f f2 $idx f3b) x)
|
||
|
(ftype-locked-decr! A (g *) x)
|
||
|
|
||
|
(not (ftype-locked-decr! A (c) x))
|
||
|
(not (ftype-locked-decr! A (f f1) x))
|
||
|
(not (ftype-locked-decr! A (f f2 1 f3b) x))
|
||
|
(not (ftype-locked-decr! A (f f2 $idx f3b) x))
|
||
|
(not (ftype-locked-decr! A (g *) x))
|
||
|
|
||
|
(not (ftype-locked-decr! A (c) x))
|
||
|
(not (ftype-locked-decr! A (f f1) x))
|
||
|
(not (ftype-locked-decr! A (f f2 1 f3b) x))
|
||
|
(not (ftype-locked-decr! A (f f2 $idx f3b) x))
|
||
|
(not (ftype-locked-decr! A (g *) x))
|
||
|
|
||
|
(not (ftype-locked-incr! A (c) x))
|
||
|
(not (ftype-locked-incr! A (f f1) x))
|
||
|
(not (ftype-locked-incr! A (f f2 1 f3b) x))
|
||
|
(not (ftype-locked-incr! A (f f2 $idx f3b) x))
|
||
|
(not (ftype-locked-incr! A (g *) x))
|
||
|
|
||
|
(ftype-locked-incr! A (c) x)
|
||
|
(ftype-locked-incr! A (f f1) x)
|
||
|
(ftype-locked-incr! A (f f2 1 f3b) x)
|
||
|
(ftype-locked-incr! A (f f2 $idx f3b) x)
|
||
|
(ftype-locked-incr! A (g *) x)
|
||
|
|
||
|
(equal?
|
||
|
(list
|
||
|
(ftype-ref A (c) x)
|
||
|
(ftype-ref A (f f1) x)
|
||
|
(ftype-ref A (f f2 1 f3b) x)
|
||
|
(ftype-ref A (f f2 $idx f3b) x)
|
||
|
(ftype-ref A (g *) x))
|
||
|
'(0 0 0 0 0))
|
||
|
|
||
|
(begin
|
||
|
(ftype-init-lock! A (c) x)
|
||
|
(ftype-init-lock! A (f f1) x)
|
||
|
(ftype-init-lock! A (f f2 1 f3b) x)
|
||
|
(ftype-init-lock! A (f f2 $idx f3b) x)
|
||
|
(ftype-init-lock! A (g *) x)
|
||
|
#t)
|
||
|
|
||
|
(ftype-lock! A (c) x)
|
||
|
(ftype-lock! A (f f1) x)
|
||
|
(ftype-lock! A (f f2 1 f3b) x)
|
||
|
(ftype-lock! A (f f2 $idx f3b) x)
|
||
|
(ftype-lock! A (g *) x)
|
||
|
|
||
|
(not (ftype-lock! A (c) x))
|
||
|
(not (ftype-lock! A (f f1) x))
|
||
|
(not (ftype-lock! A (f f2 1 f3b) x))
|
||
|
(not (ftype-lock! A (f f2 $idx f3b) x))
|
||
|
(not (ftype-lock! A (g *) x))
|
||
|
|
||
|
(eq? (ftype-unlock! A (c) x) (void))
|
||
|
(eq? (ftype-unlock! A (f f1) x) (void))
|
||
|
(eq? (ftype-unlock! A (f f2 1 f3b) x) (void))
|
||
|
(eq? (ftype-unlock! A (f f2 $idx f3b) x) (void))
|
||
|
(eq? (ftype-unlock! A (g *) x) (void))
|
||
|
|
||
|
(eq? (ftype-spin-lock! A (c) x) (void))
|
||
|
(eq? (ftype-spin-lock! A (f f1) x) (void))
|
||
|
(eq? (ftype-spin-lock! A (f f2 1 f3b) x) (void))
|
||
|
(eq? (ftype-spin-lock! A (f f2 $idx f3b) x) (void))
|
||
|
(eq? (ftype-spin-lock! A (g *) x) (void))
|
||
|
|
||
|
(not (ftype-lock! A (c) x))
|
||
|
(not (ftype-lock! A (f f1) x))
|
||
|
(not (ftype-lock! A (f f2 1 f3b) x))
|
||
|
(not (ftype-lock! A (f f2 $idx f3b) x))
|
||
|
(not (ftype-lock! A (g *) x))
|
||
|
|
||
|
(begin
|
||
|
(fptr-free x)
|
||
|
(fptr-free g)
|
||
|
#t)
|
||
|
)
|
||
|
|
||
|
(mat ftype-compile-file
|
||
|
; first, load from source
|
||
|
(begin
|
||
|
(with-output-to-file "testfile-ftype1.ss"
|
||
|
(lambda ()
|
||
|
(pretty-print
|
||
|
'(define-ftype fcf-A (struct [a double] [b wchar])))
|
||
|
(pretty-print
|
||
|
'(define a (make-ftype-pointer fcf-A (foreign-alloc (ftype-sizeof fcf-A))))))
|
||
|
'replace)
|
||
|
(load "testfile-ftype1.ss")
|
||
|
#t)
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! fcf-A (a) a 3.4)
|
||
|
(ftype-set! fcf-A (b) a #\$)
|
||
|
#t)
|
||
|
|
||
|
(eqv? (ftype-ref fcf-A (a) a) 3.4)
|
||
|
(eqv? (ftype-ref fcf-A (b) a) #\$)
|
||
|
(eqv? (ftype-ref double () a) 3.4)
|
||
|
|
||
|
; now try compile-file and load the object file
|
||
|
(begin
|
||
|
(with-output-to-file "testfile-ftype1.ss"
|
||
|
(lambda ()
|
||
|
(pretty-print
|
||
|
'(define-ftype fcf-A (struct [a double] [b wchar])))
|
||
|
(pretty-print
|
||
|
'(define a (make-ftype-pointer fcf-A (foreign-alloc (ftype-sizeof fcf-A))))))
|
||
|
'replace)
|
||
|
(for-each separate-compile '(ftype1))
|
||
|
(load "testfile-ftype1.so")
|
||
|
#t)
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! fcf-A (a) a 3.4)
|
||
|
(ftype-set! fcf-A (b) a #\$)
|
||
|
#t)
|
||
|
|
||
|
(eqv? (ftype-ref fcf-A (a) a) 3.4)
|
||
|
(eqv? (ftype-ref fcf-A (b) a) #\$)
|
||
|
(eqv? (ftype-ref double () a) 3.4)
|
||
|
|
||
|
(begin
|
||
|
(define old-a a)
|
||
|
(load "testfile-ftype1.so")
|
||
|
#t)
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! fcf-A (a) old-a 3.4)
|
||
|
(ftype-set! fcf-A (b) old-a #\$)
|
||
|
#t)
|
||
|
|
||
|
(eqv? (ftype-ref fcf-A (a) old-a) 3.4)
|
||
|
(eqv? (ftype-ref fcf-A (b) old-a) #\$)
|
||
|
(eqv? (ftype-ref double () old-a) 3.4)
|
||
|
|
||
|
; check fasling of recursive ftype definitions
|
||
|
(begin
|
||
|
(with-output-to-file "testfile-ftype2.ss"
|
||
|
(lambda ()
|
||
|
(pretty-print
|
||
|
'(define-ftype fcf-B
|
||
|
(struct
|
||
|
[data double]
|
||
|
[next (* fcf-B)]))))
|
||
|
'replace)
|
||
|
(separate-compile "testfile-ftype2")
|
||
|
(load "testfile-ftype2.so")
|
||
|
#t)
|
||
|
(equal?
|
||
|
(ftype-pointer-ftype (make-ftype-pointer fcf-B 0))
|
||
|
'(struct
|
||
|
[data double]
|
||
|
[next (* fcf-B)]))
|
||
|
; directly check that cyclic rtd fasl'd in okay
|
||
|
(let ([ftd (record-rtd (make-ftype-pointer fcf-B 0))])
|
||
|
(let ([ftd2 (caddr (cadr ((record-accessor (record-rtd ftd) 0) ftd)))])
|
||
|
(eq? ((record-accessor (record-rtd ftd2) 0) ftd2) ftd)))
|
||
|
; indirectly check
|
||
|
(let* ([addr (foreign-alloc (ftype-sizeof fcf-B))]
|
||
|
[x (make-ftype-pointer fcf-B addr)])
|
||
|
(dynamic-wind
|
||
|
void
|
||
|
(lambda ()
|
||
|
(ftype-set! fcf-B (next) x (make-ftype-pointer fcf-B 0))
|
||
|
(ftype-pointer? (ftype-ref fcf-B (next) x)))
|
||
|
(lambda () (foreign-free addr))))
|
||
|
; regression test: verify that we can fasl in a cyclic ftd that's already registered on its uid
|
||
|
(begin
|
||
|
(mkfile "testfile-ftype3.ss"
|
||
|
'(define-ftype
|
||
|
[ftype3-A (* ftype3-B)]
|
||
|
[ftype3-B (struct [h ftype3-A])]))
|
||
|
(compile-file "testfile-ftype3")
|
||
|
#t)
|
||
|
(begin ; once should prove it
|
||
|
(load "testfile-ftype3.so")
|
||
|
(ftype-pointer? ftype3-A (make-ftype-pointer ftype3-B 0)))
|
||
|
(begin ; twice for that warm fuzzy feeling
|
||
|
(load "testfile-ftype3.so")
|
||
|
(ftype-pointer? ftype3-A (make-ftype-pointer ftype3-B 0)))
|
||
|
(begin
|
||
|
(mkfile "testfile-ftype4.ss"
|
||
|
'(define-ftype
|
||
|
[ftype4-A (struct [q (* ftype4-B)])]
|
||
|
[ftype4-B (struct [h (* ftype4-A)])]))
|
||
|
(compile-file "testfile-ftype4")
|
||
|
#t)
|
||
|
(begin ; once should prove it
|
||
|
(load "testfile-ftype4.so")
|
||
|
(ftype-pointer? ftype4-A (make-ftype-pointer ftype4-A 0)))
|
||
|
(begin ; twice for that warm fuzzy feeling
|
||
|
(load "testfile-ftype4.so")
|
||
|
(ftype-pointer? ftype4-B (make-ftype-pointer ftype4-B 0)))
|
||
|
(begin
|
||
|
(mkfile "testfile-ftype5.ss"
|
||
|
'(define-ftype
|
||
|
[ftype5-A (struct [q (* ftype4-A)])]))
|
||
|
(compile-file "testfile-ftype5")
|
||
|
#t)
|
||
|
(begin
|
||
|
(load "testfile-ftype5.so")
|
||
|
(ftype-pointer? ftype5-A (make-ftype-pointer ftype5-A 0)))
|
||
|
)
|
||
|
|
||
|
(mat ftype-bits
|
||
|
(begin
|
||
|
(define z (make-ftype-pointer unsigned-32 (foreign-alloc (ftype-sizeof unsigned-32))))
|
||
|
(ftype-set! unsigned-32 () z #b101101011010111010)
|
||
|
#t)
|
||
|
|
||
|
(equal?
|
||
|
(list
|
||
|
(#%$fptr-ref-bits 'unsigned-32 #f #f z 0 0 4)
|
||
|
(#%$fptr-ref-bits 'unsigned-32 #f #f z 0 0 5)
|
||
|
(#%$fptr-ref-bits 'unsigned-32 #f #f z 0 0 6)
|
||
|
(#%$fptr-ref-bits 'unsigned-32 #f #f z 0 0 7)
|
||
|
(#%$fptr-ref-bits 'unsigned-32 #f #f z 0 1 7)
|
||
|
(#%$fptr-ref-bits 'unsigned-32 #f #f z 0 1 6))
|
||
|
'(10 26 58 58 29 29))
|
||
|
|
||
|
(equal?
|
||
|
(list
|
||
|
(#%$fptr-ref-bits 'unsigned-32 #f #t z 0 0 4)
|
||
|
(#%$fptr-ref-bits 'unsigned-32 #f #t z 0 0 5)
|
||
|
(#%$fptr-ref-bits 'unsigned-32 #f #t z 0 0 6)
|
||
|
(#%$fptr-ref-bits 'unsigned-32 #f #t z 0 0 7)
|
||
|
(#%$fptr-ref-bits 'unsigned-32 #f #t z 0 1 7)
|
||
|
(#%$fptr-ref-bits 'unsigned-32 #f #t z 0 1 6))
|
||
|
'(-6 -6 -6 58 29 -3))
|
||
|
|
||
|
(begin
|
||
|
(#%$fptr-set-bits! 'unsigned-32 #f z 0 1 6 5)
|
||
|
(#%$fptr-set-bits! 'unsigned-32 #f z 0 6 10 -3)
|
||
|
(#%$fptr-set-bits! 'unsigned-32 #f z 0 10 15 10)
|
||
|
#t)
|
||
|
|
||
|
(equal?
|
||
|
(list
|
||
|
(#%$fptr-ref-bits 'unsigned-32 #f #f z 0 1 6)
|
||
|
(#%$fptr-ref-bits 'unsigned-32 #f #t z 0 6 10)
|
||
|
(#%$fptr-ref-bits 'unsigned-32 #f #t z 0 10 15))
|
||
|
'(5 -3 10))
|
||
|
|
||
|
(begin
|
||
|
(fptr-free z)
|
||
|
#t)
|
||
|
|
||
|
; ----------------
|
||
|
(begin
|
||
|
(define-ftype Bbits
|
||
|
(endian little
|
||
|
(union
|
||
|
[a1 (struct
|
||
|
[a1 unsigned-16]
|
||
|
[a2 unsigned-8]
|
||
|
[a3 unsigned-64]
|
||
|
[a4 unsigned-32])]
|
||
|
[a2 (struct
|
||
|
[a1 (bits
|
||
|
[a1 signed 1]
|
||
|
[a2 signed 15])]
|
||
|
[a2 (bits
|
||
|
[a1 signed 3]
|
||
|
[a2 signed 5])]
|
||
|
[a3 (bits
|
||
|
[a1 signed 50]
|
||
|
[a2 signed 14])]
|
||
|
[a4 (bits
|
||
|
[a1 signed 19]
|
||
|
[a2 signed 13])])]
|
||
|
[a3 (struct
|
||
|
[a1 (bits
|
||
|
[a1 unsigned 1]
|
||
|
[a2 unsigned 15])]
|
||
|
[a2 (bits
|
||
|
[a1 unsigned 3]
|
||
|
[a2 unsigned 5])]
|
||
|
[a3 (bits
|
||
|
[a1 unsigned 50]
|
||
|
[a2 unsigned 14])]
|
||
|
[a4 (bits
|
||
|
[a1 unsigned 19]
|
||
|
[a2 unsigned 13])])])))
|
||
|
(define x (make-ftype-pointer Bbits (foreign-alloc (ftype-sizeof Bbits))))
|
||
|
#t)
|
||
|
|
||
|
(error? ;; invalid value 113886 for bit field of size 1
|
||
|
(ftype-set! Bbits (a2 a1 a1) x #x1bcde))
|
||
|
|
||
|
(error? ;; invalid value #\a for bit field of size 3
|
||
|
(ftype-set! Bbits (a2 a2 a1) x #\a))
|
||
|
|
||
|
(error? ;; invalid value oops for bit field of size 14
|
||
|
(ftype-set! Bbits (a3 a3 a2) x 'oops))
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! Bbits (a1 a1) x #xabce)
|
||
|
(ftype-set! Bbits (a1 a2) x #xde)
|
||
|
(ftype-set! Bbits (a1 a3) x #xf9357c18d679e35b)
|
||
|
(ftype-set! Bbits (a1 a4) x #x7c18d679)
|
||
|
#t)
|
||
|
|
||
|
(eqv? (ftype-ref Bbits (a2 a1 a1) x) #x0)
|
||
|
(eqv? (ftype-ref Bbits (a2 a1 a2) x) (- #x55e7 (expt 2 15)))
|
||
|
(eqv? (ftype-ref Bbits (a2 a2 a1) x) (- #x6 (expt 2 3)))
|
||
|
(eqv? (ftype-ref Bbits (a2 a2 a2) x) (- #x1b (expt 2 5)))
|
||
|
(eqv? (ftype-ref Bbits (a2 a3 a1) x) #x17c18d679e35b)
|
||
|
(eqv? (ftype-ref Bbits (a2 a3 a2) x) (- #x3e4d (expt 2 14)))
|
||
|
(eqv? (ftype-ref Bbits (a2 a4 a1) x) #xd679)
|
||
|
(eqv? (ftype-ref Bbits (a2 a4 a2) x) #xf83)
|
||
|
|
||
|
(eqv? (ftype-ref Bbits (a3 a1 a1) x) #x0)
|
||
|
(eqv? (ftype-ref Bbits (a3 a1 a2) x) #x55e7)
|
||
|
(eqv? (ftype-ref Bbits (a3 a2 a1) x) #x6)
|
||
|
(eqv? (ftype-ref Bbits (a3 a2 a2) x) #x1b)
|
||
|
(eqv? (ftype-ref Bbits (a3 a3 a1) x) #x17c18d679e35b)
|
||
|
(eqv? (ftype-ref Bbits (a3 a3 a2) x) #x3e4d)
|
||
|
(eqv? (ftype-ref Bbits (a3 a4 a1) x) #xd679)
|
||
|
(eqv? (ftype-ref Bbits (a3 a4 a2) x) #xf83)
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! Bbits (a1 a1) x #x7c7c)
|
||
|
(ftype-set! Bbits (a1 a2) x #xa8)
|
||
|
(ftype-set! Bbits (a1 a3) x #x3b3b3b3b3b3b3b3b)
|
||
|
(ftype-set! Bbits (a1 a4) x #x91919191)
|
||
|
#t)
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! Bbits (a2 a1 a1) x #x-1)
|
||
|
#t)
|
||
|
|
||
|
(eqv? (ftype-ref Bbits (a1 a1) x) #x7c7d)
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! Bbits (a2 a1 a1) x #x0)
|
||
|
(ftype-set! Bbits (a2 a1 a2) x (- #x55e7 (expt 2 15)))
|
||
|
(ftype-set! Bbits (a2 a2 a1) x (- #x6 (expt 2 3)))
|
||
|
(ftype-set! Bbits (a2 a2 a2) x (- #x1b (expt 2 5)))
|
||
|
(ftype-set! Bbits (a2 a3 a1) x #x17c18d679e35b)
|
||
|
(ftype-set! Bbits (a2 a3 a2) x (- #x3e4d (expt 2 14)))
|
||
|
(ftype-set! Bbits (a2 a4 a1) x #xd679)
|
||
|
(ftype-set! Bbits (a2 a4 a2) x #xf83)
|
||
|
#t)
|
||
|
|
||
|
(eqv? (ftype-ref Bbits (a1 a1) x) #xabce)
|
||
|
(eqv? (ftype-ref Bbits (a1 a2) x) #xde)
|
||
|
(eqv? (ftype-ref Bbits (a1 a3) x) #xf9357c18d679e35b)
|
||
|
(eqv? (ftype-ref Bbits (a1 a4) x) #x7c18d679)
|
||
|
|
||
|
(eqv? (ftype-ref Bbits (a2 a1 a1) x) #x0)
|
||
|
(eqv? (ftype-ref Bbits (a2 a1 a2) x) (- #x55e7 (expt 2 15)))
|
||
|
(eqv? (ftype-ref Bbits (a2 a2 a1) x) (- #x6 (expt 2 3)))
|
||
|
(eqv? (ftype-ref Bbits (a2 a2 a2) x) (- #x1b (expt 2 5)))
|
||
|
(eqv? (ftype-ref Bbits (a2 a3 a1) x) #x17c18d679e35b)
|
||
|
(eqv? (ftype-ref Bbits (a2 a3 a2) x) (- #x3e4d (expt 2 14)))
|
||
|
(eqv? (ftype-ref Bbits (a2 a4 a1) x) #xd679)
|
||
|
(eqv? (ftype-ref Bbits (a2 a4 a2) x) #xf83)
|
||
|
|
||
|
(eqv? (ftype-ref Bbits (a3 a1 a1) x) #x0)
|
||
|
(eqv? (ftype-ref Bbits (a3 a1 a2) x) #x55e7)
|
||
|
(eqv? (ftype-ref Bbits (a3 a2 a1) x) #x6)
|
||
|
(eqv? (ftype-ref Bbits (a3 a2 a2) x) #x1b)
|
||
|
(eqv? (ftype-ref Bbits (a3 a3 a1) x) #x17c18d679e35b)
|
||
|
(eqv? (ftype-ref Bbits (a3 a3 a2) x) #x3e4d)
|
||
|
(eqv? (ftype-ref Bbits (a3 a4 a1) x) #xd679)
|
||
|
(eqv? (ftype-ref Bbits (a3 a4 a2) x) #xf83)
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! Bbits (a1 a1) x #xc7c7)
|
||
|
(ftype-set! Bbits (a1 a2) x #xa8)
|
||
|
(ftype-set! Bbits (a1 a3) x #x3b3b3b3b3b3b3b3b)
|
||
|
(ftype-set! Bbits (a1 a4) x #x91919191)
|
||
|
#t)
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! Bbits (a3 a1 a1) x #x0)
|
||
|
(ftype-set! Bbits (a3 a1 a2) x #x55e7)
|
||
|
(ftype-set! Bbits (a3 a2 a1) x #x6)
|
||
|
(ftype-set! Bbits (a3 a2 a2) x #x1b)
|
||
|
(ftype-set! Bbits (a3 a3 a1) x #x17c18d679e35b)
|
||
|
(ftype-set! Bbits (a3 a3 a2) x #x3e4d)
|
||
|
(ftype-set! Bbits (a3 a4 a1) x #xd679)
|
||
|
(ftype-set! Bbits (a3 a4 a2) x #xf83)
|
||
|
#t)
|
||
|
|
||
|
(eqv? (ftype-ref Bbits (a1 a1) x) #xabce)
|
||
|
(eqv? (ftype-ref Bbits (a1 a2) x) #xde)
|
||
|
(eqv? (ftype-ref Bbits (a1 a3) x) #xf9357c18d679e35b)
|
||
|
(eqv? (ftype-ref Bbits (a1 a4) x) #x7c18d679)
|
||
|
|
||
|
(eqv? (ftype-ref Bbits (a2 a1 a1) x) #x0)
|
||
|
(eqv? (ftype-ref Bbits (a2 a1 a2) x) (- #x55e7 (expt 2 15)))
|
||
|
(eqv? (ftype-ref Bbits (a2 a2 a1) x) (- #x6 (expt 2 3)))
|
||
|
(eqv? (ftype-ref Bbits (a2 a2 a2) x) (- #x1b (expt 2 5)))
|
||
|
(eqv? (ftype-ref Bbits (a2 a3 a1) x) #x17c18d679e35b)
|
||
|
(eqv? (ftype-ref Bbits (a2 a3 a2) x) (- #x3e4d (expt 2 14)))
|
||
|
(eqv? (ftype-ref Bbits (a2 a4 a1) x) #xd679)
|
||
|
(eqv? (ftype-ref Bbits (a2 a4 a2) x) #xf83)
|
||
|
|
||
|
(eqv? (ftype-ref Bbits (a3 a1 a1) x) #x0)
|
||
|
(eqv? (ftype-ref Bbits (a3 a1 a2) x) #x55e7)
|
||
|
(eqv? (ftype-ref Bbits (a3 a2 a1) x) #x6)
|
||
|
(eqv? (ftype-ref Bbits (a3 a2 a2) x) #x1b)
|
||
|
(eqv? (ftype-ref Bbits (a3 a3 a1) x) #x17c18d679e35b)
|
||
|
(eqv? (ftype-ref Bbits (a3 a3 a2) x) #x3e4d)
|
||
|
(eqv? (ftype-ref Bbits (a3 a4 a1) x) #xd679)
|
||
|
(eqv? (ftype-ref Bbits (a3 a4 a2) x) #xf83)
|
||
|
|
||
|
(begin
|
||
|
(fptr-free x)
|
||
|
#t)
|
||
|
|
||
|
; ----------------
|
||
|
|
||
|
(begin
|
||
|
(define-ftype Ebits (bits [x signed 32]))
|
||
|
(define ebits (make-ftype-pointer Ebits 0))
|
||
|
#t)
|
||
|
|
||
|
(error? ;; invalid value oops for type bit-field
|
||
|
(ftype-set! Ebits (x) ebits 'oops))
|
||
|
|
||
|
(error? ;; invalid value <int> for type bit-field
|
||
|
(ftype-set! Ebits (x) ebits (expt 2 32)))
|
||
|
|
||
|
; ----------------
|
||
|
(begin
|
||
|
(define-ftype Bbits
|
||
|
(endian big
|
||
|
(union
|
||
|
[a1 (struct
|
||
|
[a1 unsigned-16]
|
||
|
[a2 unsigned-8]
|
||
|
[a3 unsigned-64]
|
||
|
[a4 unsigned-32])]
|
||
|
[a2 (struct
|
||
|
[a1 (bits
|
||
|
[a1 signed 1]
|
||
|
[a2 signed 15])]
|
||
|
[a2 (bits
|
||
|
[a1 signed 3]
|
||
|
[a2 signed 5])]
|
||
|
[a3 (bits
|
||
|
[a1 signed 50]
|
||
|
[a2 signed 14])]
|
||
|
[a4 (bits
|
||
|
[a1 signed 19]
|
||
|
[a2 signed 13])])]
|
||
|
[a3 (struct
|
||
|
[a1 (bits
|
||
|
[a1 unsigned 1]
|
||
|
[a2 unsigned 15])]
|
||
|
[a2 (bits
|
||
|
[a1 unsigned 3]
|
||
|
[a2 unsigned 5])]
|
||
|
[a3 (bits
|
||
|
[a1 unsigned 50]
|
||
|
[a2 unsigned 14])]
|
||
|
[a4 (bits
|
||
|
[a1 unsigned 19]
|
||
|
[a2 unsigned 13])])])))
|
||
|
(define x (make-ftype-pointer Bbits (foreign-alloc (ftype-sizeof Bbits))))
|
||
|
#t)
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! Bbits (a1 a1) x #xabce)
|
||
|
(ftype-set! Bbits (a1 a2) x #xde)
|
||
|
(ftype-set! Bbits (a1 a3) x #xf9357c18d679e35b)
|
||
|
(ftype-set! Bbits (a1 a4) x #x7c18d679)
|
||
|
#t)
|
||
|
|
||
|
(eqv? (ftype-ref Bbits (a2 a1 a1) x) -1)
|
||
|
(eqv? (ftype-ref Bbits (a2 a1 a2) x) #x2bce)
|
||
|
(eqv? (ftype-ref Bbits (a2 a2 a1) x) (- #x6 (expt 2 3)))
|
||
|
(eqv? (ftype-ref Bbits (a2 a2 a2) x) (- #x1e (expt 2 5)))
|
||
|
(eqv? (ftype-ref Bbits (a2 a3 a1) x) (- #x3e4d5f06359e7 (expt 2 50)))
|
||
|
(eqv? (ftype-ref Bbits (a2 a3 a2) x) (- #x235b (expt 2 14)))
|
||
|
(eqv? (ftype-ref Bbits (a2 a4 a1) x) #x3e0c6)
|
||
|
(eqv? (ftype-ref Bbits (a2 a4 a2) x) (- #x1679 (expt 2 13)))
|
||
|
|
||
|
(eqv? (ftype-ref Bbits (a3 a1 a1) x) 1)
|
||
|
(eqv? (ftype-ref Bbits (a3 a1 a2) x) #x2bce)
|
||
|
(eqv? (ftype-ref Bbits (a3 a2 a1) x) #x6)
|
||
|
(eqv? (ftype-ref Bbits (a3 a2 a2) x) #x1e)
|
||
|
(eqv? (ftype-ref Bbits (a3 a3 a1) x) #x3e4d5f06359e7)
|
||
|
(eqv? (ftype-ref Bbits (a3 a3 a2) x) #x235b)
|
||
|
(eqv? (ftype-ref Bbits (a3 a4 a1) x) #x3e0c6)
|
||
|
(eqv? (ftype-ref Bbits (a3 a4 a2) x) #x1679)
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! Bbits (a1 a1) x #x7c7c)
|
||
|
(ftype-set! Bbits (a1 a2) x #xa8)
|
||
|
(ftype-set! Bbits (a1 a3) x #x3b3b3b3b3b3b3b3b)
|
||
|
(ftype-set! Bbits (a1 a4) x #x91919191)
|
||
|
#t)
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! Bbits (a2 a1 a1) x -1)
|
||
|
#t)
|
||
|
|
||
|
(eqv? (ftype-ref Bbits (a1 a1) x) #xfc7c)
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! Bbits (a2 a1 a1) x -1)
|
||
|
(ftype-set! Bbits (a2 a1 a2) x #x2bce)
|
||
|
(ftype-set! Bbits (a2 a2 a1) x (- #x6 (expt 2 3)))
|
||
|
(ftype-set! Bbits (a2 a2 a2) x (- #x1e (expt 2 5)))
|
||
|
(ftype-set! Bbits (a2 a3 a1) x (- #x3e4d5f06359e7 (expt 2 50)))
|
||
|
(ftype-set! Bbits (a2 a3 a2) x (- #x235b (expt 2 14)))
|
||
|
(ftype-set! Bbits (a2 a4 a1) x #x3e0c6)
|
||
|
(ftype-set! Bbits (a2 a4 a2) x (- #x1679 (expt 2 13)))
|
||
|
#t)
|
||
|
|
||
|
(eqv? (ftype-ref Bbits (a1 a1) x) #xabce)
|
||
|
(eqv? (ftype-ref Bbits (a1 a2) x) #xde)
|
||
|
(eqv? (ftype-ref Bbits (a1 a3) x) #xf9357c18d679e35b)
|
||
|
(eqv? (ftype-ref Bbits (a1 a4) x) #x7c18d679)
|
||
|
|
||
|
(eqv? (ftype-ref Bbits (a2 a1 a1) x) -1)
|
||
|
(eqv? (ftype-ref Bbits (a2 a1 a2) x) #x2bce)
|
||
|
(eqv? (ftype-ref Bbits (a2 a2 a1) x) (- #x6 (expt 2 3)))
|
||
|
(eqv? (ftype-ref Bbits (a2 a2 a2) x) (- #x1e (expt 2 5)))
|
||
|
(eqv? (ftype-ref Bbits (a2 a3 a1) x) (- #x3e4d5f06359e7 (expt 2 50)))
|
||
|
(eqv? (ftype-ref Bbits (a2 a3 a2) x) (- #x235b (expt 2 14)))
|
||
|
(eqv? (ftype-ref Bbits (a2 a4 a1) x) #x3e0c6)
|
||
|
(eqv? (ftype-ref Bbits (a2 a4 a2) x) (- #x1679 (expt 2 13)))
|
||
|
|
||
|
(eqv? (ftype-ref Bbits (a3 a1 a1) x) 1)
|
||
|
(eqv? (ftype-ref Bbits (a3 a1 a2) x) #x2bce)
|
||
|
(eqv? (ftype-ref Bbits (a3 a2 a1) x) #x6)
|
||
|
(eqv? (ftype-ref Bbits (a3 a2 a2) x) #x1e)
|
||
|
(eqv? (ftype-ref Bbits (a3 a3 a1) x) #x3e4d5f06359e7)
|
||
|
(eqv? (ftype-ref Bbits (a3 a3 a2) x) #x235b)
|
||
|
(eqv? (ftype-ref Bbits (a3 a4 a1) x) #x3e0c6)
|
||
|
(eqv? (ftype-ref Bbits (a3 a4 a2) x) #x1679)
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! Bbits (a1 a1) x #xc7c7)
|
||
|
(ftype-set! Bbits (a1 a2) x #xa8)
|
||
|
(ftype-set! Bbits (a1 a3) x #x3b3b3b3b3b3b3b3b)
|
||
|
(ftype-set! Bbits (a1 a4) x #x91919191)
|
||
|
#t)
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! Bbits (a3 a1 a1) x 1)
|
||
|
(ftype-set! Bbits (a3 a1 a2) x #x2bce)
|
||
|
(ftype-set! Bbits (a3 a2 a1) x #x6)
|
||
|
(ftype-set! Bbits (a3 a2 a2) x #x1e)
|
||
|
(ftype-set! Bbits (a3 a3 a1) x #x3e4d5f06359e7)
|
||
|
(ftype-set! Bbits (a3 a3 a2) x #x235b)
|
||
|
(ftype-set! Bbits (a3 a4 a1) x #x3e0c6)
|
||
|
(ftype-set! Bbits (a3 a4 a2) x #x1679)
|
||
|
#t)
|
||
|
|
||
|
(eqv? (ftype-ref Bbits (a1 a1) x) #xabce)
|
||
|
(eqv? (ftype-ref Bbits (a1 a2) x) #xde)
|
||
|
(eqv? (ftype-ref Bbits (a1 a3) x) #xf9357c18d679e35b)
|
||
|
(eqv? (ftype-ref Bbits (a1 a4) x) #x7c18d679)
|
||
|
|
||
|
(eqv? (ftype-ref Bbits (a2 a1 a1) x) -1)
|
||
|
(eqv? (ftype-ref Bbits (a2 a1 a2) x) #x2bce)
|
||
|
(eqv? (ftype-ref Bbits (a2 a2 a1) x) (- #x6 (expt 2 3)))
|
||
|
(eqv? (ftype-ref Bbits (a2 a2 a2) x) (- #x1e (expt 2 5)))
|
||
|
(eqv? (ftype-ref Bbits (a2 a3 a1) x) (- #x3e4d5f06359e7 (expt 2 50)))
|
||
|
(eqv? (ftype-ref Bbits (a2 a3 a2) x) (- #x235b (expt 2 14)))
|
||
|
(eqv? (ftype-ref Bbits (a2 a4 a1) x) #x3e0c6)
|
||
|
(eqv? (ftype-ref Bbits (a2 a4 a2) x) (- #x1679 (expt 2 13)))
|
||
|
|
||
|
(eqv? (ftype-ref Bbits (a3 a1 a1) x) 1)
|
||
|
(eqv? (ftype-ref Bbits (a3 a1 a2) x) #x2bce)
|
||
|
(eqv? (ftype-ref Bbits (a3 a2 a1) x) #x6)
|
||
|
(eqv? (ftype-ref Bbits (a3 a2 a2) x) #x1e)
|
||
|
(eqv? (ftype-ref Bbits (a3 a3 a1) x) #x3e4d5f06359e7)
|
||
|
(eqv? (ftype-ref Bbits (a3 a3 a2) x) #x235b)
|
||
|
(eqv? (ftype-ref Bbits (a3 a4 a1) x) #x3e0c6)
|
||
|
(eqv? (ftype-ref Bbits (a3 a4 a2) x) #x1679)
|
||
|
|
||
|
(begin
|
||
|
(fptr-free x)
|
||
|
#t)
|
||
|
|
||
|
; ----------------
|
||
|
(begin
|
||
|
(define-ftype Cbits
|
||
|
(endian little
|
||
|
(union
|
||
|
[a1 (struct
|
||
|
[a1 unsigned-64]
|
||
|
[a2 unsigned-64]
|
||
|
[a3 unsigned-64]
|
||
|
[a4 unsigned-64]
|
||
|
[a5 unsigned-64]
|
||
|
[a6 unsigned-64]
|
||
|
[a7 unsigned-64])]
|
||
|
[a2 (struct
|
||
|
[a1 (bits
|
||
|
[a1 signed 64])]
|
||
|
[a2 (bits
|
||
|
[a1 unsigned 64])]
|
||
|
[a3 (bits
|
||
|
[a1 unsigned 63]
|
||
|
[a2 signed 1])]
|
||
|
[a4 (bits
|
||
|
[a1 unsigned 1]
|
||
|
[a2 signed 63])]
|
||
|
[a5 (bits
|
||
|
[a1 signed 32]
|
||
|
[a2 unsigned 16]
|
||
|
[a3 signed 8]
|
||
|
[a4 unsigned 5]
|
||
|
[a5 signed 3])]
|
||
|
[a6 (bits
|
||
|
[a1 unsigned 5]
|
||
|
[a2 signed 8]
|
||
|
[a3 unsigned 16]
|
||
|
[a4 signed 32]
|
||
|
[a5 signed 3])]
|
||
|
[a7 (bits
|
||
|
[a1 unsigned 32]
|
||
|
[a2 signed 16]
|
||
|
[a3 unsigned 8]
|
||
|
[a4 signed 5]
|
||
|
[a5 unsigned 3])])])))
|
||
|
(define x (make-ftype-pointer Cbits (foreign-alloc (ftype-sizeof Cbits))))
|
||
|
#t)
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! Cbits (a1 a1) x #x923456789abcdef9)
|
||
|
(ftype-set! Cbits (a1 a2) x #xda3c2d784b69f01e)
|
||
|
(ftype-set! Cbits (a1 a3) x #x923456789abcdef9)
|
||
|
(ftype-set! Cbits (a1 a4) x #xda3c2d784b69f01e)
|
||
|
(ftype-set! Cbits (a1 a5) x #x923456789abcdef9)
|
||
|
(ftype-set! Cbits (a1 a6) x #xda3c2d784b69f01e)
|
||
|
(ftype-set! Cbits (a1 a7) x #x923456789abcdef9)
|
||
|
#t)
|
||
|
|
||
|
(eqv? (ftype-ref Cbits (a2 a1 a1) x) (- #x923456789abcdef9 (expt 2 64)))
|
||
|
(eqv? (ftype-ref Cbits (a2 a2 a1) x) #xda3c2d784b69f01e)
|
||
|
(eqv? (ftype-ref Cbits (a2 a3 a1) x) #x123456789abcdef9)
|
||
|
(eqv? (ftype-ref Cbits (a2 a3 a2) x) -1)
|
||
|
(eqv? (ftype-ref Cbits (a2 a4 a1) x) 0)
|
||
|
(eqv? (ftype-ref Cbits (a2 a4 a2) x) (- (ash #xda3c2d784b69f01e -1) (expt 2 63)))
|
||
|
(eqv? (ftype-ref Cbits (a2 a5 a1) x) (- #x9abcdef9 (expt 2 32)))
|
||
|
(eqv? (ftype-ref Cbits (a2 a5 a2) x) #x5678)
|
||
|
(eqv? (ftype-ref Cbits (a2 a5 a3) x) #x34)
|
||
|
(eqv? (ftype-ref Cbits (a2 a5 a4) x) #x12)
|
||
|
(eqv? (ftype-ref Cbits (a2 a5 a5) x) #x-4)
|
||
|
(eqv? (ftype-ref Cbits (a2 a6 a1) x) #x1e)
|
||
|
(eqv? (ftype-ref Cbits (a2 a6 a2) x) #x-80)
|
||
|
(eqv? (ftype-ref Cbits (a2 a6 a3) x) #x5b4f)
|
||
|
(eqv? (ftype-ref Cbits (a2 a6 a4) x) (- #xD1E16BC2 (expt 2 32)))
|
||
|
(eqv? (ftype-ref Cbits (a2 a6 a5) x) #x-2)
|
||
|
(eqv? (ftype-ref Cbits (a2 a7 a1) x) #x9abcdef9)
|
||
|
(eqv? (ftype-ref Cbits (a2 a7 a2) x) #x5678)
|
||
|
(eqv? (ftype-ref Cbits (a2 a7 a3) x) #x34)
|
||
|
(eqv? (ftype-ref Cbits (a2 a7 a4) x) (- #x12 (expt 2 5)))
|
||
|
(eqv? (ftype-ref Cbits (a2 a7 a5) x) #x4)
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! Cbits (a1 a1) x 0)
|
||
|
(ftype-set! Cbits (a1 a2) x 0)
|
||
|
(ftype-set! Cbits (a1 a3) x 0)
|
||
|
(ftype-set! Cbits (a1 a4) x 0)
|
||
|
(ftype-set! Cbits (a1 a5) x 0)
|
||
|
(ftype-set! Cbits (a1 a6) x 0)
|
||
|
(ftype-set! Cbits (a1 a7) x 0)
|
||
|
#t)
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! Cbits (a2 a1 a1) x (- #x923456789abcdef9 (expt 2 64)))
|
||
|
(ftype-set! Cbits (a2 a2 a1) x #xda3c2d784b69f01e)
|
||
|
(ftype-set! Cbits (a2 a3 a1) x #x123456789abcdef9)
|
||
|
(ftype-set! Cbits (a2 a3 a2) x -1)
|
||
|
(ftype-set! Cbits (a2 a4 a1) x 0)
|
||
|
(ftype-set! Cbits (a2 a4 a2) x (- (ash #xda3c2d784b69f01e -1) (expt 2 63)))
|
||
|
(ftype-set! Cbits (a2 a5 a1) x (- #x9abcdef9 (expt 2 32)))
|
||
|
(ftype-set! Cbits (a2 a5 a2) x #x5678)
|
||
|
(ftype-set! Cbits (a2 a5 a3) x #x34)
|
||
|
(ftype-set! Cbits (a2 a5 a4) x #x12)
|
||
|
(ftype-set! Cbits (a2 a5 a5) x #x-4)
|
||
|
(ftype-set! Cbits (a2 a6 a1) x #x1e)
|
||
|
(ftype-set! Cbits (a2 a6 a2) x #x-80)
|
||
|
(ftype-set! Cbits (a2 a6 a3) x #x5b4f)
|
||
|
(ftype-set! Cbits (a2 a6 a4) x (- #xD1E16BC2 (expt 2 32)))
|
||
|
(ftype-set! Cbits (a2 a6 a5) x #x-2)
|
||
|
(ftype-set! Cbits (a2 a7 a1) x #x9abcdef9)
|
||
|
(ftype-set! Cbits (a2 a7 a2) x #x5678)
|
||
|
(ftype-set! Cbits (a2 a7 a3) x #x34)
|
||
|
(ftype-set! Cbits (a2 a7 a4) x #x12)
|
||
|
(ftype-set! Cbits (a2 a7 a5) x #x4)
|
||
|
#t)
|
||
|
|
||
|
(eqv? (ftype-ref Cbits (a1 a1) x) #x923456789abcdef9)
|
||
|
(eqv? (ftype-ref Cbits (a1 a2) x) #xda3c2d784b69f01e)
|
||
|
(eqv? (ftype-ref Cbits (a1 a3) x) #x923456789abcdef9)
|
||
|
(eqv? (ftype-ref Cbits (a1 a4) x) #xda3c2d784b69f01e)
|
||
|
(eqv? (ftype-ref Cbits (a1 a5) x) #x923456789abcdef9)
|
||
|
(eqv? (ftype-ref Cbits (a1 a6) x) #xda3c2d784b69f01e)
|
||
|
(eqv? (ftype-ref Cbits (a1 a7) x) #x923456789abcdef9)
|
||
|
|
||
|
(begin
|
||
|
(fptr-free x)
|
||
|
#t)
|
||
|
|
||
|
; ----------------
|
||
|
(begin
|
||
|
(define-ftype Cbits
|
||
|
(endian big
|
||
|
(union
|
||
|
[a1 (struct
|
||
|
[a1 unsigned-64]
|
||
|
[a2 unsigned-64]
|
||
|
[a3 unsigned-64]
|
||
|
[a4 unsigned-64]
|
||
|
[a5 unsigned-64]
|
||
|
[a6 unsigned-64]
|
||
|
[a7 unsigned-64])]
|
||
|
[a2 (struct
|
||
|
[a1 (bits
|
||
|
[a1 signed 64])]
|
||
|
[a2 (bits
|
||
|
[a1 unsigned 64])]
|
||
|
[a3 (bits
|
||
|
[a1 unsigned 63]
|
||
|
[a2 signed 1])]
|
||
|
[a4 (bits
|
||
|
[a1 unsigned 1]
|
||
|
[a2 signed 63])]
|
||
|
[a5 (bits
|
||
|
[a1 signed 32]
|
||
|
[a2 unsigned 16]
|
||
|
[a3 signed 8]
|
||
|
[a4 unsigned 5]
|
||
|
[a5 signed 3])]
|
||
|
[a6 (bits
|
||
|
[a1 unsigned 5]
|
||
|
[a2 signed 8]
|
||
|
[a3 unsigned 16]
|
||
|
[a4 signed 32]
|
||
|
[a5 signed 3])]
|
||
|
[a7 (bits
|
||
|
[a1 unsigned 32]
|
||
|
[a2 signed 16]
|
||
|
[a3 unsigned 8]
|
||
|
[a4 signed 5]
|
||
|
[a5 unsigned 3])])])))
|
||
|
(define x (make-ftype-pointer Cbits (foreign-alloc (ftype-sizeof Cbits))))
|
||
|
#t)
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! Cbits (a1 a1) x #x923456789abcdef9)
|
||
|
(ftype-set! Cbits (a1 a2) x #xda3c2d784b69f01e)
|
||
|
(ftype-set! Cbits (a1 a3) x #x923456789abcdef9)
|
||
|
(ftype-set! Cbits (a1 a4) x #xda3c2d784b69f01e)
|
||
|
(ftype-set! Cbits (a1 a5) x #x923456789abcdefe)
|
||
|
(ftype-set! Cbits (a1 a6) x #xda3c2d784b69f01e)
|
||
|
(ftype-set! Cbits (a1 a7) x #x923456789abcdefe)
|
||
|
#t)
|
||
|
|
||
|
(eqv? (ftype-ref Cbits (a2 a1 a1) x) (- #x923456789abcdef9 (expt 2 64)))
|
||
|
(eqv? (ftype-ref Cbits (a2 a2 a1) x) #xda3c2d784b69f01e)
|
||
|
(eqv? (ftype-ref Cbits (a2 a3 a1) x) #x491A2B3C4D5E6F7C)
|
||
|
(eqv? (ftype-ref Cbits (a2 a3 a2) x) -1)
|
||
|
(eqv? (ftype-ref Cbits (a2 a4 a1) x) 1)
|
||
|
(eqv? (ftype-ref Cbits (a2 a4 a2) x) (- #x5A3C2D784B69F01E (expt 2 63)))
|
||
|
(eqv? (ftype-ref Cbits (a2 a5 a1) x) (- #x92345678 (expt 2 32)))
|
||
|
(eqv? (ftype-ref Cbits (a2 a5 a2) x) #x9abc)
|
||
|
(eqv? (ftype-ref Cbits (a2 a5 a3) x) (- #xde (expt 2 8)))
|
||
|
(eqv? (ftype-ref Cbits (a2 a5 a4) x) #x1f)
|
||
|
(eqv? (ftype-ref Cbits (a2 a5 a5) x) (- 6 (expt 2 3)))
|
||
|
(eqv? (ftype-ref Cbits (a2 a6 a1) x) #x1b)
|
||
|
(eqv? (ftype-ref Cbits (a2 a6 a2) x) #x47)
|
||
|
(eqv? (ftype-ref Cbits (a2 a6 a3) x) #x85af)
|
||
|
(eqv? (ftype-ref Cbits (a2 a6 a4) x) #x96d3e03)
|
||
|
(eqv? (ftype-ref Cbits (a2 a6 a5) x) (- #x6 (expt 2 3)))
|
||
|
(eqv? (ftype-ref Cbits (a2 a7 a1) x) #x92345678)
|
||
|
(eqv? (ftype-ref Cbits (a2 a7 a2) x) (- #x9abc (expt 2 16)))
|
||
|
(eqv? (ftype-ref Cbits (a2 a7 a3) x) #xde)
|
||
|
(eqv? (ftype-ref Cbits (a2 a7 a4) x) (- #x1f (expt 2 5)))
|
||
|
(eqv? (ftype-ref Cbits (a2 a7 a5) x) 6)
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! Cbits (a1 a1) x 0)
|
||
|
(ftype-set! Cbits (a1 a2) x 0)
|
||
|
(ftype-set! Cbits (a1 a3) x 0)
|
||
|
(ftype-set! Cbits (a1 a4) x 0)
|
||
|
(ftype-set! Cbits (a1 a5) x 0)
|
||
|
(ftype-set! Cbits (a1 a6) x 0)
|
||
|
(ftype-set! Cbits (a1 a7) x 0)
|
||
|
#t)
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! Cbits (a2 a1 a1) x (- #x923456789abcdef9 (expt 2 64)))
|
||
|
(ftype-set! Cbits (a2 a2 a1) x #xda3c2d784b69f01e)
|
||
|
(ftype-set! Cbits (a2 a3 a1) x #x491A2B3C4D5E6F7C)
|
||
|
(ftype-set! Cbits (a2 a3 a2) x -1)
|
||
|
(ftype-set! Cbits (a2 a4 a1) x 1)
|
||
|
(ftype-set! Cbits (a2 a4 a2) x (- #x5A3C2D784B69F01E (expt 2 63)))
|
||
|
(ftype-set! Cbits (a2 a5 a1) x (- #x92345678 (expt 2 32)))
|
||
|
(ftype-set! Cbits (a2 a5 a2) x #x9abc)
|
||
|
(ftype-set! Cbits (a2 a5 a3) x (- #xde (expt 2 8)))
|
||
|
(ftype-set! Cbits (a2 a5 a4) x #x1f)
|
||
|
(ftype-set! Cbits (a2 a5 a5) x (- 6 (expt 2 3)))
|
||
|
(ftype-set! Cbits (a2 a6 a1) x #x1b)
|
||
|
(ftype-set! Cbits (a2 a6 a2) x #x47)
|
||
|
(ftype-set! Cbits (a2 a6 a3) x #x85af)
|
||
|
(ftype-set! Cbits (a2 a6 a4) x #x96d3e03)
|
||
|
(ftype-set! Cbits (a2 a6 a5) x (- #x6 (expt 2 3)))
|
||
|
(ftype-set! Cbits (a2 a7 a1) x #x92345678)
|
||
|
(ftype-set! Cbits (a2 a7 a2) x (- #x9abc (expt 2 16)))
|
||
|
(ftype-set! Cbits (a2 a7 a3) x #xde)
|
||
|
(ftype-set! Cbits (a2 a7 a4) x (- #x1f (expt 2 5)))
|
||
|
(ftype-set! Cbits (a2 a7 a5) x 6)
|
||
|
#t)
|
||
|
|
||
|
(eqv? (ftype-ref Cbits (a1 a1) x) #x923456789abcdef9)
|
||
|
(eqv? (ftype-ref Cbits (a1 a2) x) #xda3c2d784b69f01e)
|
||
|
(eqv? (ftype-ref Cbits (a1 a3) x) #x923456789abcdef9)
|
||
|
(eqv? (ftype-ref Cbits (a1 a4) x) #xda3c2d784b69f01e)
|
||
|
(eqv? (ftype-ref Cbits (a1 a5) x) #x923456789abcdefe)
|
||
|
(eqv? (ftype-ref Cbits (a1 a6) x) #xda3c2d784b69f01e)
|
||
|
(eqv? (ftype-ref Cbits (a1 a7) x) #x923456789abcdefe)
|
||
|
|
||
|
(begin
|
||
|
(fptr-free x)
|
||
|
#t)
|
||
|
)
|
||
|
|
||
|
(mat ftype-odd-bits
|
||
|
(begin
|
||
|
(define-ftype Bbits
|
||
|
(endian little
|
||
|
(union
|
||
|
[a1 (struct
|
||
|
[a1 unsigned-24]
|
||
|
[a2 unsigned-40]
|
||
|
[a3 unsigned-56]
|
||
|
[a4 unsigned-48])]
|
||
|
[a2 (struct
|
||
|
[a1 (bits
|
||
|
[a1 signed 1]
|
||
|
[a2 signed 23])]
|
||
|
[a2 (bits
|
||
|
[a1 signed 3]
|
||
|
[a2 signed 37])]
|
||
|
[a3 (bits
|
||
|
[a1 signed 42]
|
||
|
[a2 signed 14])]
|
||
|
[a4 (bits
|
||
|
[a1 signed 19]
|
||
|
[a2 signed 29])])]
|
||
|
[a3 (struct
|
||
|
[a1 (bits
|
||
|
[a1 unsigned 1]
|
||
|
[a2 unsigned 23])]
|
||
|
[a2 (bits
|
||
|
[a1 unsigned 3]
|
||
|
[a2 unsigned 37])]
|
||
|
[a3 (bits
|
||
|
[a1 unsigned 42]
|
||
|
[a2 unsigned 14])]
|
||
|
[a4 (bits
|
||
|
[a1 unsigned 19]
|
||
|
[a2 unsigned 29])])])))
|
||
|
(define x (make-ftype-pointer Bbits (foreign-alloc (ftype-sizeof Bbits))))
|
||
|
(define unsigned-bit-field
|
||
|
(lambda (n start end)
|
||
|
(bitwise-bit-field n start end)))
|
||
|
(define signed-bit-field
|
||
|
(lambda (n start end)
|
||
|
(let ([n (bitwise-bit-field n start end)])
|
||
|
(if (fx= (bitwise-arithmetic-shift-right n (fx- end start 1)) 0)
|
||
|
n
|
||
|
(- n (bitwise-arithmetic-shift-left 1 (fx- end start)))))))
|
||
|
#t)
|
||
|
|
||
|
(error? ;; invalid value 113886 for bit field of size 1
|
||
|
(ftype-set! Bbits (a2 a1 a1) x #x1bcde))
|
||
|
|
||
|
(error? ;; invalid value #\a for bit field of size 3
|
||
|
(ftype-set! Bbits (a2 a2 a1) x #\a))
|
||
|
|
||
|
(error? ;; invalid value oops for bit field of size 14
|
||
|
(ftype-set! Bbits (a3 a3 a2) x 'oops))
|
||
|
|
||
|
(begin
|
||
|
(define A1 #xabcfde)
|
||
|
(define A2 #xde13752b)
|
||
|
(define A3 #xf93578d679e35b)
|
||
|
(define A4 #x7c18d679)
|
||
|
#t)
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! Bbits (a1 a1) x A1)
|
||
|
(ftype-set! Bbits (a1 a2) x A2)
|
||
|
(ftype-set! Bbits (a1 a3) x A3)
|
||
|
(ftype-set! Bbits (a1 a4) x A4)
|
||
|
#t)
|
||
|
|
||
|
(equal?
|
||
|
(list
|
||
|
(ftype-ref Bbits (a1 a1) x)
|
||
|
(ftype-ref Bbits (a1 a2) x)
|
||
|
(ftype-ref Bbits (a1 a3) x)
|
||
|
(ftype-ref Bbits (a1 a4) x))
|
||
|
(list A1 A2 A3 A4))
|
||
|
|
||
|
(eqv? (ftype-ref Bbits (a2 a1 a1) x) (signed-bit-field A1 0 1))
|
||
|
(eqv? (ftype-ref Bbits (a2 a1 a2) x) (signed-bit-field A1 1 24))
|
||
|
(eqv? (ftype-ref Bbits (a2 a2 a1) x) (signed-bit-field A2 0 3))
|
||
|
(eqv? (ftype-ref Bbits (a2 a2 a2) x) (signed-bit-field A2 3 40))
|
||
|
(eqv? (ftype-ref Bbits (a2 a3 a1) x) (signed-bit-field A3 0 42))
|
||
|
(eqv? (ftype-ref Bbits (a2 a3 a2) x) (signed-bit-field A3 42 56))
|
||
|
(eqv? (ftype-ref Bbits (a2 a4 a1) x) (signed-bit-field A4 0 19))
|
||
|
(eqv? (ftype-ref Bbits (a2 a4 a2) x) (signed-bit-field A4 19 48))
|
||
|
|
||
|
(eqv? (ftype-ref Bbits (a3 a1 a1) x) (unsigned-bit-field A1 0 1))
|
||
|
(eqv? (ftype-ref Bbits (a3 a1 a2) x) (unsigned-bit-field A1 1 24))
|
||
|
(eqv? (ftype-ref Bbits (a3 a2 a1) x) (unsigned-bit-field A2 0 3))
|
||
|
(eqv? (ftype-ref Bbits (a3 a2 a2) x) (unsigned-bit-field A2 3 40))
|
||
|
(eqv? (ftype-ref Bbits (a3 a3 a1) x) (unsigned-bit-field A3 0 42))
|
||
|
(eqv? (ftype-ref Bbits (a3 a3 a2) x) (unsigned-bit-field A3 42 56))
|
||
|
(eqv? (ftype-ref Bbits (a3 a4 a1) x) (unsigned-bit-field A4 0 19))
|
||
|
(eqv? (ftype-ref Bbits (a3 a4 a2) x) (unsigned-bit-field A4 19 48))
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! Bbits (a1 a1) x #x7c7c7c)
|
||
|
(ftype-set! Bbits (a1 a2) x #xa8a8a8a8a8)
|
||
|
(ftype-set! Bbits (a1 a3) x #x3b3b3b3b3b3b3b)
|
||
|
(ftype-set! Bbits (a1 a4) x #x919191919191)
|
||
|
#t)
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! Bbits (a2 a1 a1) x #x-1)
|
||
|
#t)
|
||
|
|
||
|
(eqv? (ftype-ref Bbits (a1 a1) x) #x7c7c7d)
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! Bbits (a2 a1 a1) x (signed-bit-field A1 0 1))
|
||
|
(ftype-set! Bbits (a2 a1 a2) x (signed-bit-field A1 1 24))
|
||
|
(ftype-set! Bbits (a2 a2 a1) x (signed-bit-field A2 0 3))
|
||
|
(ftype-set! Bbits (a2 a2 a2) x (signed-bit-field A2 3 40))
|
||
|
(ftype-set! Bbits (a2 a3 a1) x (signed-bit-field A3 0 42))
|
||
|
(ftype-set! Bbits (a2 a3 a2) x (signed-bit-field A3 42 56))
|
||
|
(ftype-set! Bbits (a2 a4 a1) x (signed-bit-field A4 0 19))
|
||
|
(ftype-set! Bbits (a2 a4 a2) x (signed-bit-field A4 19 48))
|
||
|
#t)
|
||
|
|
||
|
(eqv? (ftype-ref Bbits (a1 a1) x) A1)
|
||
|
(eqv? (ftype-ref Bbits (a1 a2) x) A2)
|
||
|
(eqv? (ftype-ref Bbits (a1 a3) x) A3)
|
||
|
(eqv? (ftype-ref Bbits (a1 a4) x) A4)
|
||
|
|
||
|
(eqv? (ftype-ref Bbits (a2 a1 a1) x) (signed-bit-field A1 0 1))
|
||
|
(eqv? (ftype-ref Bbits (a2 a1 a2) x) (signed-bit-field A1 1 24))
|
||
|
(eqv? (ftype-ref Bbits (a2 a2 a1) x) (signed-bit-field A2 0 3))
|
||
|
(eqv? (ftype-ref Bbits (a2 a2 a2) x) (signed-bit-field A2 3 40))
|
||
|
(eqv? (ftype-ref Bbits (a2 a3 a1) x) (signed-bit-field A3 0 42))
|
||
|
(eqv? (ftype-ref Bbits (a2 a3 a2) x) (signed-bit-field A3 42 56))
|
||
|
(eqv? (ftype-ref Bbits (a2 a4 a1) x) (signed-bit-field A4 0 19))
|
||
|
(eqv? (ftype-ref Bbits (a2 a4 a2) x) (signed-bit-field A4 19 48))
|
||
|
|
||
|
(eqv? (ftype-ref Bbits (a3 a1 a1) x) (unsigned-bit-field A1 0 1))
|
||
|
(eqv? (ftype-ref Bbits (a3 a1 a2) x) (unsigned-bit-field A1 1 24))
|
||
|
(eqv? (ftype-ref Bbits (a3 a2 a1) x) (unsigned-bit-field A2 0 3))
|
||
|
(eqv? (ftype-ref Bbits (a3 a2 a2) x) (unsigned-bit-field A2 3 40))
|
||
|
(eqv? (ftype-ref Bbits (a3 a3 a1) x) (unsigned-bit-field A3 0 42))
|
||
|
(eqv? (ftype-ref Bbits (a3 a3 a2) x) (unsigned-bit-field A3 42 56))
|
||
|
(eqv? (ftype-ref Bbits (a3 a4 a1) x) (unsigned-bit-field A4 0 19))
|
||
|
(eqv? (ftype-ref Bbits (a3 a4 a2) x) (unsigned-bit-field A4 19 48))
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! Bbits (a1 a1) x #x7c7c7c)
|
||
|
(ftype-set! Bbits (a1 a2) x #xa8a8a8a8a8)
|
||
|
(ftype-set! Bbits (a1 a3) x #x3b3b3b3b3b3b3b)
|
||
|
(ftype-set! Bbits (a1 a4) x #x919191919191)
|
||
|
#t)
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! Bbits (a3 a1 a1) x (unsigned-bit-field A1 0 1))
|
||
|
(ftype-set! Bbits (a3 a1 a2) x (unsigned-bit-field A1 1 24))
|
||
|
(ftype-set! Bbits (a3 a2 a1) x (unsigned-bit-field A2 0 3))
|
||
|
(ftype-set! Bbits (a3 a2 a2) x (unsigned-bit-field A2 3 40))
|
||
|
(ftype-set! Bbits (a3 a3 a1) x (unsigned-bit-field A3 0 42))
|
||
|
(ftype-set! Bbits (a3 a3 a2) x (unsigned-bit-field A3 42 56))
|
||
|
(ftype-set! Bbits (a3 a4 a1) x (unsigned-bit-field A4 0 19))
|
||
|
(ftype-set! Bbits (a3 a4 a2) x (unsigned-bit-field A4 19 48))
|
||
|
#t)
|
||
|
|
||
|
(eqv? (ftype-ref Bbits (a1 a1) x) A1)
|
||
|
(eqv? (ftype-ref Bbits (a1 a2) x) A2)
|
||
|
(eqv? (ftype-ref Bbits (a1 a3) x) A3)
|
||
|
(eqv? (ftype-ref Bbits (a1 a4) x) A4)
|
||
|
|
||
|
(eqv? (ftype-ref Bbits (a2 a1 a1) x) (signed-bit-field A1 0 1))
|
||
|
(eqv? (ftype-ref Bbits (a2 a1 a2) x) (signed-bit-field A1 1 24))
|
||
|
(eqv? (ftype-ref Bbits (a2 a2 a1) x) (signed-bit-field A2 0 3))
|
||
|
(eqv? (ftype-ref Bbits (a2 a2 a2) x) (signed-bit-field A2 3 40))
|
||
|
(eqv? (ftype-ref Bbits (a2 a3 a1) x) (signed-bit-field A3 0 42))
|
||
|
(eqv? (ftype-ref Bbits (a2 a3 a2) x) (signed-bit-field A3 42 56))
|
||
|
(eqv? (ftype-ref Bbits (a2 a4 a1) x) (signed-bit-field A4 0 19))
|
||
|
(eqv? (ftype-ref Bbits (a2 a4 a2) x) (signed-bit-field A4 19 48))
|
||
|
|
||
|
(eqv? (ftype-ref Bbits (a3 a1 a1) x) (unsigned-bit-field A1 0 1))
|
||
|
(eqv? (ftype-ref Bbits (a3 a1 a2) x) (unsigned-bit-field A1 1 24))
|
||
|
(eqv? (ftype-ref Bbits (a3 a2 a1) x) (unsigned-bit-field A2 0 3))
|
||
|
(eqv? (ftype-ref Bbits (a3 a2 a2) x) (unsigned-bit-field A2 3 40))
|
||
|
(eqv? (ftype-ref Bbits (a3 a3 a1) x) (unsigned-bit-field A3 0 42))
|
||
|
(eqv? (ftype-ref Bbits (a3 a3 a2) x) (unsigned-bit-field A3 42 56))
|
||
|
(eqv? (ftype-ref Bbits (a3 a4 a1) x) (unsigned-bit-field A4 0 19))
|
||
|
(eqv? (ftype-ref Bbits (a3 a4 a2) x) (unsigned-bit-field A4 19 48))
|
||
|
|
||
|
(begin
|
||
|
(fptr-free x)
|
||
|
#t)
|
||
|
|
||
|
; ----------------
|
||
|
(begin
|
||
|
(define-ftype Bbits
|
||
|
(endian big
|
||
|
(union
|
||
|
[a1 (struct
|
||
|
[a1 unsigned-24]
|
||
|
[a2 unsigned-40]
|
||
|
[a3 unsigned-56]
|
||
|
[a4 unsigned-48])]
|
||
|
[a2 (struct
|
||
|
[a1 (bits
|
||
|
[a1 signed 1]
|
||
|
[a2 signed 23])]
|
||
|
[a2 (bits
|
||
|
[a1 signed 3]
|
||
|
[a2 signed 37])]
|
||
|
[a3 (bits
|
||
|
[a1 signed 42]
|
||
|
[a2 signed 14])]
|
||
|
[a4 (bits
|
||
|
[a1 signed 19]
|
||
|
[a2 signed 29])])]
|
||
|
[a3 (struct
|
||
|
[a1 (bits
|
||
|
[a1 unsigned 1]
|
||
|
[a2 unsigned 23])]
|
||
|
[a2 (bits
|
||
|
[a1 unsigned 3]
|
||
|
[a2 unsigned 37])]
|
||
|
[a3 (bits
|
||
|
[a1 unsigned 42]
|
||
|
[a2 unsigned 14])]
|
||
|
[a4 (bits
|
||
|
[a1 unsigned 19]
|
||
|
[a2 unsigned 29])])])))
|
||
|
(define x (make-ftype-pointer Bbits (foreign-alloc (ftype-sizeof Bbits))))
|
||
|
(define unsigned-bit-field
|
||
|
(lambda (n start end)
|
||
|
(bitwise-bit-field n start end)))
|
||
|
(define signed-bit-field
|
||
|
(lambda (n start end)
|
||
|
(let ([n (bitwise-bit-field n start end)])
|
||
|
(if (fx= (bitwise-arithmetic-shift-right n (fx- end start 1)) 0)
|
||
|
n
|
||
|
(- n (bitwise-arithmetic-shift-left 1 (fx- end start)))))))
|
||
|
#t)
|
||
|
|
||
|
(error? ;; invalid value 113886 for bit field of size 1
|
||
|
(ftype-set! Bbits (a2 a1 a1) x #x1bcde))
|
||
|
|
||
|
(error? ;; invalid value #\a for bit field of size 3
|
||
|
(ftype-set! Bbits (a2 a2 a1) x #\a))
|
||
|
|
||
|
(error? ;; invalid value oops for bit field of size 14
|
||
|
(ftype-set! Bbits (a3 a3 a2) x 'oops))
|
||
|
|
||
|
(begin
|
||
|
(define A1 #xabcfde)
|
||
|
(define A2 #xde13752b)
|
||
|
(define A3 #xf93578d679e35b)
|
||
|
(define A4 #x7c18d679)
|
||
|
#t)
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! Bbits (a1 a1) x A1)
|
||
|
(ftype-set! Bbits (a1 a2) x A2)
|
||
|
(ftype-set! Bbits (a1 a3) x A3)
|
||
|
(ftype-set! Bbits (a1 a4) x A4)
|
||
|
#t)
|
||
|
|
||
|
(eqv? (ftype-ref Bbits (a1 a1) x) A1)
|
||
|
(eqv? (ftype-ref Bbits (a1 a2) x) A2)
|
||
|
(eqv? (ftype-ref Bbits (a1 a3) x) A3)
|
||
|
(eqv? (ftype-ref Bbits (a1 a4) x) A4)
|
||
|
|
||
|
(eqv? (ftype-ref Bbits (a2 a1 a1) x) (signed-bit-field A1 23 24))
|
||
|
(eqv? (ftype-ref Bbits (a2 a1 a2) x) (signed-bit-field A1 0 23))
|
||
|
(eqv? (ftype-ref Bbits (a2 a2 a1) x) (signed-bit-field A2 37 40))
|
||
|
(eqv? (ftype-ref Bbits (a2 a2 a2) x) (signed-bit-field A2 0 37))
|
||
|
(eqv? (ftype-ref Bbits (a2 a3 a1) x) (signed-bit-field A3 14 56))
|
||
|
(eqv? (ftype-ref Bbits (a2 a3 a2) x) (signed-bit-field A3 0 14))
|
||
|
(eqv? (ftype-ref Bbits (a2 a4 a1) x) (signed-bit-field A4 29 48))
|
||
|
(eqv? (ftype-ref Bbits (a2 a4 a2) x) (signed-bit-field A4 0 29))
|
||
|
|
||
|
(eqv? (ftype-ref Bbits (a3 a1 a1) x) (unsigned-bit-field A1 23 24))
|
||
|
(eqv? (ftype-ref Bbits (a3 a1 a2) x) (unsigned-bit-field A1 0 23))
|
||
|
(eqv? (ftype-ref Bbits (a3 a2 a1) x) (unsigned-bit-field A2 37 40))
|
||
|
(eqv? (ftype-ref Bbits (a3 a2 a2) x) (unsigned-bit-field A2 0 37))
|
||
|
(eqv? (ftype-ref Bbits (a3 a3 a1) x) (unsigned-bit-field A3 14 56))
|
||
|
(eqv? (ftype-ref Bbits (a3 a3 a2) x) (unsigned-bit-field A3 0 14))
|
||
|
(eqv? (ftype-ref Bbits (a3 a4 a1) x) (unsigned-bit-field A4 29 48))
|
||
|
(eqv? (ftype-ref Bbits (a3 a4 a2) x) (unsigned-bit-field A4 0 29))
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! Bbits (a1 a1) x #x7c7c7c)
|
||
|
(ftype-set! Bbits (a1 a2) x #xa8a8a8a8a8)
|
||
|
(ftype-set! Bbits (a1 a3) x #x3b3b3b3b3b3b3b)
|
||
|
(ftype-set! Bbits (a1 a4) x #x919191919191)
|
||
|
#t)
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! Bbits (a2 a1 a1) x #x-1)
|
||
|
#t)
|
||
|
|
||
|
(eqv? (ftype-ref Bbits (a1 a1) x) #xfc7c7c)
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! Bbits (a2 a1 a1) x (signed-bit-field A1 23 24))
|
||
|
(ftype-set! Bbits (a2 a1 a2) x (signed-bit-field A1 0 23))
|
||
|
(ftype-set! Bbits (a2 a2 a1) x (signed-bit-field A2 37 40))
|
||
|
(ftype-set! Bbits (a2 a2 a2) x (signed-bit-field A2 0 37))
|
||
|
(ftype-set! Bbits (a2 a3 a1) x (signed-bit-field A3 14 56))
|
||
|
(ftype-set! Bbits (a2 a3 a2) x (signed-bit-field A3 0 14))
|
||
|
(ftype-set! Bbits (a2 a4 a1) x (signed-bit-field A4 29 48))
|
||
|
(ftype-set! Bbits (a2 a4 a2) x (signed-bit-field A4 0 29))
|
||
|
#t)
|
||
|
|
||
|
(eqv? (ftype-ref Bbits (a1 a1) x) A1)
|
||
|
(eqv? (ftype-ref Bbits (a1 a2) x) A2)
|
||
|
(eqv? (ftype-ref Bbits (a1 a3) x) A3)
|
||
|
(eqv? (ftype-ref Bbits (a1 a4) x) A4)
|
||
|
|
||
|
(eqv? (ftype-ref Bbits (a2 a1 a1) x) (signed-bit-field A1 23 24))
|
||
|
(eqv? (ftype-ref Bbits (a2 a1 a2) x) (signed-bit-field A1 0 23))
|
||
|
(eqv? (ftype-ref Bbits (a2 a2 a1) x) (signed-bit-field A2 37 40))
|
||
|
(eqv? (ftype-ref Bbits (a2 a2 a2) x) (signed-bit-field A2 0 37))
|
||
|
(eqv? (ftype-ref Bbits (a2 a3 a1) x) (signed-bit-field A3 14 56))
|
||
|
(eqv? (ftype-ref Bbits (a2 a3 a2) x) (signed-bit-field A3 0 14))
|
||
|
(eqv? (ftype-ref Bbits (a2 a4 a1) x) (signed-bit-field A4 29 48))
|
||
|
(eqv? (ftype-ref Bbits (a2 a4 a2) x) (signed-bit-field A4 0 29))
|
||
|
|
||
|
(eqv? (ftype-ref Bbits (a3 a1 a1) x) (unsigned-bit-field A1 23 24))
|
||
|
(eqv? (ftype-ref Bbits (a3 a1 a2) x) (unsigned-bit-field A1 0 23))
|
||
|
(eqv? (ftype-ref Bbits (a3 a2 a1) x) (unsigned-bit-field A2 37 40))
|
||
|
(eqv? (ftype-ref Bbits (a3 a2 a2) x) (unsigned-bit-field A2 0 37))
|
||
|
(eqv? (ftype-ref Bbits (a3 a3 a1) x) (unsigned-bit-field A3 14 56))
|
||
|
(eqv? (ftype-ref Bbits (a3 a3 a2) x) (unsigned-bit-field A3 0 14))
|
||
|
(eqv? (ftype-ref Bbits (a3 a4 a1) x) (unsigned-bit-field A4 29 48))
|
||
|
(eqv? (ftype-ref Bbits (a3 a4 a2) x) (unsigned-bit-field A4 0 29))
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! Bbits (a1 a1) x #x7c7c7c)
|
||
|
(ftype-set! Bbits (a1 a2) x #xa8a8a8a8a8)
|
||
|
(ftype-set! Bbits (a1 a3) x #x3b3b3b3b3b3b3b)
|
||
|
(ftype-set! Bbits (a1 a4) x #x919191919191)
|
||
|
#t)
|
||
|
|
||
|
(begin
|
||
|
(ftype-set! Bbits (a3 a1 a1) x (unsigned-bit-field A1 23 24))
|
||
|
(ftype-set! Bbits (a3 a1 a2) x (unsigned-bit-field A1 0 23))
|
||
|
(ftype-set! Bbits (a3 a2 a1) x (unsigned-bit-field A2 37 40))
|
||
|
(ftype-set! Bbits (a3 a2 a2) x (unsigned-bit-field A2 0 37))
|
||
|
(ftype-set! Bbits (a3 a3 a1) x (unsigned-bit-field A3 14 56))
|
||
|
(ftype-set! Bbits (a3 a3 a2) x (unsigned-bit-field A3 0 14))
|
||
|
(ftype-set! Bbits (a3 a4 a1) x (unsigned-bit-field A4 29 48))
|
||
|
(ftype-set! Bbits (a3 a4 a2) x (unsigned-bit-field A4 0 29))
|
||
|
#t)
|
||
|
|
||
|
(eqv? (ftype-ref Bbits (a1 a1) x) A1)
|
||
|
(eqv? (ftype-ref Bbits (a1 a2) x) A2)
|
||
|
(eqv? (ftype-ref Bbits (a1 a3) x) A3)
|
||
|
(eqv? (ftype-ref Bbits (a1 a4) x) A4)
|
||
|
|
||
|
(eqv? (ftype-ref Bbits (a2 a1 a1) x) (signed-bit-field A1 23 24))
|
||
|
(eqv? (ftype-ref Bbits (a2 a1 a2) x) (signed-bit-field A1 0 23))
|
||
|
(eqv? (ftype-ref Bbits (a2 a2 a1) x) (signed-bit-field A2 37 40))
|
||
|
(eqv? (ftype-ref Bbits (a2 a2 a2) x) (signed-bit-field A2 0 37))
|
||
|
(eqv? (ftype-ref Bbits (a2 a3 a1) x) (signed-bit-field A3 14 56))
|
||
|
(eqv? (ftype-ref Bbits (a2 a3 a2) x) (signed-bit-field A3 0 14))
|
||
|
(eqv? (ftype-ref Bbits (a2 a4 a1) x) (signed-bit-field A4 29 48))
|
||
|
(eqv? (ftype-ref Bbits (a2 a4 a2) x) (signed-bit-field A4 0 29))
|
||
|
|
||
|
(eqv? (ftype-ref Bbits (a3 a1 a1) x) (unsigned-bit-field A1 23 24))
|
||
|
(eqv? (ftype-ref Bbits (a3 a1 a2) x) (unsigned-bit-field A1 0 23))
|
||
|
(eqv? (ftype-ref Bbits (a3 a2 a1) x) (unsigned-bit-field A2 37 40))
|
||
|
(eqv? (ftype-ref Bbits (a3 a2 a2) x) (unsigned-bit-field A2 0 37))
|
||
|
(eqv? (ftype-ref Bbits (a3 a3 a1) x) (unsigned-bit-field A3 14 56))
|
||
|
(eqv? (ftype-ref Bbits (a3 a3 a2) x) (unsigned-bit-field A3 0 14))
|
||
|
(eqv? (ftype-ref Bbits (a3 a4 a1) x) (unsigned-bit-field A4 29 48))
|
||
|
(eqv? (ftype-ref Bbits (a3 a4 a2) x) (unsigned-bit-field A4 0 29))
|
||
|
|
||
|
(begin
|
||
|
(fptr-free x)
|
||
|
#t)
|
||
|
|
||
|
)
|
||
|
|
||
|
(mat ftype-endian
|
||
|
(equal?
|
||
|
(let ()
|
||
|
(define-ftype A (endian native double))
|
||
|
(define a (make-ftype-pointer A (foreign-alloc (ftype-sizeof A))))
|
||
|
(free-after a
|
||
|
(ftype-set! A () a 3.5)
|
||
|
(ftype-ref A () a)))
|
||
|
3.5)
|
||
|
(equal?
|
||
|
(let ()
|
||
|
(define-ftype A (endian big double))
|
||
|
(define a (make-ftype-pointer A (foreign-alloc (ftype-sizeof A))))
|
||
|
(free-after a
|
||
|
(ftype-set! A () a 3.5)
|
||
|
(ftype-ref A () a)))
|
||
|
3.5)
|
||
|
(equal?
|
||
|
(let ()
|
||
|
(define-ftype A (endian little double))
|
||
|
(define a (make-ftype-pointer A (foreign-alloc (ftype-sizeof A))))
|
||
|
(free-after a
|
||
|
(ftype-set! A () a 3.5)
|
||
|
(ftype-ref A () a)))
|
||
|
3.5)
|
||
|
(equal?
|
||
|
(let ()
|
||
|
(define-ftype A
|
||
|
(endian big
|
||
|
(struct
|
||
|
[a1 double]
|
||
|
[a2 float]
|
||
|
[a3 long-long]
|
||
|
[a4 unsigned-long-long]
|
||
|
[a5 long]
|
||
|
[a6 unsigned-long]
|
||
|
[a7 int]
|
||
|
[a8 unsigned]
|
||
|
[a9 unsigned-int]
|
||
|
[a10 short]
|
||
|
[a11 unsigned-short]
|
||
|
[a12 wchar]
|
||
|
[a13 char]
|
||
|
[a14 boolean]
|
||
|
[a15 fixnum]
|
||
|
[a16 iptr]
|
||
|
[a17 uptr]
|
||
|
[a18 void*])))
|
||
|
(define a (make-ftype-pointer A (foreign-alloc (ftype-sizeof A))))
|
||
|
(free-after a
|
||
|
(ftype-set! A (a1) a 3.5)
|
||
|
(ftype-set! A (a2) a -4.5)
|
||
|
(ftype-set! A (a3) a -30000)
|
||
|
(ftype-set! A (a4) a #xabcdef02)
|
||
|
(ftype-set! A (a5) a -30001)
|
||
|
(ftype-set! A (a6) a #xabcdef03)
|
||
|
(ftype-set! A (a7) a -30002)
|
||
|
(ftype-set! A (a8) a #xabcdef04)
|
||
|
(ftype-set! A (a9) a #xabcdef05)
|
||
|
(ftype-set! A (a10) a -30003)
|
||
|
(ftype-set! A (a11) a #xab06)
|
||
|
(ftype-set! A (a12) a #\a)
|
||
|
(ftype-set! A (a13) a #\b)
|
||
|
(ftype-set! A (a14) a 'hello)
|
||
|
(ftype-set! A (a15) a (most-positive-fixnum))
|
||
|
(ftype-set! A (a16) a -30004)
|
||
|
(ftype-set! A (a17) a #xabcdef07)
|
||
|
(ftype-set! A (a18) a 25000)
|
||
|
(list
|
||
|
(ftype-ref A (a1) a)
|
||
|
(ftype-ref A (a2) a)
|
||
|
(ftype-ref A (a3) a)
|
||
|
(ftype-ref A (a4) a)
|
||
|
(ftype-ref A (a5) a)
|
||
|
(ftype-ref A (a6) a)
|
||
|
(ftype-ref A (a7) a)
|
||
|
(ftype-ref A (a8) a)
|
||
|
(ftype-ref A (a9) a)
|
||
|
(ftype-ref A (a10) a)
|
||
|
(ftype-ref A (a11) a)
|
||
|
(ftype-ref A (a12) a)
|
||
|
(ftype-ref A (a13) a)
|
||
|
(ftype-ref A (a14) a)
|
||
|
(ftype-ref A (a15) a)
|
||
|
(ftype-ref A (a16) a)
|
||
|
(ftype-ref A (a17) a)
|
||
|
(ftype-ref A (a18) a))))
|
||
|
`(3.5
|
||
|
-4.5
|
||
|
-30000
|
||
|
#xabcdef02
|
||
|
-30001
|
||
|
#xabcdef03
|
||
|
-30002
|
||
|
#xabcdef04
|
||
|
#xabcdef05
|
||
|
-30003
|
||
|
#xab06
|
||
|
#\a
|
||
|
#\b
|
||
|
#t
|
||
|
,(most-positive-fixnum)
|
||
|
-30004
|
||
|
#xabcdef07
|
||
|
25000))
|
||
|
(equal?
|
||
|
(let ()
|
||
|
(define-ftype A
|
||
|
(endian little
|
||
|
(struct
|
||
|
[a1 double]
|
||
|
[a2 float]
|
||
|
[a3 long-long]
|
||
|
[a4 unsigned-long-long]
|
||
|
[a5 long]
|
||
|
[a6 unsigned-long]
|
||
|
[a7 int]
|
||
|
[a8 unsigned]
|
||
|
[a9 unsigned-int]
|
||
|
[a10 short]
|
||
|
[a11 unsigned-short]
|
||
|
[a12 wchar]
|
||
|
[a13 char]
|
||
|
[a14 boolean]
|
||
|
[a15 fixnum]
|
||
|
[a16 iptr]
|
||
|
[a17 uptr]
|
||
|
[a18 void*])))
|
||
|
(define a (make-ftype-pointer A (foreign-alloc (ftype-sizeof A))))
|
||
|
(free-after a
|
||
|
(ftype-set! A (a1) a 3.5)
|
||
|
(ftype-set! A (a2) a -4.5)
|
||
|
(ftype-set! A (a3) a -30000)
|
||
|
(ftype-set! A (a4) a #xabcdef02)
|
||
|
(ftype-set! A (a5) a -30001)
|
||
|
(ftype-set! A (a6) a #xabcdef03)
|
||
|
(ftype-set! A (a7) a -30002)
|
||
|
(ftype-set! A (a8) a #xabcdef04)
|
||
|
(ftype-set! A (a9) a #xabcdef05)
|
||
|
(ftype-set! A (a10) a -30003)
|
||
|
(ftype-set! A (a11) a #xab06)
|
||
|
(ftype-set! A (a12) a #\a)
|
||
|
(ftype-set! A (a13) a #\b)
|
||
|
(ftype-set! A (a14) a 'hello)
|
||
|
(ftype-set! A (a15) a (most-positive-fixnum))
|
||
|
(ftype-set! A (a16) a -30004)
|
||
|
(ftype-set! A (a17) a #xabcdef07)
|
||
|
(ftype-set! A (a18) a 25000)
|
||
|
(list
|
||
|
(ftype-ref A (a1) a)
|
||
|
(ftype-ref A (a2) a)
|
||
|
(ftype-ref A (a3) a)
|
||
|
(ftype-ref A (a4) a)
|
||
|
(ftype-ref A (a5) a)
|
||
|
(ftype-ref A (a6) a)
|
||
|
(ftype-ref A (a7) a)
|
||
|
(ftype-ref A (a8) a)
|
||
|
(ftype-ref A (a9) a)
|
||
|
(ftype-ref A (a10) a)
|
||
|
(ftype-ref A (a11) a)
|
||
|
(ftype-ref A (a12) a)
|
||
|
(ftype-ref A (a13) a)
|
||
|
(ftype-ref A (a14) a)
|
||
|
(ftype-ref A (a15) a)
|
||
|
(ftype-ref A (a16) a)
|
||
|
(ftype-ref A (a17) a)
|
||
|
(ftype-ref A (a18) a))))
|
||
|
`(3.5
|
||
|
-4.5
|
||
|
-30000
|
||
|
#xabcdef02
|
||
|
-30001
|
||
|
#xabcdef03
|
||
|
-30002
|
||
|
#xabcdef04
|
||
|
#xabcdef05
|
||
|
-30003
|
||
|
#xab06
|
||
|
#\a
|
||
|
#\b
|
||
|
#t
|
||
|
,(most-positive-fixnum)
|
||
|
-30004
|
||
|
#xabcdef07
|
||
|
25000))
|
||
|
(equal?
|
||
|
(let ()
|
||
|
(define-ftype A
|
||
|
(endian native
|
||
|
(struct
|
||
|
[a1 double]
|
||
|
[a2 float]
|
||
|
[a3 long-long]
|
||
|
[a4 unsigned-long-long]
|
||
|
[a5 long]
|
||
|
[a6 unsigned-long]
|
||
|
[a7 int]
|
||
|
[a8 unsigned]
|
||
|
[a9 unsigned-int]
|
||
|
[a10 short]
|
||
|
[a11 unsigned-short]
|
||
|
[a12 wchar]
|
||
|
[a13 char]
|
||
|
[a14 boolean]
|
||
|
[a15 fixnum]
|
||
|
[a16 iptr]
|
||
|
[a17 uptr]
|
||
|
[a18 void*])))
|
||
|
(define a (make-ftype-pointer A (foreign-alloc (ftype-sizeof A))))
|
||
|
(free-after a
|
||
|
(ftype-set! A (a1) a 3.5)
|
||
|
(ftype-set! A (a2) a -4.5)
|
||
|
(ftype-set! A (a3) a -30000)
|
||
|
(ftype-set! A (a4) a #xabcdef02)
|
||
|
(ftype-set! A (a5) a -30001)
|
||
|
(ftype-set! A (a6) a #xabcdef03)
|
||
|
(ftype-set! A (a7) a -30002)
|
||
|
(ftype-set! A (a8) a #xabcdef04)
|
||
|
(ftype-set! A (a9) a #xabcdef05)
|
||
|
(ftype-set! A (a10) a -30003)
|
||
|
(ftype-set! A (a11) a #xab06)
|
||
|
(ftype-set! A (a12) a #\a)
|
||
|
(ftype-set! A (a13) a #\b)
|
||
|
(ftype-set! A (a14) a 'hello)
|
||
|
(ftype-set! A (a15) a (most-positive-fixnum))
|
||
|
(ftype-set! A (a16) a -30004)
|
||
|
(ftype-set! A (a17) a #xabcdef07)
|
||
|
(ftype-set! A (a18) a 25000)
|
||
|
(list
|
||
|
(ftype-ref A (a1) a)
|
||
|
(ftype-ref A (a2) a)
|
||
|
(ftype-ref A (a3) a)
|
||
|
(ftype-ref A (a4) a)
|
||
|
(ftype-ref A (a5) a)
|
||
|
(ftype-ref A (a6) a)
|
||
|
(ftype-ref A (a7) a)
|
||
|
(ftype-ref A (a8) a)
|
||
|
(ftype-ref A (a9) a)
|
||
|
(ftype-ref A (a10) a)
|
||
|
(ftype-ref A (a11) a)
|
||
|
(ftype-ref A (a12) a)
|
||
|
(ftype-ref A (a13) a)
|
||
|
(ftype-ref A (a14) a)
|
||
|
(ftype-ref A (a15) a)
|
||
|
(ftype-ref A (a16) a)
|
||
|
(ftype-ref A (a17) a)
|
||
|
(ftype-ref A (a18) a))))
|
||
|
`(3.5
|
||
|
-4.5
|
||
|
-30000
|
||
|
#xabcdef02
|
||
|
-30001
|
||
|
#xabcdef03
|
||
|
-30002
|
||
|
#xabcdef04
|
||
|
#xabcdef05
|
||
|
-30003
|
||
|
#xab06
|
||
|
#\a
|
||
|
#\b
|
||
|
#t
|
||
|
,(most-positive-fixnum)
|
||
|
-30004
|
||
|
#xabcdef07
|
||
|
25000))
|
||
|
|
||
|
; ----------------
|
||
|
(begin
|
||
|
(define-ftype Aendian
|
||
|
(union
|
||
|
[a1 (endian native
|
||
|
(struct
|
||
|
[a1 integer-64]
|
||
|
[a2 integer-32]
|
||
|
[a3 integer-16]))]
|
||
|
[a2 (endian big
|
||
|
(struct
|
||
|
[a1 integer-64]
|
||
|
[a2 integer-32]
|
||
|
[a3 integer-16]))]
|
||
|
[a3 (endian little
|
||
|
(struct
|
||
|
[a1 integer-64]
|
||
|
[a2 integer-32]
|
||
|
[a3 integer-16]))]))
|
||
|
(define x (make-ftype-pointer Aendian (foreign-alloc (ftype-sizeof Aendian))))
|
||
|
(define xcheck
|
||
|
(lambda (x1 x2 x3)
|
||
|
(define iswap
|
||
|
(lambda (k n)
|
||
|
(let ([n (if (< n 0) (+ (expt 2 k) n) n)])
|
||
|
(do ([i 0 (fx+ i 8)]
|
||
|
[m 0 (logor (ash m 8) (bitwise-bit-field n i (+ i 8)))])
|
||
|
((fx= i k) (if (>= m (expt 2 (- k 1))) (- m (expt 2 k)) m))))))
|
||
|
(define okay?
|
||
|
(let ([s1 (iswap 64 x1)] [s2 (iswap 32 x2)] [s3 (iswap 16 x3)])
|
||
|
(lambda (eness)
|
||
|
(and
|
||
|
(equal? (ftype-ref Aendian (a1 a1) x)
|
||
|
(if (eq? eness (native-endianness)) x1 s1))
|
||
|
(equal? (ftype-ref Aendian (a1 a2) x)
|
||
|
(if (eq? eness (native-endianness)) x2 s2))
|
||
|
(equal? (ftype-ref Aendian (a1 a3) x)
|
||
|
(if (eq? eness (native-endianness)) x3 s3))
|
||
|
(equal? (ftype-ref Aendian (a2 a1) x)
|
||
|
(if (eq? eness 'big) x1 s1))
|
||
|
(equal? (ftype-ref Aendian (a2 a2) x)
|
||
|
(if (eq? eness 'big) x2 s2))
|
||
|
(equal? (ftype-ref Aendian (a2 a3) x)
|
||
|
(if (eq? eness 'big) x3 s3))
|
||
|
(equal? (ftype-ref Aendian (a3 a1) x)
|
||
|
(if (eq? eness 'little) x1 s1))
|
||
|
(equal? (ftype-ref Aendian (a3 a2) x)
|
||
|
(if (eq? eness 'little) x2 s2))
|
||
|
(equal? (ftype-ref Aendian (a3 a3) x)
|
||
|
(if (eq? eness 'little) x3 s3))))))
|
||
|
(and
|
||
|
(begin
|
||
|
(ftype-set! Aendian (a1 a1) x x1)
|
||
|
(ftype-set! Aendian (a1 a2) x x2)
|
||
|
(ftype-set! Aendian (a1 a3) x x3)
|
||
|
(okay? (native-endianness)))
|
||
|
(begin
|
||
|
(ftype-set! Aendian (a2 a1) x x1)
|
||
|
(ftype-set! Aendian (a2 a2) x x2)
|
||
|
(ftype-set! Aendian (a2 a3) x x3)
|
||
|
(okay? 'big))
|
||
|
(begin
|
||
|
(ftype-set! Aendian (a3 a1) x x1)
|
||
|
(ftype-set! Aendian (a3 a2) x x2)
|
||
|
(ftype-set! Aendian (a3 a3) x x3)
|
||
|
(okay? 'little)))))
|
||
|
#t)
|
||
|
|
||
|
(xcheck 0 0 0)
|
||
|
(xcheck -1 -1 -1)
|
||
|
(xcheck 15 25 35)
|
||
|
(xcheck -15 -25 -35)
|
||
|
(xcheck #x123456780fedcba9 #x4ca97531 #x3efa)
|
||
|
(xcheck #x-123456780fedcba9 #x-4ca97531 #x-3efa)
|
||
|
|
||
|
(begin
|
||
|
(fptr-free x)
|
||
|
#t)
|
||
|
|
||
|
; ----------------
|
||
|
(begin
|
||
|
(define-ftype Bendian
|
||
|
(union
|
||
|
[a1 (endian native
|
||
|
(struct
|
||
|
[a1 unsigned-64]
|
||
|
[a2 unsigned-32]
|
||
|
[a3 unsigned-16]))]
|
||
|
[a2 (endian big
|
||
|
(struct
|
||
|
[a1 unsigned-64]
|
||
|
[a2 unsigned-32]
|
||
|
[a3 unsigned-16]))]
|
||
|
[a3 (endian little
|
||
|
(struct
|
||
|
[a1 unsigned-64]
|
||
|
[a2 unsigned-32]
|
||
|
[a3 unsigned-16]))]))
|
||
|
(define x (make-ftype-pointer Bendian (foreign-alloc (ftype-sizeof Bendian))))
|
||
|
(define xcheck
|
||
|
(lambda (x1 x2 x3)
|
||
|
(define uswap
|
||
|
(lambda (k n)
|
||
|
(do ([i 0 (fx+ i 8)]
|
||
|
[m 0 (logor (ash m 8) (bitwise-bit-field n i (+ i 8)))])
|
||
|
((fx= i k) m))))
|
||
|
(define okay?
|
||
|
(let ([s1 (uswap 64 x1)] [s2 (uswap 32 x2)] [s3 (uswap 16 x3)])
|
||
|
(lambda (eness)
|
||
|
(and
|
||
|
(equal? (ftype-ref Bendian (a1 a1) x)
|
||
|
(if (eq? eness (native-endianness)) x1 s1))
|
||
|
(equal? (ftype-ref Bendian (a1 a2) x)
|
||
|
(if (eq? eness (native-endianness)) x2 s2))
|
||
|
(equal? (ftype-ref Bendian (a1 a3) x)
|
||
|
(if (eq? eness (native-endianness)) x3 s3))
|
||
|
(equal? (ftype-ref Bendian (a2 a1) x)
|
||
|
(if (eq? eness 'big) x1 s1))
|
||
|
(equal? (ftype-ref Bendian (a2 a2) x)
|
||
|
(if (eq? eness 'big) x2 s2))
|
||
|
(equal? (ftype-ref Bendian (a2 a3) x)
|
||
|
(if (eq? eness 'big) x3 s3))
|
||
|
(equal? (ftype-ref Bendian (a3 a1) x)
|
||
|
(if (eq? eness 'little) x1 s1))
|
||
|
(equal? (ftype-ref Bendian (a3 a2) x)
|
||
|
(if (eq? eness 'little) x2 s2))
|
||
|
(equal? (ftype-ref Bendian (a3 a3) x)
|
||
|
(if (eq? eness 'little) x3 s3))))))
|
||
|
(and
|
||
|
(begin
|
||
|
(ftype-set! Bendian (a1 a1) x x1)
|
||
|
(ftype-set! Bendian (a1 a2) x x2)
|
||
|
(ftype-set! Bendian (a1 a3) x x3)
|
||
|
(okay? (native-endianness)))
|
||
|
(begin
|
||
|
(ftype-set! Bendian (a2 a1) x x1)
|
||
|
(ftype-set! Bendian (a2 a2) x x2)
|
||
|
(ftype-set! Bendian (a2 a3) x x3)
|
||
|
(okay? 'big))
|
||
|
(begin
|
||
|
(ftype-set! Bendian (a3 a1) x x1)
|
||
|
(ftype-set! Bendian (a3 a2) x x2)
|
||
|
(ftype-set! Bendian (a3 a3) x x3)
|
||
|
(okay? 'little)))))
|
||
|
#t)
|
||
|
|
||
|
(xcheck 0 0 0)
|
||
|
(xcheck #xffffffffffffffff #xffffffff #xffff)
|
||
|
(xcheck #x8000000000000015 #x80000025 #x8035)
|
||
|
(xcheck #x123456780fedcba9 #x4ca97531 #x3efa)
|
||
|
(xcheck #xf23456780fedcba9 #xdca97531 #x9efa)
|
||
|
|
||
|
(begin
|
||
|
(fptr-free x)
|
||
|
#t)
|
||
|
|
||
|
; ----------------
|
||
|
(begin
|
||
|
(define-ftype Abits
|
||
|
(endian little
|
||
|
(union
|
||
|
[a1 (struct
|
||
|
[a1 unsigned-32]
|
||
|
[a2 unsigned-32]
|
||
|
[a3 unsigned-32]
|
||
|
[a4 unsigned-32]
|
||
|
[a5 unsigned-32]
|
||
|
[a6 unsigned-32]
|
||
|
[a7 unsigned-32]
|
||
|
[a8 unsigned-32]
|
||
|
[a9 unsigned-32]
|
||
|
[a10 unsigned-32]
|
||
|
[a11 unsigned-32]
|
||
|
[a12 unsigned-32]
|
||
|
[a13 unsigned-32]
|
||
|
[a14 unsigned-32]
|
||
|
[a15 unsigned-32]
|
||
|
[a16 unsigned-32]
|
||
|
[a17 unsigned-32]
|
||
|
[a18 unsigned-32]
|
||
|
[a19 unsigned-32]
|
||
|
[a20 unsigned-32]
|
||
|
[a21 unsigned-32])]
|
||
|
[a2 (struct
|
||
|
[a1 (bits
|
||
|
[_ signed 4]
|
||
|
[a1 signed 1]
|
||
|
[a2 signed 2]
|
||
|
[a3 signed 3]
|
||
|
[a4 signed 4]
|
||
|
[a5 signed 5]
|
||
|
[a6 signed 6]
|
||
|
[a7 signed 7])]
|
||
|
[a2 (bits
|
||
|
[_ signed 5]
|
||
|
[a8 signed 8]
|
||
|
[a9 signed 9]
|
||
|
[a10 signed 10])]
|
||
|
[a3 (bits
|
||
|
[a11 signed 11]
|
||
|
[a12 signed 12]
|
||
|
[_ signed 9])]
|
||
|
[a4 (bits
|
||
|
[a13 signed 13]
|
||
|
[_ signed 5]
|
||
|
[a14 signed 14])]
|
||
|
[a5 (bits
|
||
|
[_ signed 1]
|
||
|
[a15 signed 15]
|
||
|
[a16 signed 16])]
|
||
|
[a6 (bits [a17 signed 17] [_ signed 15])]
|
||
|
[a7 (bits [_ signed 14] [a18 signed 18])]
|
||
|
[a8 (bits [a19 signed 19] [_ signed 13])]
|
||
|
[a9 (bits [_ signed 12] [a20 signed 20])]
|
||
|
[a10 (bits [a21 signed 21] [_ signed 11])]
|
||
|
[a11 (bits [_ signed 10] [a22 signed 22])]
|
||
|
[a12 (bits [a23 signed 23] [_ signed 9])]
|
||
|
[a13 (bits [_ signed 8] [a24 signed 24])]
|
||
|
[a14 (bits [a25 signed 25] [_ signed 7])]
|
||
|
[a15 (bits [_ signed 6] [a26 signed 26])]
|
||
|
[a16 (bits [a27 signed 27] [_ signed 5])]
|
||
|
[a17 (bits [_ signed 4] [a28 signed 28])]
|
||
|
[a18 (bits [a29 signed 29] [_ signed 3])]
|
||
|
[a19 (bits [_ signed 2] [a30 signed 30])]
|
||
|
[a20 (bits [a31 signed 31] [_ signed 1])]
|
||
|
[a21 (bits [a32 signed 32])])]
|
||
|
[a3 (struct
|
||
|
[a1 (bits
|
||
|
[_ unsigned 4]
|
||
|
[a1 unsigned 1]
|
||
|
[a2 unsigned 2]
|
||
|
[a3 unsigned 3]
|
||
|
[a4 unsigned 4]
|
||
|
[a5 unsigned 5]
|
||
|
[a6 unsigned 6]
|
||
|
[a7 unsigned 7])]
|
||
|
[a2 (bits
|
||
|
[_ unsigned 5]
|
||
|
[a8 unsigned 8]
|
||
|
[a9 unsigned 9]
|
||
|
[a10 unsigned 10])]
|
||
|
[a3 (bits
|
||
|
[a11 unsigned 11]
|
||
|
[a12 unsigned 12]
|
||
|
[_ unsigned 9])]
|
||
|
[a4 (bits
|
||
|
[a13 unsigned 13]
|
||
|
[_ unsigned 5]
|
||
|
[a14 unsigned 14])]
|
||
|
[a5 (bits
|
||
|
[_ unsigned 1]
|
||
|
[a15 unsigned 15]
|
||
|
[a16 unsigned 16])]
|
||
|
[a6 (bits [a17 unsigned 17] [_ unsigned 15])]
|
||
|
[a7 (bits [_ unsigned 14] [a18 unsigned 18])]
|
||
|
[a8 (bits [a19 unsigned 19] [_ unsigned 13])]
|
||
|
[a9 (bits [_ unsigned 12] [a20 unsigned 20])]
|
||
|
[a10 (bits [a21 unsigned 21] [_ unsigned 11])]
|
||
|
[a11 (bits [_ unsigned 10] [a22 unsigned 22])]
|
||
|
[a12 (bits [a23 unsigned 23] [_ unsigned 9])]
|
||
|
[a13 (bits [_ unsigned 8] [a24 unsigned 24])]
|
||
|
[a14 (bits [a25 unsigned 25] [_ unsigned 7])]
|
||
|
[a15 (bits [_ unsigned 6] [a26 unsigned 26])]
|
||
|
[a16 (bits [a27 unsigned 27] [_ unsigned 5])]
|
||
|
[a17 (bits [_ unsigned 4] [a28 unsigned 28])]
|
||
|
[a18 (bits [a29 unsigned 29] [_ unsigned 3])]
|
||
|
[a19 (bits [_ unsigned 2] [a30 unsigned 30])]
|
||
|
[a20 (bits [a31 unsigned 31] [_ unsigned 1])]
|
||
|
[a21 (bits [a32 unsigned 32])])])))
|
||
|
(define x (make-ftype-pointer Abits (foreign-alloc (ftype-sizeof Abits))))
|
||
|
(define (get-a1)
|
||
|
(list
|
||
|
(ftype-ref Abits (a1 a1) x)
|
||
|
(ftype-ref Abits (a1 a2) x)
|
||
|
(ftype-ref Abits (a1 a3) x)
|
||
|
(ftype-ref Abits (a1 a4) x)
|
||
|
(ftype-ref Abits (a1 a5) x)
|
||
|
(ftype-ref Abits (a1 a6) x)
|
||
|
(ftype-ref Abits (a1 a7) x)
|
||
|
(ftype-ref Abits (a1 a8) x)
|
||
|
(ftype-ref Abits (a1 a9) x)
|
||
|
(ftype-ref Abits (a1 a10) x)
|
||
|
(ftype-ref Abits (a1 a11) x)
|
||
|
(ftype-ref Abits (a1 a12) x)
|
||
|
(ftype-ref Abits (a1 a13) x)
|
||
|
(ftype-ref Abits (a1 a14) x)
|
||
|
(ftype-ref Abits (a1 a15) x)
|
||
|
(ftype-ref Abits (a1 a16) x)
|
||
|
(ftype-ref Abits (a1 a17) x)
|
||
|
(ftype-ref Abits (a1 a18) x)
|
||
|
(ftype-ref Abits (a1 a19) x)
|
||
|
(ftype-ref Abits (a1 a20) x)
|
||
|
(ftype-ref Abits (a1 a21) x)))
|
||
|
(define (get-a2)
|
||
|
(list
|
||
|
(ftype-ref Abits (a2 a1 a1) x)
|
||
|
(ftype-ref Abits (a2 a1 a2) x)
|
||
|
(ftype-ref Abits (a2 a1 a3) x)
|
||
|
(ftype-ref Abits (a2 a1 a4) x)
|
||
|
(ftype-ref Abits (a2 a1 a5) x)
|
||
|
(ftype-ref Abits (a2 a1 a6) x)
|
||
|
(ftype-ref Abits (a2 a1 a7) x)
|
||
|
(ftype-ref Abits (a2 a2 a8) x)
|
||
|
(ftype-ref Abits (a2 a2 a9) x)
|
||
|
(ftype-ref Abits (a2 a2 a10) x)
|
||
|
(ftype-ref Abits (a2 a3 a11) x)
|
||
|
(ftype-ref Abits (a2 a3 a12) x)
|
||
|
(ftype-ref Abits (a2 a4 a13) x)
|
||
|
(ftype-ref Abits (a2 a4 a14) x)
|
||
|
(ftype-ref Abits (a2 a5 a15) x)
|
||
|
(ftype-ref Abits (a2 a5 a16) x)
|
||
|
(ftype-ref Abits (a2 a6 a17) x)
|
||
|
(ftype-ref Abits (a2 a7 a18) x)
|
||
|
(ftype-ref Abits (a2 a8 a19) x)
|
||
|
(ftype-ref Abits (a2 a9 a20) x)
|
||
|
(ftype-ref Abits (a2 a10 a21) x)
|
||
|
(ftype-ref Abits (a2 a11 a22) x)
|
||
|
(ftype-ref Abits (a2 a12 a23) x)
|
||
|
(ftype-ref Abits (a2 a13 a24) x)
|
||
|
(ftype-ref Abits (a2 a14 a25) x)
|
||
|
(ftype-ref Abits (a2 a15 a26) x)
|
||
|
(ftype-ref Abits (a2 a16 a27) x)
|
||
|
(ftype-ref Abits (a2 a17 a28) x)
|
||
|
(ftype-ref Abits (a2 a18 a29) x)
|
||
|
(ftype-ref Abits (a2 a19 a30) x)
|
||
|
(ftype-ref Abits (a2 a20 a31) x)
|
||
|
(ftype-ref Abits (a2 a21 a32) x)))
|
||
|
(define (get-a3)
|
||
|
(list
|
||
|
(ftype-ref Abits (a3 a1 a1) x)
|
||
|
(ftype-ref Abits (a3 a1 a2) x)
|
||
|
(ftype-ref Abits (a3 a1 a3) x)
|
||
|
(ftype-ref Abits (a3 a1 a4) x)
|
||
|
(ftype-ref Abits (a3 a1 a5) x)
|
||
|
(ftype-ref Abits (a3 a1 a6) x)
|
||
|
(ftype-ref Abits (a3 a1 a7) x)
|
||
|
(ftype-ref Abits (a3 a2 a8) x)
|
||
|
(ftype-ref Abits (a3 a2 a9) x)
|
||
|
(ftype-ref Abits (a3 a2 a10) x)
|
||
|
(ftype-ref Abits (a3 a3 a11) x)
|
||
|
(ftype-ref Abits (a3 a3 a12) x)
|
||
|
(ftype-ref Abits (a3 a4 a13) x)
|
||
|
(ftype-ref Abits (a3 a4 a14) x)
|
||
|
(ftype-ref Abits (a3 a5 a15) x)
|
||
|
(ftype-ref Abits (a3 a5 a16) x)
|
||
|
(ftype-ref Abits (a3 a6 a17) x)
|
||
|
(ftype-ref Abits (a3 a7 a18) x)
|
||
|
(ftype-ref Abits (a3 a8 a19) x)
|
||
|
(ftype-ref Abits (a3 a9 a20) x)
|
||
|
(ftype-ref Abits (a3 a10 a21) x)
|
||
|
(ftype-ref Abits (a3 a11 a22) x)
|
||
|
(ftype-ref Abits (a3 a12 a23) x)
|
||
|
(ftype-ref Abits (a3 a13 a24) x)
|
||
|
(ftype-ref Abits (a3 a14 a25) x)
|
||
|
(ftype-ref Abits (a3 a15 a26) x)
|
||
|
(ftype-ref Abits (a3 a16 a27) x)
|
||
|
(ftype-ref Abits (a3 a17 a28) x)
|
||
|
(ftype-ref Abits (a3 a18 a29) x)
|
||
|
(ftype-ref Abits (a3 a19 a30) x)
|
||
|
(ftype-ref Abits (a3 a20 a31) x)
|
||
|
(ftype-ref Abits (a3 a21 a32) x)))
|
||
|
(define (set-a1! ls)
|
||
|
(map
|
||
|
(lambda (f v) (f v))
|
||
|
(list
|
||
|
(lambda (v) (ftype-set! Abits (a1 a1) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a2) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a3) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a4) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a5) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a6) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a7) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a8) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a9) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a10) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a11) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a12) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a13) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a14) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a15) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a16) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a17) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a18) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a19) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a20) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a21) x v)))
|
||
|
ls))
|
||
|
(define (set-a2! ls)
|
||
|
(map
|
||
|
(lambda (f v) (f v))
|
||
|
(list
|
||
|
(lambda (v) (ftype-set! Abits (a2 a1 a1) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a1 a2) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a1 a3) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a1 a4) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a1 a5) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a1 a6) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a1 a7) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a2 a8) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a2 a9) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a2 a10) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a3 a11) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a3 a12) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a4 a13) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a4 a14) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a5 a15) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a5 a16) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a6 a17) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a7 a18) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a8 a19) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a9 a20) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a10 a21) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a11 a22) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a12 a23) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a13 a24) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a14 a25) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a15 a26) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a16 a27) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a17 a28) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a18 a29) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a19 a30) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a20 a31) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a21 a32) x v)))
|
||
|
ls))
|
||
|
(define (set-a3! ls)
|
||
|
(map
|
||
|
(lambda (f v) (f v))
|
||
|
(list
|
||
|
(lambda (v) (ftype-set! Abits (a3 a1 a1) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a1 a2) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a1 a3) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a1 a4) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a1 a5) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a1 a6) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a1 a7) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a2 a8) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a2 a9) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a2 a10) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a3 a11) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a3 a12) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a4 a13) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a4 a14) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a5 a15) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a5 a16) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a6 a17) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a7 a18) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a8 a19) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a9 a20) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a10 a21) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a11 a22) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a12 a23) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a13 a24) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a14 a25) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a15 a26) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a16 a27) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a17 a28) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a18 a29) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a19 a30) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a20 a31) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a21 a32) x v)))
|
||
|
ls))
|
||
|
(define a3-c7c7c7c7
|
||
|
'(#b0
|
||
|
#b10
|
||
|
#b111
|
||
|
#b0001
|
||
|
#b11111
|
||
|
#b111000
|
||
|
#b1100011
|
||
|
#b00111110
|
||
|
#b000111110
|
||
|
#b1100011111
|
||
|
#b11111000111
|
||
|
#b100011111000
|
||
|
#b0011111000111
|
||
|
#b11000111110001
|
||
|
#b110001111100011
|
||
|
#b1100011111000111
|
||
|
#b11100011111000111
|
||
|
#b110001111100011111
|
||
|
#b1111100011111000111
|
||
|
#b11000111110001111100
|
||
|
#b001111100011111000111
|
||
|
#b1100011111000111110001
|
||
|
#b10001111100011111000111
|
||
|
#b110001111100011111000111
|
||
|
#b1110001111100011111000111
|
||
|
#b11000111110001111100011111
|
||
|
#b111110001111100011111000111
|
||
|
#b1100011111000111110001111100
|
||
|
#b00111110001111100011111000111
|
||
|
#b110001111100011111000111110001
|
||
|
#b1000111110001111100011111000111
|
||
|
#b11000111110001111100011111000111))
|
||
|
(define a3-13579bdf
|
||
|
'(#b1
|
||
|
#b10
|
||
|
#b111
|
||
|
#b0110
|
||
|
#b11110
|
||
|
#b101010
|
||
|
#b0001001
|
||
|
#b11011110
|
||
|
#b010111100
|
||
|
#b0001001101
|
||
|
#b01111011111
|
||
|
#b101011110011
|
||
|
#b1101111011111
|
||
|
#b00010011010101
|
||
|
#b100110111101111
|
||
|
#b0001001101010111
|
||
|
#b11001101111011111
|
||
|
#b000100110101011110
|
||
|
#b1111001101111011111
|
||
|
#b00010011010101111001
|
||
|
#b101111001101111011111
|
||
|
#b0001001101010111100110
|
||
|
#b10101111001101111011111
|
||
|
#b000100110101011110011011
|
||
|
#b1010101111001101111011111
|
||
|
#b00010011010101111001101111
|
||
|
#b011010101111001101111011111
|
||
|
#b0001001101010111100110111101
|
||
|
#b10011010101111001101111011111
|
||
|
#b000100110101011110011011110111
|
||
|
#b0010011010101111001101111011111
|
||
|
#b00010011010101111001101111011111))
|
||
|
(define a2-from-a3
|
||
|
(lambda (ls)
|
||
|
(map (lambda (i n)
|
||
|
(let* ([radix/2 (expt 2 i)])
|
||
|
(if (>= n radix/2)
|
||
|
(- n (ash radix/2 1))
|
||
|
n)))
|
||
|
(enumerate ls) ls)))
|
||
|
#t)
|
||
|
(begin
|
||
|
(set-a1! (make-list 21 0))
|
||
|
#t)
|
||
|
(equal?
|
||
|
(get-a2)
|
||
|
(make-list 32 0))
|
||
|
(equal?
|
||
|
(get-a3)
|
||
|
(make-list 32 0))
|
||
|
(begin
|
||
|
(set-a1! (make-list 21 #xffffffff))
|
||
|
#t)
|
||
|
(equal?
|
||
|
(get-a2)
|
||
|
(make-list 32 -1))
|
||
|
(equal?
|
||
|
(get-a3)
|
||
|
(do ([n 32 (fx- n 1)]
|
||
|
[ls '() (cons (- (expt 2 n) 1) ls)])
|
||
|
((= n 0) ls)))
|
||
|
(begin
|
||
|
(set-a1! (make-list 21 #xc7c7c7c7))
|
||
|
#t)
|
||
|
(equal?
|
||
|
(get-a3)
|
||
|
a3-c7c7c7c7)
|
||
|
(equal?
|
||
|
(get-a2)
|
||
|
(a2-from-a3 a3-c7c7c7c7))
|
||
|
(begin
|
||
|
(ftype-set! Abits (a1 a1) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a2) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a3) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a4) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a5) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a6) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a7) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a8) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a9) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a10) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a11) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a12) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a13) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a14) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a15) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a16) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a17) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a18) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a19) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a20) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a21) x #x13579bdf)
|
||
|
#t)
|
||
|
(equal?
|
||
|
(get-a3)
|
||
|
a3-13579bdf)
|
||
|
(equal?
|
||
|
(get-a2)
|
||
|
(a2-from-a3 a3-13579bdf))
|
||
|
(begin
|
||
|
(set-a1! (make-list 21 0))
|
||
|
(set-a3! a3-c7c7c7c7)
|
||
|
#t)
|
||
|
(equal?
|
||
|
(get-a3)
|
||
|
a3-c7c7c7c7)
|
||
|
(equal?
|
||
|
(get-a2)
|
||
|
(a2-from-a3 a3-c7c7c7c7))
|
||
|
(equal?
|
||
|
(get-a1)
|
||
|
'(#xc7c7c7c0
|
||
|
#xc7c7c7c0
|
||
|
#x0047c7c7
|
||
|
#xc7c407c7
|
||
|
#xc7c7c7c6
|
||
|
#x0001c7c7
|
||
|
#xc7c7c000
|
||
|
#x0007c7c7
|
||
|
#xc7c7c000
|
||
|
#x0007c7c7
|
||
|
#xc7c7c400
|
||
|
#x0047c7c7
|
||
|
#xc7c7c700
|
||
|
#x01c7c7c7
|
||
|
#xc7c7c7c0
|
||
|
#x07c7c7c7
|
||
|
#xc7c7c7c0
|
||
|
#x07c7c7c7
|
||
|
#xc7c7c7c4
|
||
|
#x47c7c7c7
|
||
|
#xc7c7c7c7))
|
||
|
(begin
|
||
|
(set-a1! (make-list 21 0))
|
||
|
(set-a2! (a2-from-a3 a3-13579bdf))
|
||
|
#t)
|
||
|
(equal?
|
||
|
(get-a3)
|
||
|
a3-13579bdf)
|
||
|
(equal?
|
||
|
(get-a2)
|
||
|
(a2-from-a3 a3-13579bdf))
|
||
|
(equal?
|
||
|
(get-a1)
|
||
|
'(#x13579bd0
|
||
|
#x13579bc0
|
||
|
#x00579bdf
|
||
|
#x13541bdf
|
||
|
#x13579bde
|
||
|
#x00019bdf
|
||
|
#x13578000
|
||
|
#x00079bdf
|
||
|
#x13579000
|
||
|
#x00179bdf
|
||
|
#x13579800
|
||
|
#x00579bdf
|
||
|
#x13579b00
|
||
|
#x01579bdf
|
||
|
#x13579bc0
|
||
|
#x03579bdf
|
||
|
#x13579bd0
|
||
|
#x13579bdf
|
||
|
#x13579bdc
|
||
|
#x13579bdf
|
||
|
#x13579bdf))
|
||
|
|
||
|
(begin
|
||
|
(fptr-free x)
|
||
|
#t)
|
||
|
|
||
|
; ----------------
|
||
|
(begin
|
||
|
(define-ftype Abits
|
||
|
(endian big
|
||
|
(union
|
||
|
[a1 (struct
|
||
|
[a1 unsigned-32]
|
||
|
[a2 unsigned-32]
|
||
|
[a3 unsigned-32]
|
||
|
[a4 unsigned-32]
|
||
|
[a5 unsigned-32]
|
||
|
[a6 unsigned-32]
|
||
|
[a7 unsigned-32]
|
||
|
[a8 unsigned-32]
|
||
|
[a9 unsigned-32]
|
||
|
[a10 unsigned-32]
|
||
|
[a11 unsigned-32]
|
||
|
[a12 unsigned-32]
|
||
|
[a13 unsigned-32]
|
||
|
[a14 unsigned-32]
|
||
|
[a15 unsigned-32]
|
||
|
[a16 unsigned-32]
|
||
|
[a17 unsigned-32]
|
||
|
[a18 unsigned-32]
|
||
|
[a19 unsigned-32]
|
||
|
[a20 unsigned-32]
|
||
|
[a21 unsigned-32])]
|
||
|
[a2 (struct
|
||
|
[a1 (bits
|
||
|
[_ signed 4]
|
||
|
[a1 signed 1]
|
||
|
[a2 signed 2]
|
||
|
[a3 signed 3]
|
||
|
[a4 signed 4]
|
||
|
[a5 signed 5]
|
||
|
[a6 signed 6]
|
||
|
[a7 signed 7])]
|
||
|
[a2 (bits
|
||
|
[_ signed 5]
|
||
|
[a8 signed 8]
|
||
|
[a9 signed 9]
|
||
|
[a10 signed 10])]
|
||
|
[a3 (bits
|
||
|
[a11 signed 11]
|
||
|
[a12 signed 12]
|
||
|
[_ signed 9])]
|
||
|
[a4 (bits
|
||
|
[a13 signed 13]
|
||
|
[_ signed 5]
|
||
|
[a14 signed 14])]
|
||
|
[a5 (bits
|
||
|
[_ signed 1]
|
||
|
[a15 signed 15]
|
||
|
[a16 signed 16])]
|
||
|
[a6 (bits [a17 signed 17] [_ signed 15])]
|
||
|
[a7 (bits [_ signed 14] [a18 signed 18])]
|
||
|
[a8 (bits [a19 signed 19] [_ signed 13])]
|
||
|
[a9 (bits [_ signed 12] [a20 signed 20])]
|
||
|
[a10 (bits [a21 signed 21] [_ signed 11])]
|
||
|
[a11 (bits [_ signed 10] [a22 signed 22])]
|
||
|
[a12 (bits [a23 signed 23] [_ signed 9])]
|
||
|
[a13 (bits [_ signed 8] [a24 signed 24])]
|
||
|
[a14 (bits [a25 signed 25] [_ signed 7])]
|
||
|
[a15 (bits [_ signed 6] [a26 signed 26])]
|
||
|
[a16 (bits [a27 signed 27] [_ signed 5])]
|
||
|
[a17 (bits [_ signed 4] [a28 signed 28])]
|
||
|
[a18 (bits [a29 signed 29] [_ signed 3])]
|
||
|
[a19 (bits [_ signed 2] [a30 signed 30])]
|
||
|
[a20 (bits [a31 signed 31] [_ signed 1])]
|
||
|
[a21 (bits [a32 signed 32])])]
|
||
|
[a3 (struct
|
||
|
[a1 (bits
|
||
|
[_ unsigned 4]
|
||
|
[a1 unsigned 1]
|
||
|
[a2 unsigned 2]
|
||
|
[a3 unsigned 3]
|
||
|
[a4 unsigned 4]
|
||
|
[a5 unsigned 5]
|
||
|
[a6 unsigned 6]
|
||
|
[a7 unsigned 7])]
|
||
|
[a2 (bits
|
||
|
[_ unsigned 5]
|
||
|
[a8 unsigned 8]
|
||
|
[a9 unsigned 9]
|
||
|
[a10 unsigned 10])]
|
||
|
[a3 (bits
|
||
|
[a11 unsigned 11]
|
||
|
[a12 unsigned 12]
|
||
|
[_ unsigned 9])]
|
||
|
[a4 (bits
|
||
|
[a13 unsigned 13]
|
||
|
[_ unsigned 5]
|
||
|
[a14 unsigned 14])]
|
||
|
[a5 (bits
|
||
|
[_ unsigned 1]
|
||
|
[a15 unsigned 15]
|
||
|
[a16 unsigned 16])]
|
||
|
[a6 (bits [a17 unsigned 17] [_ unsigned 15])]
|
||
|
[a7 (bits [_ unsigned 14] [a18 unsigned 18])]
|
||
|
[a8 (bits [a19 unsigned 19] [_ unsigned 13])]
|
||
|
[a9 (bits [_ unsigned 12] [a20 unsigned 20])]
|
||
|
[a10 (bits [a21 unsigned 21] [_ unsigned 11])]
|
||
|
[a11 (bits [_ unsigned 10] [a22 unsigned 22])]
|
||
|
[a12 (bits [a23 unsigned 23] [_ unsigned 9])]
|
||
|
[a13 (bits [_ unsigned 8] [a24 unsigned 24])]
|
||
|
[a14 (bits [a25 unsigned 25] [_ unsigned 7])]
|
||
|
[a15 (bits [_ unsigned 6] [a26 unsigned 26])]
|
||
|
[a16 (bits [a27 unsigned 27] [_ unsigned 5])]
|
||
|
[a17 (bits [_ unsigned 4] [a28 unsigned 28])]
|
||
|
[a18 (bits [a29 unsigned 29] [_ unsigned 3])]
|
||
|
[a19 (bits [_ unsigned 2] [a30 unsigned 30])]
|
||
|
[a20 (bits [a31 unsigned 31] [_ unsigned 1])]
|
||
|
[a21 (bits [a32 unsigned 32])])])))
|
||
|
(define x (make-ftype-pointer Abits (foreign-alloc (ftype-sizeof Abits))))
|
||
|
(define (get-a1)
|
||
|
(list
|
||
|
(ftype-ref Abits (a1 a1) x)
|
||
|
(ftype-ref Abits (a1 a2) x)
|
||
|
(ftype-ref Abits (a1 a3) x)
|
||
|
(ftype-ref Abits (a1 a4) x)
|
||
|
(ftype-ref Abits (a1 a5) x)
|
||
|
(ftype-ref Abits (a1 a6) x)
|
||
|
(ftype-ref Abits (a1 a7) x)
|
||
|
(ftype-ref Abits (a1 a8) x)
|
||
|
(ftype-ref Abits (a1 a9) x)
|
||
|
(ftype-ref Abits (a1 a10) x)
|
||
|
(ftype-ref Abits (a1 a11) x)
|
||
|
(ftype-ref Abits (a1 a12) x)
|
||
|
(ftype-ref Abits (a1 a13) x)
|
||
|
(ftype-ref Abits (a1 a14) x)
|
||
|
(ftype-ref Abits (a1 a15) x)
|
||
|
(ftype-ref Abits (a1 a16) x)
|
||
|
(ftype-ref Abits (a1 a17) x)
|
||
|
(ftype-ref Abits (a1 a18) x)
|
||
|
(ftype-ref Abits (a1 a19) x)
|
||
|
(ftype-ref Abits (a1 a20) x)
|
||
|
(ftype-ref Abits (a1 a21) x)))
|
||
|
(define (get-a2)
|
||
|
(list
|
||
|
(ftype-ref Abits (a2 a1 a1) x)
|
||
|
(ftype-ref Abits (a2 a1 a2) x)
|
||
|
(ftype-ref Abits (a2 a1 a3) x)
|
||
|
(ftype-ref Abits (a2 a1 a4) x)
|
||
|
(ftype-ref Abits (a2 a1 a5) x)
|
||
|
(ftype-ref Abits (a2 a1 a6) x)
|
||
|
(ftype-ref Abits (a2 a1 a7) x)
|
||
|
(ftype-ref Abits (a2 a2 a8) x)
|
||
|
(ftype-ref Abits (a2 a2 a9) x)
|
||
|
(ftype-ref Abits (a2 a2 a10) x)
|
||
|
(ftype-ref Abits (a2 a3 a11) x)
|
||
|
(ftype-ref Abits (a2 a3 a12) x)
|
||
|
(ftype-ref Abits (a2 a4 a13) x)
|
||
|
(ftype-ref Abits (a2 a4 a14) x)
|
||
|
(ftype-ref Abits (a2 a5 a15) x)
|
||
|
(ftype-ref Abits (a2 a5 a16) x)
|
||
|
(ftype-ref Abits (a2 a6 a17) x)
|
||
|
(ftype-ref Abits (a2 a7 a18) x)
|
||
|
(ftype-ref Abits (a2 a8 a19) x)
|
||
|
(ftype-ref Abits (a2 a9 a20) x)
|
||
|
(ftype-ref Abits (a2 a10 a21) x)
|
||
|
(ftype-ref Abits (a2 a11 a22) x)
|
||
|
(ftype-ref Abits (a2 a12 a23) x)
|
||
|
(ftype-ref Abits (a2 a13 a24) x)
|
||
|
(ftype-ref Abits (a2 a14 a25) x)
|
||
|
(ftype-ref Abits (a2 a15 a26) x)
|
||
|
(ftype-ref Abits (a2 a16 a27) x)
|
||
|
(ftype-ref Abits (a2 a17 a28) x)
|
||
|
(ftype-ref Abits (a2 a18 a29) x)
|
||
|
(ftype-ref Abits (a2 a19 a30) x)
|
||
|
(ftype-ref Abits (a2 a20 a31) x)
|
||
|
(ftype-ref Abits (a2 a21 a32) x)))
|
||
|
(define (get-a3)
|
||
|
(list
|
||
|
(ftype-ref Abits (a3 a1 a1) x)
|
||
|
(ftype-ref Abits (a3 a1 a2) x)
|
||
|
(ftype-ref Abits (a3 a1 a3) x)
|
||
|
(ftype-ref Abits (a3 a1 a4) x)
|
||
|
(ftype-ref Abits (a3 a1 a5) x)
|
||
|
(ftype-ref Abits (a3 a1 a6) x)
|
||
|
(ftype-ref Abits (a3 a1 a7) x)
|
||
|
(ftype-ref Abits (a3 a2 a8) x)
|
||
|
(ftype-ref Abits (a3 a2 a9) x)
|
||
|
(ftype-ref Abits (a3 a2 a10) x)
|
||
|
(ftype-ref Abits (a3 a3 a11) x)
|
||
|
(ftype-ref Abits (a3 a3 a12) x)
|
||
|
(ftype-ref Abits (a3 a4 a13) x)
|
||
|
(ftype-ref Abits (a3 a4 a14) x)
|
||
|
(ftype-ref Abits (a3 a5 a15) x)
|
||
|
(ftype-ref Abits (a3 a5 a16) x)
|
||
|
(ftype-ref Abits (a3 a6 a17) x)
|
||
|
(ftype-ref Abits (a3 a7 a18) x)
|
||
|
(ftype-ref Abits (a3 a8 a19) x)
|
||
|
(ftype-ref Abits (a3 a9 a20) x)
|
||
|
(ftype-ref Abits (a3 a10 a21) x)
|
||
|
(ftype-ref Abits (a3 a11 a22) x)
|
||
|
(ftype-ref Abits (a3 a12 a23) x)
|
||
|
(ftype-ref Abits (a3 a13 a24) x)
|
||
|
(ftype-ref Abits (a3 a14 a25) x)
|
||
|
(ftype-ref Abits (a3 a15 a26) x)
|
||
|
(ftype-ref Abits (a3 a16 a27) x)
|
||
|
(ftype-ref Abits (a3 a17 a28) x)
|
||
|
(ftype-ref Abits (a3 a18 a29) x)
|
||
|
(ftype-ref Abits (a3 a19 a30) x)
|
||
|
(ftype-ref Abits (a3 a20 a31) x)
|
||
|
(ftype-ref Abits (a3 a21 a32) x)))
|
||
|
(define (set-a1! ls)
|
||
|
(map
|
||
|
(lambda (f v) (f v))
|
||
|
(list
|
||
|
(lambda (v) (ftype-set! Abits (a1 a1) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a2) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a3) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a4) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a5) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a6) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a7) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a8) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a9) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a10) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a11) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a12) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a13) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a14) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a15) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a16) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a17) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a18) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a19) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a20) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a1 a21) x v)))
|
||
|
ls))
|
||
|
(define (set-a2! ls)
|
||
|
(map
|
||
|
(lambda (f v) (f v))
|
||
|
(list
|
||
|
(lambda (v) (ftype-set! Abits (a2 a1 a1) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a1 a2) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a1 a3) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a1 a4) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a1 a5) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a1 a6) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a1 a7) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a2 a8) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a2 a9) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a2 a10) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a3 a11) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a3 a12) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a4 a13) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a4 a14) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a5 a15) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a5 a16) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a6 a17) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a7 a18) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a8 a19) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a9 a20) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a10 a21) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a11 a22) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a12 a23) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a13 a24) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a14 a25) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a15 a26) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a16 a27) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a17 a28) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a18 a29) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a19 a30) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a20 a31) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a2 a21 a32) x v)))
|
||
|
ls))
|
||
|
(define (set-a3! ls)
|
||
|
(map
|
||
|
(lambda (f v) (f v))
|
||
|
(list
|
||
|
(lambda (v) (ftype-set! Abits (a3 a1 a1) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a1 a2) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a1 a3) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a1 a4) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a1 a5) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a1 a6) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a1 a7) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a2 a8) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a2 a9) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a2 a10) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a3 a11) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a3 a12) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a4 a13) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a4 a14) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a5 a15) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a5 a16) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a6 a17) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a7 a18) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a8 a19) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a9 a20) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a10 a21) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a11 a22) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a12 a23) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a13 a24) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a14 a25) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a15 a26) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a16 a27) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a17 a28) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a18 a29) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a19 a30) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a20 a31) x v))
|
||
|
(lambda (v) (ftype-set! Abits (a3 a21 a32) x v)))
|
||
|
ls))
|
||
|
(define a3-c7c7c7c7
|
||
|
'(#b0
|
||
|
#b11
|
||
|
#b111
|
||
|
#b0001
|
||
|
#b11110
|
||
|
#b001111
|
||
|
#b1000111
|
||
|
#b11111000
|
||
|
#b111110001
|
||
|
#b1111000111
|
||
|
#b11000111110
|
||
|
#b001111100011
|
||
|
#b1100011111000
|
||
|
#b00011111000111
|
||
|
#b100011111000111
|
||
|
#b1100011111000111
|
||
|
#b11000111110001111
|
||
|
#b111100011111000111
|
||
|
#b1100011111000111110
|
||
|
#b01111100011111000111
|
||
|
#b110001111100011111000
|
||
|
#b0001111100011111000111
|
||
|
#b11000111110001111100011
|
||
|
#b110001111100011111000111
|
||
|
#b1100011111000111110001111
|
||
|
#b11110001111100011111000111
|
||
|
#b110001111100011111000111110
|
||
|
#b0111110001111100011111000111
|
||
|
#b11000111110001111100011111000
|
||
|
#b000111110001111100011111000111
|
||
|
#b1100011111000111110001111100011
|
||
|
#b11000111110001111100011111000111))
|
||
|
(define a3-13579bdf
|
||
|
'(#b0
|
||
|
#b01
|
||
|
#b101
|
||
|
#b0101
|
||
|
#b11100
|
||
|
#b110111
|
||
|
#b1011111
|
||
|
#b01101010
|
||
|
#b111100110
|
||
|
#b1111011111
|
||
|
#b00010011010
|
||
|
#b101111001101
|
||
|
#b0001001101010
|
||
|
#b01101111011111
|
||
|
#b001001101010111
|
||
|
#b1001101111011111
|
||
|
#b00010011010101111
|
||
|
#b111001101111011111
|
||
|
#b0001001101010111100
|
||
|
#b01111001101111011111
|
||
|
#b000100110101011110011
|
||
|
#b0101111001101111011111
|
||
|
#b00010011010101111001101
|
||
|
#b010101111001101111011111
|
||
|
#b0001001101010111100110111
|
||
|
#b11010101111001101111011111
|
||
|
#b000100110101011110011011110
|
||
|
#b0011010101111001101111011111
|
||
|
#b00010011010101111001101111011
|
||
|
#b010011010101111001101111011111
|
||
|
#b0001001101010111100110111101111
|
||
|
#b00010011010101111001101111011111))
|
||
|
(define a2-from-a3
|
||
|
(lambda (ls)
|
||
|
(map (lambda (i n)
|
||
|
(let* ([radix/2 (expt 2 i)])
|
||
|
(if (>= n radix/2)
|
||
|
(- n (ash radix/2 1))
|
||
|
n)))
|
||
|
(enumerate ls) ls)))
|
||
|
#t)
|
||
|
(begin
|
||
|
(set-a1! (make-list 21 0))
|
||
|
#t)
|
||
|
(equal?
|
||
|
(get-a2)
|
||
|
(make-list 32 0))
|
||
|
(equal?
|
||
|
(get-a3)
|
||
|
(make-list 32 0))
|
||
|
(begin
|
||
|
(set-a1! (make-list 21 #xffffffff))
|
||
|
#t)
|
||
|
(equal?
|
||
|
(get-a2)
|
||
|
(make-list 32 -1))
|
||
|
(equal?
|
||
|
(get-a3)
|
||
|
(do ([n 32 (fx- n 1)]
|
||
|
[ls '() (cons (- (expt 2 n) 1) ls)])
|
||
|
((= n 0) ls)))
|
||
|
(begin
|
||
|
(set-a1! (make-list 21 #xc7c7c7c7))
|
||
|
#t)
|
||
|
(equal?
|
||
|
(get-a3)
|
||
|
a3-c7c7c7c7)
|
||
|
(equal?
|
||
|
(get-a2)
|
||
|
(a2-from-a3 a3-c7c7c7c7))
|
||
|
(begin
|
||
|
(ftype-set! Abits (a1 a1) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a2) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a3) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a4) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a5) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a6) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a7) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a8) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a9) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a10) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a11) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a12) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a13) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a14) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a15) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a16) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a17) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a18) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a19) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a20) x #x13579bdf)
|
||
|
(ftype-set! Abits (a1 a21) x #x13579bdf)
|
||
|
#t)
|
||
|
(equal?
|
||
|
(get-a3)
|
||
|
a3-13579bdf)
|
||
|
(equal?
|
||
|
(get-a2)
|
||
|
(a2-from-a3 a3-13579bdf))
|
||
|
(begin
|
||
|
(set-a1! (make-list 21 0))
|
||
|
(set-a3! a3-c7c7c7c7)
|
||
|
#t)
|
||
|
(equal?
|
||
|
(get-a3)
|
||
|
a3-c7c7c7c7)
|
||
|
(equal?
|
||
|
(get-a2)
|
||
|
(a2-from-a3 a3-c7c7c7c7))
|
||
|
(equal?
|
||
|
(get-a1)
|
||
|
'(#x07c7c7c7
|
||
|
#x07c7c7c7
|
||
|
#xc7c7c600
|
||
|
#xc7c007c7
|
||
|
#x47c7c7c7
|
||
|
#xc7c78000
|
||
|
#x0003c7c7
|
||
|
#xc7c7c000
|
||
|
#x0007c7c7
|
||
|
#xc7c7c000
|
||
|
#x0007c7c7
|
||
|
#xc7c7c600
|
||
|
#x00c7c7c7
|
||
|
#xc7c7c780
|
||
|
#x03c7c7c7
|
||
|
#xc7c7c7c0
|
||
|
#x07c7c7c7
|
||
|
#xc7c7c7c0
|
||
|
#x07c7c7c7
|
||
|
#xc7c7c7c6
|
||
|
#xc7c7c7c7))
|
||
|
(begin
|
||
|
(set-a1! (make-list 21 0))
|
||
|
(set-a2! (a2-from-a3 a3-13579bdf))
|
||
|
#t)
|
||
|
(equal?
|
||
|
(get-a3)
|
||
|
a3-13579bdf)
|
||
|
(equal?
|
||
|
(get-a2)
|
||
|
(a2-from-a3 a3-13579bdf))
|
||
|
(equal?
|
||
|
(get-a1)
|
||
|
'(#x03579bdf
|
||
|
#x03579bdf
|
||
|
#x13579a00
|
||
|
#x13501bdf
|
||
|
#x13579bdf
|
||
|
#x13578000
|
||
|
#x00039bdf
|
||
|
#x13578000
|
||
|
#x00079bdf
|
||
|
#x13579800
|
||
|
#x00179bdf
|
||
|
#x13579a00
|
||
|
#x00579bdf
|
||
|
#x13579b80
|
||
|
#x03579bdf
|
||
|
#x13579bc0
|
||
|
#x03579bdf
|
||
|
#x13579bd8
|
||
|
#x13579bdf
|
||
|
#x13579bde
|
||
|
#x13579bdf))
|
||
|
|
||
|
(begin
|
||
|
(fptr-free x)
|
||
|
#t)
|
||
|
)
|
||
|
|
||
|
(mat ftype-inspection
|
||
|
(begin
|
||
|
(define-ftype Qa
|
||
|
(struct
|
||
|
[x short]
|
||
|
[y long]))
|
||
|
(define-ftype Q
|
||
|
(struct
|
||
|
[x (packed integer-32)]
|
||
|
[y double-float]
|
||
|
[z (array 4 (struct [_ integer-16] [b integer-16]))]
|
||
|
[w (endian big
|
||
|
(union
|
||
|
[a integer-32]
|
||
|
[b unsigned-32]))]
|
||
|
[v (* Qa)]
|
||
|
[u (array 3 float)]
|
||
|
[t char]
|
||
|
[s (endian little
|
||
|
(array 2
|
||
|
(bits
|
||
|
[x unsigned 3]
|
||
|
[y signed 4]
|
||
|
[_ unsigned 17]
|
||
|
[z unsigned 8])))]))
|
||
|
(define q (make-ftype-pointer Q (foreign-alloc (ftype-sizeof Q))))
|
||
|
(ftype-set! Q (x) q -73)
|
||
|
(ftype-set! Q (y) q 3.25)
|
||
|
(ftype-set! Q (z 0 b) q 11)
|
||
|
(ftype-set! Q (z 1 b) q -15)
|
||
|
(ftype-set! Q (z 2 b) q 53)
|
||
|
(ftype-set! Q (z 3 b) q -71)
|
||
|
(ftype-set! Q (w a) q -1)
|
||
|
(ftype-set! Q (v) q (make-ftype-pointer Qa (foreign-alloc (ftype-sizeof Qa))))
|
||
|
(ftype-set! Q (v * x) q 7)
|
||
|
(ftype-set! Q (v * y) q -503)
|
||
|
(ftype-set! Q (u 0) q 1.0)
|
||
|
(ftype-set! Q (u 1) q 2.0)
|
||
|
(ftype-set! Q (u 2) q 3.0)
|
||
|
(ftype-set! Q (t) q #\$)
|
||
|
(ftype-set! Q (s 0 x) q 5)
|
||
|
(ftype-set! Q (s 0 y) q -2)
|
||
|
(ftype-set! Q (s 0 z) q 225)
|
||
|
(ftype-set! Q (s 1 x) q 2)
|
||
|
(ftype-set! Q (s 1 y) q 7)
|
||
|
(ftype-set! Q (s 1 z) q 47)
|
||
|
#t)
|
||
|
|
||
|
(equal?
|
||
|
(ftype-pointer-ftype q)
|
||
|
'(struct
|
||
|
[x (packed integer-32)]
|
||
|
[y double-float]
|
||
|
[z (array 4 (struct [_ integer-16] [b integer-16]))]
|
||
|
[w (endian big
|
||
|
(union
|
||
|
[a integer-32]
|
||
|
[b unsigned-32]))]
|
||
|
[v (* Qa)]
|
||
|
[u (array 3 float)]
|
||
|
[t char]
|
||
|
[s (endian little
|
||
|
(array 2
|
||
|
(bits
|
||
|
[x unsigned 3]
|
||
|
[y signed 4]
|
||
|
[_ unsigned 17]
|
||
|
[z unsigned 8])))]))
|
||
|
|
||
|
(eq? ; verify sharing in internal type field
|
||
|
(ftype-pointer-ftype (ftype-&ref Q (s) q))
|
||
|
(cadr (list-ref (ftype-pointer-ftype q) 8)))
|
||
|
|
||
|
(equal?
|
||
|
(ftype-pointer->sexpr q)
|
||
|
'(struct
|
||
|
[x -73]
|
||
|
[y 3.25]
|
||
|
[z (array 4
|
||
|
(struct [_ _] [b 11])
|
||
|
(struct [_ _] [b -15])
|
||
|
(struct [_ _] [b 53])
|
||
|
(struct [_ _] [b -71]))]
|
||
|
[w (union [a -1] [b #xffffffff])]
|
||
|
[v (* (struct [x 7] [y -503]))]
|
||
|
[u (array 3 1.0 2.0 3.0)]
|
||
|
[t #\$]
|
||
|
[s (array 2
|
||
|
(bits [x 5] [y -2] [_ _] [z 225])
|
||
|
(bits [x 2] [y 7] [_ _] [z 47]))]))
|
||
|
|
||
|
(begin
|
||
|
(fptr-free q)
|
||
|
#t)
|
||
|
|
||
|
; ----------------
|
||
|
|
||
|
(begin
|
||
|
(define-ftype big-wchar (endian big wchar))
|
||
|
(define-ftype little-wchar (endian little wchar))
|
||
|
(define-ftype Q
|
||
|
(struct
|
||
|
[a (array 10 char)]
|
||
|
[b (array 10 wchar)]
|
||
|
[c (endian big (array 10 wchar))]
|
||
|
[d (endian little (array 10 wchar))]
|
||
|
[e (* char)]
|
||
|
[f (* wchar)]
|
||
|
[g (* big-wchar)]
|
||
|
[h (* little-wchar)]
|
||
|
[i (* char)]
|
||
|
[j (* wchar)]))
|
||
|
(define q (make-ftype-pointer Q (foreign-alloc (ftype-sizeof Q))))
|
||
|
|
||
|
(define-syntax ftype-set-char-array!
|
||
|
(syntax-rules ()
|
||
|
[(_ maxlen ftype (a ...) fptr str)
|
||
|
(let ([len (min (string-length str) maxlen)])
|
||
|
(do ([i 0 (fx+ i 1)])
|
||
|
((fx= i len))
|
||
|
(ftype-set! ftype (a ... i) fptr (string-ref str i)))
|
||
|
(when (< len maxlen) (ftype-set! ftype (a ... len) fptr #\nul)))]))
|
||
|
|
||
|
(ftype-set-char-array! 10 Q (a) q "abcd")
|
||
|
(ftype-set-char-array! 10 Q (b) q "abcdefghijklmnop")
|
||
|
(ftype-set-char-array! 10 Q (c) q "ABCDEFGHIJKLMNOP")
|
||
|
(ftype-set-char-array! 10 Q (d) q "ABCDEFG")
|
||
|
|
||
|
(define-syntax ftype-set-string!
|
||
|
(syntax-rules ()
|
||
|
[(_ char ftype (a ...) fptr str p)
|
||
|
(let ([len (string-length str)])
|
||
|
(set! p (make-ftype-pointer char (foreign-alloc (fx* (ftype-sizeof char) (fx+ len 1)))))
|
||
|
(do ([i 0 (fx+ i 1)])
|
||
|
((fx= i len))
|
||
|
(ftype-set! char () p i (string-ref str i)))
|
||
|
(ftype-set! char () p len #\nul)
|
||
|
(ftype-set! ftype (a ...) fptr p))]))
|
||
|
|
||
|
(ftype-set-string! char Q (e) q "hello!" q-e)
|
||
|
(ftype-set-string! wchar Q (f) q "Hello!" q-f)
|
||
|
(ftype-set-string! big-wchar Q (g) q "HELLO!" q-g)
|
||
|
(ftype-set-string! little-wchar Q (h) q "GoodBye" q-h)
|
||
|
|
||
|
(ftype-set! Q (i) q (make-ftype-pointer char 0))
|
||
|
(ftype-set! Q (j) q (make-ftype-pointer wchar 1))
|
||
|
|
||
|
#t)
|
||
|
|
||
|
(if (memq (machine-type) '(ti3ob ta6ob)) ; avoid openbsd/pthreads signal bugs
|
||
|
(error #f "openbsd pthreads + signals is fubar")
|
||
|
(equal?
|
||
|
(ftype-pointer->sexpr q)
|
||
|
'(struct
|
||
|
[a "abcd"]
|
||
|
[b "abcdefghij"]
|
||
|
[c "ABCDEFGHIJ"]
|
||
|
[d "ABCDEFG"]
|
||
|
[e "hello!"]
|
||
|
[f "Hello!"]
|
||
|
[g "HELLO!"]
|
||
|
[h "GoodBye"]
|
||
|
[i null]
|
||
|
[j (* invalid)])))
|
||
|
|
||
|
(if (memq (machine-type) '(ti3ob ta6ob)) ; avoid openbsd/pthreads signal bugs
|
||
|
(error #f "openbsd pthreads + signals is fubar")
|
||
|
(equal?
|
||
|
(ftype-pointer->sexpr (make-ftype-pointer Q 0))
|
||
|
'(struct
|
||
|
[a (array 10 invalid)]
|
||
|
[b (array 10 invalid)]
|
||
|
[c (array 10 invalid)]
|
||
|
[d (array 10 invalid)]
|
||
|
[e invalid]
|
||
|
[f invalid]
|
||
|
[g invalid]
|
||
|
[h invalid]
|
||
|
[i invalid]
|
||
|
[j invalid])))
|
||
|
|
||
|
(begin
|
||
|
(fptr-free q-e)
|
||
|
(fptr-free q-f)
|
||
|
(fptr-free q-g)
|
||
|
(fptr-free q-h)
|
||
|
(fptr-free q)
|
||
|
#t)
|
||
|
|
||
|
; ----------------
|
||
|
|
||
|
(begin
|
||
|
(define-ftype A (endian little double))
|
||
|
(define-ftype B (endian big double))
|
||
|
#t)
|
||
|
|
||
|
(equal?
|
||
|
(ftype-pointer-ftype (make-ftype-pointer A 0))
|
||
|
(case (native-endianness)
|
||
|
[(big) '(endian little double)]
|
||
|
[(little) 'double]
|
||
|
[else (errorf #f "unexpected native endianness")]))
|
||
|
|
||
|
(equal?
|
||
|
(ftype-pointer-ftype (make-ftype-pointer B 0))
|
||
|
(case (native-endianness)
|
||
|
[(big) 'double]
|
||
|
[(little) '(endian big double)]
|
||
|
[else (errorf #f "unexpected native endianness")]))
|
||
|
|
||
|
(begin
|
||
|
(define-ftype A (endian little char))
|
||
|
(define-ftype B (endian big char))
|
||
|
#t)
|
||
|
|
||
|
(eq? (ftype-pointer-ftype (make-ftype-pointer A 0)) 'char)
|
||
|
(eq? (ftype-pointer-ftype (make-ftype-pointer B 0)) 'char)
|
||
|
)
|
||
|
|
||
|
(mat discarded-refs
|
||
|
(begin
|
||
|
(define-ftype A
|
||
|
(endian big
|
||
|
(struct
|
||
|
[a1 double]
|
||
|
[a2 float]
|
||
|
[a3 long-long]
|
||
|
[a4 unsigned-long-long]
|
||
|
[a5 long]
|
||
|
[a6 unsigned-long]
|
||
|
[a7 int]
|
||
|
[a8 unsigned]
|
||
|
[a9 unsigned-int]
|
||
|
[a10 short]
|
||
|
[a11 unsigned-short]
|
||
|
[a12 wchar]
|
||
|
[a13 char]
|
||
|
[a14 boolean]
|
||
|
[a15 fixnum]
|
||
|
[a16 iptr]
|
||
|
[a17 uptr]
|
||
|
[a18 void*])))
|
||
|
#t)
|
||
|
(equivalent-expansion?
|
||
|
(parameterize ([optimize-level 3] [enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
||
|
(expand/optimize
|
||
|
'(lambda (x)
|
||
|
(ftype-ref A (a1) x)
|
||
|
(ftype-ref A (a2) x)
|
||
|
(ftype-ref A (a3) x)
|
||
|
(ftype-ref A (a4) x)
|
||
|
(ftype-ref A (a5) x)
|
||
|
(ftype-ref A (a6) x)
|
||
|
(ftype-ref A (a7) x)
|
||
|
(ftype-ref A (a8) x)
|
||
|
(ftype-ref A (a9) x)
|
||
|
(ftype-ref A (a10) x)
|
||
|
(ftype-ref A (a11) x)
|
||
|
(ftype-ref A (a12) x)
|
||
|
(ftype-ref A (a13) x)
|
||
|
(ftype-ref A (a14) x)
|
||
|
(ftype-ref A (a15) x)
|
||
|
(ftype-ref A (a16) x)
|
||
|
(ftype-ref A (a17) x)
|
||
|
(ftype-ref A (a18) x)
|
||
|
x)))
|
||
|
'(lambda (x) x))
|
||
|
(equivalent-expansion?
|
||
|
(parameterize ([optimize-level 3] [enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
||
|
(expand/optimize
|
||
|
'(lambda (x)
|
||
|
(ftype-&ref A (a1) x)
|
||
|
(ftype-&ref A (a2) x)
|
||
|
(ftype-&ref A (a3) x)
|
||
|
(ftype-&ref A (a4) x)
|
||
|
(ftype-&ref A (a5) x)
|
||
|
(ftype-&ref A (a6) x)
|
||
|
(ftype-&ref A (a7) x)
|
||
|
(ftype-&ref A (a8) x)
|
||
|
(ftype-&ref A (a9) x)
|
||
|
(ftype-&ref A (a10) x)
|
||
|
(ftype-&ref A (a11) x)
|
||
|
(ftype-&ref A (a12) x)
|
||
|
(ftype-&ref A (a13) x)
|
||
|
(ftype-&ref A (a14) x)
|
||
|
(ftype-&ref A (a15) x)
|
||
|
(ftype-&ref A (a16) x)
|
||
|
(ftype-&ref A (a17) x)
|
||
|
(ftype-&ref A (a18) x)
|
||
|
x)))
|
||
|
'(lambda (x) x))
|
||
|
(begin
|
||
|
(define-ftype A
|
||
|
(endian little
|
||
|
(struct
|
||
|
[a1 double]
|
||
|
[a2 float]
|
||
|
[a3 long-long]
|
||
|
[a4 unsigned-long-long]
|
||
|
[a5 long]
|
||
|
[a6 unsigned-long]
|
||
|
[a7 int]
|
||
|
[a8 unsigned]
|
||
|
[a9 unsigned-int]
|
||
|
[a10 short]
|
||
|
[a11 unsigned-short]
|
||
|
[a12 wchar]
|
||
|
[a13 char]
|
||
|
[a14 boolean]
|
||
|
[a15 fixnum]
|
||
|
[a16 iptr]
|
||
|
[a17 uptr]
|
||
|
[a18 void*])))
|
||
|
#t)
|
||
|
(equivalent-expansion?
|
||
|
(parameterize ([optimize-level 3] [enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
||
|
(expand/optimize
|
||
|
'(lambda (x)
|
||
|
(ftype-ref A (a1) x)
|
||
|
(ftype-ref A (a2) x)
|
||
|
(ftype-ref A (a3) x)
|
||
|
(ftype-ref A (a4) x)
|
||
|
(ftype-ref A (a5) x)
|
||
|
(ftype-ref A (a6) x)
|
||
|
(ftype-ref A (a7) x)
|
||
|
(ftype-ref A (a8) x)
|
||
|
(ftype-ref A (a9) x)
|
||
|
(ftype-ref A (a10) x)
|
||
|
(ftype-ref A (a11) x)
|
||
|
(ftype-ref A (a12) x)
|
||
|
(ftype-ref A (a13) x)
|
||
|
(ftype-ref A (a14) x)
|
||
|
(ftype-ref A (a15) x)
|
||
|
(ftype-ref A (a16) x)
|
||
|
(ftype-ref A (a17) x)
|
||
|
(ftype-ref A (a18) x)
|
||
|
x)))
|
||
|
'(lambda (x) x))
|
||
|
(equivalent-expansion?
|
||
|
(parameterize ([optimize-level 3] [enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
||
|
(expand/optimize
|
||
|
'(lambda (x)
|
||
|
(ftype-&ref A (a1) x)
|
||
|
(ftype-&ref A (a2) x)
|
||
|
(ftype-&ref A (a3) x)
|
||
|
(ftype-&ref A (a4) x)
|
||
|
(ftype-&ref A (a5) x)
|
||
|
(ftype-&ref A (a6) x)
|
||
|
(ftype-&ref A (a7) x)
|
||
|
(ftype-&ref A (a8) x)
|
||
|
(ftype-&ref A (a9) x)
|
||
|
(ftype-&ref A (a10) x)
|
||
|
(ftype-&ref A (a11) x)
|
||
|
(ftype-&ref A (a12) x)
|
||
|
(ftype-&ref A (a13) x)
|
||
|
(ftype-&ref A (a14) x)
|
||
|
(ftype-&ref A (a15) x)
|
||
|
(ftype-&ref A (a16) x)
|
||
|
(ftype-&ref A (a17) x)
|
||
|
(ftype-&ref A (a18) x)
|
||
|
x)))
|
||
|
'(lambda (x) x))
|
||
|
(begin
|
||
|
(define-ftype A
|
||
|
(endian big
|
||
|
(union
|
||
|
[a1 (struct
|
||
|
[a1 unsigned-16]
|
||
|
[a2 unsigned-8]
|
||
|
[a3 unsigned-64]
|
||
|
[a4 unsigned-32])]
|
||
|
[a2 (struct
|
||
|
[a1 (bits
|
||
|
[a1 signed 1]
|
||
|
[a2 signed 15])]
|
||
|
[a2 (bits
|
||
|
[a1 signed 3]
|
||
|
[a2 signed 5])]
|
||
|
[a3 (bits
|
||
|
[a1 signed 50]
|
||
|
[a2 signed 14])]
|
||
|
[a4 (bits
|
||
|
[a1 signed 19]
|
||
|
[a2 signed 13])])]
|
||
|
[a3 (struct
|
||
|
[a1 (bits
|
||
|
[a1 unsigned 1]
|
||
|
[a2 unsigned 15])]
|
||
|
[a2 (bits
|
||
|
[a1 unsigned 3]
|
||
|
[a2 unsigned 5])]
|
||
|
[a3 (bits
|
||
|
[a1 unsigned 50]
|
||
|
[a2 unsigned 14])]
|
||
|
[a4 (bits
|
||
|
[a1 unsigned 19]
|
||
|
[a2 unsigned 13])])])))
|
||
|
#t)
|
||
|
(equivalent-expansion?
|
||
|
(parameterize ([optimize-level 3] [enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
||
|
(expand/optimize
|
||
|
'(lambda (x)
|
||
|
(ftype-ref A (a1 a1) x)
|
||
|
(ftype-ref A (a1 a2) x)
|
||
|
(ftype-ref A (a1 a3) x)
|
||
|
(ftype-ref A (a1 a4) x)
|
||
|
(ftype-ref A (a2 a1 a1) x)
|
||
|
(ftype-ref A (a2 a1 a2) x)
|
||
|
(ftype-ref A (a2 a2 a1) x)
|
||
|
(ftype-ref A (a2 a2 a2) x)
|
||
|
(ftype-ref A (a2 a3 a1) x)
|
||
|
(ftype-ref A (a2 a3 a2) x)
|
||
|
(ftype-ref A (a2 a4 a1) x)
|
||
|
(ftype-ref A (a2 a4 a2) x)
|
||
|
(ftype-ref A (a3 a1 a1) x)
|
||
|
(ftype-ref A (a3 a1 a2) x)
|
||
|
(ftype-ref A (a3 a2 a1) x)
|
||
|
(ftype-ref A (a3 a2 a2) x)
|
||
|
(ftype-ref A (a3 a3 a1) x)
|
||
|
(ftype-ref A (a3 a3 a2) x)
|
||
|
(ftype-ref A (a3 a4 a1) x)
|
||
|
(ftype-ref A (a3 a4 a2) x)
|
||
|
x)))
|
||
|
'(lambda (x) x))
|
||
|
(begin
|
||
|
(define-ftype A
|
||
|
(endian little
|
||
|
(union
|
||
|
[a1 (struct
|
||
|
[a1 unsigned-16]
|
||
|
[a2 unsigned-8]
|
||
|
[a3 unsigned-64]
|
||
|
[a4 unsigned-32])]
|
||
|
[a2 (struct
|
||
|
[a1 (bits
|
||
|
[a1 signed 1]
|
||
|
[a2 signed 15])]
|
||
|
[a2 (bits
|
||
|
[a1 signed 3]
|
||
|
[a2 signed 5])]
|
||
|
[a3 (bits
|
||
|
[a1 signed 50]
|
||
|
[a2 signed 14])]
|
||
|
[a4 (bits
|
||
|
[a1 signed 19]
|
||
|
[a2 signed 13])])]
|
||
|
[a3 (struct
|
||
|
[a1 (bits
|
||
|
[a1 unsigned 1]
|
||
|
[a2 unsigned 15])]
|
||
|
[a2 (bits
|
||
|
[a1 unsigned 3]
|
||
|
[a2 unsigned 5])]
|
||
|
[a3 (bits
|
||
|
[a1 unsigned 50]
|
||
|
[a2 unsigned 14])]
|
||
|
[a4 (bits
|
||
|
[a1 unsigned 19]
|
||
|
[a2 unsigned 13])])])))
|
||
|
#t)
|
||
|
(equivalent-expansion?
|
||
|
(parameterize ([optimize-level 3] [enable-cp0 #t] [#%$suppress-primitive-inlining #f])
|
||
|
(expand/optimize
|
||
|
'(lambda (x)
|
||
|
(ftype-ref A (a1 a1) x)
|
||
|
(ftype-ref A (a1 a2) x)
|
||
|
(ftype-ref A (a1 a3) x)
|
||
|
(ftype-ref A (a1 a4) x)
|
||
|
(ftype-ref A (a2 a1 a1) x)
|
||
|
(ftype-ref A (a2 a1 a2) x)
|
||
|
(ftype-ref A (a2 a2 a1) x)
|
||
|
(ftype-ref A (a2 a2 a2) x)
|
||
|
(ftype-ref A (a2 a3 a1) x)
|
||
|
(ftype-ref A (a2 a3 a2) x)
|
||
|
(ftype-ref A (a2 a4 a1) x)
|
||
|
(ftype-ref A (a2 a4 a2) x)
|
||
|
(ftype-ref A (a3 a1 a1) x)
|
||
|
(ftype-ref A (a3 a1 a2) x)
|
||
|
(ftype-ref A (a3 a2 a1) x)
|
||
|
(ftype-ref A (a3 a2 a2) x)
|
||
|
(ftype-ref A (a3 a3 a1) x)
|
||
|
(ftype-ref A (a3 a3 a2) x)
|
||
|
(ftype-ref A (a3 a4 a1) x)
|
||
|
(ftype-ref A (a3 a4 a2) x)
|
||
|
x)))
|
||
|
'(lambda (x) x))
|
||
|
)
|