fixed verify- ops to take old-format exploded signatures

svn: r277
This commit is contained in:
Matthew Flatt 2005-06-30 16:40:13 +00:00
parent a17bb02f6d
commit 3d8c40afe4
5 changed files with 89 additions and 20 deletions

View File

@ -33,8 +33,9 @@
(loop (format "~a:~a" s (car path)) (loop (format "~a:~a" s (car path))
(cdr path))))) (cdr path)))))
(define (check-sig-match table sig path exact? who src-context dest-context) (define (check-sig-match table sig path exact? who src-context dest-context wrapped? unwrap)
(and (vector? (car sig)) (and (wrapped? sig)
(vector? (unwrap sig))
(andmap (andmap
(lambda (s) (lambda (s)
(cond (cond
@ -98,9 +99,10 @@
(current-continuation-marks))))) (current-continuation-marks)))))
(hash-table-put! table (car s) #f) (hash-table-put! table (car s) #f)
(check-sig-match v (cdr s) (cons (car s) path) (check-sig-match v (cdr s) (cons (car s) path)
exact? who src-context dest-context))))] exact? who src-context dest-context
wrapped? unwrap))))]
[else #f])) [else #f]))
(vector->list (car sig))) (vector->list (unwrap sig)))
(or (not exact?) (or (not exact?)
(hash-table-for-each (hash-table-for-each
table table
@ -120,7 +122,7 @@
(current-continuation-marks))))))) (current-continuation-marks)))))))
#t))) #t)))
(define (verify-signature-match who exact? dest-context dest-sig src-context src-sig) (define (-verify-signature-match who exact? dest-context dest-sig src-context src-sig wrapped? unwrap)
(unless (symbol? who) (unless (symbol? who)
(raise-type-error 'verify-signature-match "symbol" who)) (raise-type-error 'verify-signature-match "symbol" who))
(unless (string? dest-context) (unless (string? dest-context)
@ -130,10 +132,21 @@
(let ([src-table (make-hash-table)]) (let ([src-table (make-hash-table)])
(unless (hash-sig src-sig src-table) (unless (hash-sig src-sig src-table)
(raise-type-error 'verify-signature-match "signature" src-sig)) (raise-type-error 'verify-signature-match "exploded signature" src-sig))
(unless (check-sig-match src-table dest-sig null (unless (check-sig-match src-table dest-sig null
exact? who src-context dest-context) exact? who src-context dest-context
(raise-type-error 'verify-signature-match "signature" dest-sig)))) wrapped? unwrap)
(raise-type-error 'verify-signature-match "exploded signature" dest-sig))))
(provide verify-signature-match)) (define (alt-verify-signature-match who exact? dest-context dest-sig src-context src-sig)
(-verify-signature-match who exact? dest-context dest-sig src-context src-sig
pair? car))
(define (verify-signature-match who exact? dest-context dest-sig src-context src-sig)
(-verify-signature-match who exact? dest-context dest-sig src-context src-sig
values values))
(provide -verify-signature-match
verify-signature-match
alt-verify-signature-match))

View File

@ -857,7 +857,7 @@
(syntax-error (syntax-error
#f expr #f expr
(exn-message exn)))]) (exn-message exn)))])
(verify-signature-match (alt-verify-signature-match
'compound-unit/sig #f 'compound-unit/sig #f
(format "signature ~s" (signature-src use-sig)) (format "signature ~s" (signature-src use-sig))
(explode-sig use-sig #f) (explode-sig use-sig #f)

View File

@ -107,7 +107,7 @@
(syntax/loc (syntax/loc
expr expr
(let ([tagx uexpr] ... . interned-vectors) (let ([tagx uexpr] ... . interned-vectors)
(verify-linkage-signature-match (alt-verify-linkage-signature-match
'compound-unit/sig 'compound-unit/sig
'(tag ...) '(tag ...)
(list tagx ...) (list tagx ...)
@ -140,7 +140,7 @@
(syntax/loc (syntax/loc
expr expr
(let ([unt u]) (let ([unt u])
(verify-linkage-signature-match (alt-verify-linkage-signature-match
(quote invoke-unit/sig) (quote invoke-unit/sig)
(quote (invoke)) (quote (invoke))
(list unt) (list unt)
@ -173,10 +173,10 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define verify-linkage-signature-match (define -verify-linkage-signature-match
(let ([make-exn make-exn:fail:unit] (let ([make-exn make-exn:fail:unit]
[p-suffix (lambda (pos) (case pos [(1) 'st][(2) 'nd][(3) 'rd][else 'th]))]) [p-suffix (lambda (pos) (case pos [(1) 'st][(2) 'nd][(3) 'rd][else 'th]))])
(lambda (who tags units esigs isigs) (lambda (who tags units esigs isigs wrapped? unwrap)
(for-each (for-each
(lambda (u tag) (lambda (u tag)
(unless (signed-unit? u) (unless (signed-unit? u)
@ -190,12 +190,13 @@
units tags) units tags)
(for-each (for-each
(lambda (u tag esig) (lambda (u tag esig)
(verify-signature-match (-verify-signature-match
who #f who #f
(format "specified export signature for ~a" tag) (format "specified export signature for ~a" tag)
esig esig
(format "export signature for actual ~a sub-unit" tag) (format "export signature for actual ~a sub-unit" tag)
(signed-unit-exports u))) (signed-unit-exports u)
wrapped? unwrap))
units tags esigs) units tags esigs)
(for-each (for-each
(lambda (u tag isig) (lambda (u tag isig)
@ -216,7 +217,7 @@
(unless (null? isig) (unless (null? isig)
(let ([expected (car expecteds)] (let ([expected (car expecteds)]
[provided (car isig)]) [provided (car isig)])
(verify-signature-match (-verify-signature-match
who #t who #t
(format "~a unit's ~s~s import (which is ~a)" tag (format "~a unit's ~s~s import (which is ~a)" tag
pos (p-suffix pos) pos (p-suffix pos)
@ -226,10 +227,19 @@
tag tag
pos (p-suffix pos) pos (p-suffix pos)
(car provided)) (car provided))
(cdr provided)) (cdr provided)
wrapped? unwrap)
(loop (cdr isig) (cdr expecteds) (add1 pos)))))) (loop (cdr isig) (cdr expecteds) (add1 pos))))))
units tags isigs)))) units tags isigs))))
(define verify-linkage-signature-match
(lambda (who tags units esigs isigs)
(-verify-linkage-signature-match who tags units esigs isigs values values)))
(define alt-verify-linkage-signature-match
(lambda (who tags units esigs isigs)
(-verify-linkage-signature-match who tags units esigs isigs pair? car)))
(define-syntax signature->symbols (define-syntax signature->symbols
(lambda (stx) (lambda (stx)
(syntax-case stx () (syntax-case stx ()
@ -287,7 +297,7 @@
(dv/iu (dv/iu
ex-flattened ex-flattened
(let ([unit-var unite]) (let ([unit-var unite])
(verify-linkage-signature-match (alt-verify-linkage-signature-match
'formname 'formname
'(invoke) '(invoke)
(list unit-var) (list unit-var)

View File

@ -681,5 +681,16 @@
;; -------------------------------------------------- ;; --------------------------------------------------
(let ()
(define-signature s^ (x))
(test (void)
verify-linkage-signature-match 'where
(list 'tag)
(list (unit/sig s^ (import) (define x 1)))
(list (signature->symbols s^))
(list (list))))
;; --------------------------------------------------
(report-errs) (report-errs)

View File

@ -0,0 +1,35 @@
(define filename "stypes.h")
(define lines
(with-input-from-file filename
(lambda ()
(let loop ()
(let ([l (read-line)])
(if (eof-object? l)
null
(cons l (loop))))))))
(define n 0)
(with-output-to-file filename
(lambda ()
(for-each
(lambda (l)
(cond
[(regexp-match #rx"^( +[a-z_A-Z][a-z_A-Z0-9]*,) *(?:/[*] [0-9]* [*]/)? *$" l)
=> (lambda (m)
(let ([s (cadr m)])
(printf "~a~a~n"
s
(format "~a/* ~a */"
(make-string (max 0 (- 40 (string-length s))) #\space)
n)))
(set! n (add1 n)))]
[(regexp-match #rx"^ +[a-zA-Z_][a-z_A-Z0-9]*," l)
(set! n (add1 n))
(printf "~a~n" l)]
[else
(printf "~a~n" l)]))
lines))
'truncate)