diff --git a/pkgs/racket-test-core/tests/racket/foreign-test.rktl b/pkgs/racket-test-core/tests/racket/foreign-test.rktl index 33b904889f..1a43c52f12 100644 --- a/pkgs/racket-test-core/tests/racket/foreign-test.rktl +++ b/pkgs/racket-test-core/tests/racket/foreign-test.rktl @@ -171,6 +171,11 @@ [c7 _c7_list] [i2 _int])) +(let () + (define-cstruct _posn ([x _int] + [y _int])) + (test #t equal? 'posn posn-tag)) + (define _borl (_union _byte _long)) (define _ic7iorl (_union _ic7i _long)) diff --git a/racket/collects/ffi/unsafe.rkt b/racket/collects/ffi/unsafe.rkt index 47511fed3b..58dc55fd7d 100644 --- a/racket/collects/ffi/unsafe.rkt +++ b/racket/collects/ffi/unsafe.rkt @@ -1334,9 +1334,12 @@ (provide define-cpointer-type) (define-syntax (define-cpointer-type stx) (syntax-case stx () - [(_ _TYPE) #'(define-cpointer-type _TYPE #f #f #f)] - [(_ _TYPE ptr-type) #'(define-cpointer-type _TYPE ptr-type #f #f)] - [(_ _TYPE ptr-type scheme->c c->scheme) + [(_ _TYPE) #'(define-cpointer-type _TYPE #f #f #f #:tag #f)] + [(_ _TYPE #:tag the-tag) #'(define-cpointer-type _TYPE #f #f #f #:tag the-tag)] + [(_ _TYPE ptr-type) #'(define-cpointer-type _TYPE ptr-type #f #f #:tag #f)] + [(_ _TYPE ptr-type #:tag the-tag) #'(define-cpointer-type _TYPE ptr-type #f #f #:tag the-tag)] + [(_ _TYPE ptr-type scheme->c c->scheme) #'(define-cpointer-type _TYPE ptr-type #f #f #:tag #f)] + [(_ _TYPE ptr-type scheme->c c->scheme #:tag the-tag) (and (identifier? #'_TYPE) (regexp-match #rx"^_.+" (symbol->string (syntax-e #'_TYPE)))) (let ([name (cadr (regexp-match #rx"^_(.+)$" @@ -1349,8 +1352,7 @@ [TYPE-tag (id name "-tag")] [_TYPE/null (id "_" name "/null")]) #'(begin - (define TYPE-tag - (gensym 'TYPE)) + (define TYPE-tag (or the-tag 'TYPE)) (define _TYPE (_cpointer TYPE-tag ptr-type scheme->c c->scheme)) (define _TYPE/null @@ -1552,7 +1554,7 @@ struct:cpointer:super super-wrap-type-type) get-super-info) (define-values (property-binding-ids ...) . property-binding-form) ... - (define-cpointer-type _^TYPE super-pointer) + (define-cpointer-type _^TYPE super-pointer #:tag 'TYPE) define-wrap-type ;; these make it possible to use recursive pointer definitions (define _TYPE-pointer (wrap-TYPE-type _^TYPE))