Add contracts to unit imports and values imported via
define-values/invoke-unit. We still need contracts on unit exports, and we might want to do the stuff here in a cleaner fashion (particularly for define-values/invoke-unit). svn: r12759 original commit: a9be78545d95d72e5076d14369afae8b5774dbad
This commit is contained in:
commit
d9d718daa8
|
@ -9,7 +9,8 @@
|
||||||
"private/unit-compiletime.ss"
|
"private/unit-compiletime.ss"
|
||||||
"private/unit-syntax.ss")
|
"private/unit-syntax.ss")
|
||||||
|
|
||||||
(require mzlib/etc
|
(require mzlib/contract
|
||||||
|
mzlib/etc
|
||||||
"private/unit-keywords.ss"
|
"private/unit-keywords.ss"
|
||||||
"private/unit-runtime.ss")
|
"private/unit-runtime.ss")
|
||||||
|
|
||||||
|
@ -124,7 +125,7 @@
|
||||||
(with-syntax ([(((int-ivar . ext-ivar) ...)
|
(with-syntax ([(((int-ivar . ext-ivar) ...)
|
||||||
((((int-vid . ext-vid) ...) . vbody) ...)
|
((((int-vid . ext-vid) ...) . vbody) ...)
|
||||||
((((int-sid . ext-sid) ...) . sbody) ...)
|
((((int-sid . ext-sid) ...) . sbody) ...)
|
||||||
(((int-cid . ext-cid) . cbody) ...))
|
(cbody ...))
|
||||||
(map-sig (lambda (x) x)
|
(map-sig (lambda (x) x)
|
||||||
(make-syntax-introducer)
|
(make-syntax-introducer)
|
||||||
sig)])
|
sig)])
|
||||||
|
@ -165,17 +166,13 @@
|
||||||
(cons (map syntax-local-introduce (car d))
|
(cons (map syntax-local-introduce (car d))
|
||||||
(syntax-local-introduce (cdr d))))
|
(syntax-local-introduce (cdr d))))
|
||||||
|
|
||||||
(define-for-syntax (introduce-ctc-pair cp)
|
|
||||||
(cons (syntax-local-introduce (car cp))
|
|
||||||
(syntax-local-introduce (cdr cp))))
|
|
||||||
|
|
||||||
;; build-define-syntax : identifier (or/c identifier #f) syntax-object -> syntax-object
|
;; build-define-syntax : identifier (or/c identifier #f) syntax-object -> syntax-object
|
||||||
(define-for-syntax (build-define-signature sigid super-sigid sig-exprs)
|
(define-for-syntax (build-define-signature sigid super-sigid sig-exprs)
|
||||||
(unless (or (stx-null? sig-exprs) (stx-pair? sig-exprs))
|
(unless (or (stx-null? sig-exprs) (stx-pair? sig-exprs))
|
||||||
(raise-stx-err "expected syntax matching (sig-expr ...)" sig-exprs))
|
(raise-stx-err "expected syntax matching (sig-expr ...)" sig-exprs))
|
||||||
(let ([ses (checked-syntax->list sig-exprs)])
|
(let ([ses (checked-syntax->list sig-exprs)])
|
||||||
(define-values (super-names super-ctimes super-rtimes super-bindings
|
(define-values (super-names super-ctimes super-rtimes super-bindings
|
||||||
super-val-defs super-stx-defs super-ctc-pairs)
|
super-val-defs super-stx-defs super-ctcs)
|
||||||
(if super-sigid
|
(if super-sigid
|
||||||
(let* ([super-sig (lookup-signature super-sigid)]
|
(let* ([super-sig (lookup-signature super-sigid)]
|
||||||
[super-siginfo (signature-siginfo super-sig)])
|
[super-siginfo (signature-siginfo super-sig)])
|
||||||
|
@ -186,19 +183,23 @@
|
||||||
(map syntax-local-introduce (signature-vars super-sig))
|
(map syntax-local-introduce (signature-vars super-sig))
|
||||||
(map introduce-def (signature-val-defs super-sig))
|
(map introduce-def (signature-val-defs super-sig))
|
||||||
(map introduce-def (signature-stx-defs super-sig))
|
(map introduce-def (signature-stx-defs super-sig))
|
||||||
(map introduce-ctc-pair (signature-ctc-pairs super-sig))))
|
(map (lambda (ctc)
|
||||||
|
(if ctc
|
||||||
|
(syntax-local-introduce ctc)
|
||||||
|
ctc))
|
||||||
|
(signature-ctcs super-sig))))
|
||||||
(values '() '() '() '() '() '() '())))
|
(values '() '() '() '() '() '() '())))
|
||||||
(let loop ((sig-exprs ses)
|
(let loop ((sig-exprs ses)
|
||||||
(bindings null)
|
(bindings null)
|
||||||
(val-defs null)
|
(val-defs null)
|
||||||
(stx-defs null)
|
(stx-defs null)
|
||||||
(ctc-pairs null))
|
(ctcs null))
|
||||||
(cond
|
(cond
|
||||||
((null? sig-exprs)
|
((null? sig-exprs)
|
||||||
(let* ([all-bindings (append super-bindings (reverse bindings))]
|
(let* ([all-bindings (append super-bindings (reverse bindings))]
|
||||||
[all-val-defs (append super-val-defs (reverse val-defs))]
|
[all-val-defs (append super-val-defs (reverse val-defs))]
|
||||||
[all-stx-defs (append super-stx-defs (reverse stx-defs))]
|
[all-stx-defs (append super-stx-defs (reverse stx-defs))]
|
||||||
[all-ctc-pairs (append super-ctc-pairs (reverse ctc-pairs))]
|
[all-ctcs (append super-ctcs (reverse ctcs))]
|
||||||
[dup
|
[dup
|
||||||
(check-duplicate-identifier
|
(check-duplicate-identifier
|
||||||
(append all-bindings
|
(append all-bindings
|
||||||
|
@ -210,8 +211,7 @@
|
||||||
((super-name ...) super-names)
|
((super-name ...) super-names)
|
||||||
((var ...) all-bindings)
|
((var ...) all-bindings)
|
||||||
((((vid ...) . vbody) ...) all-val-defs)
|
((((vid ...) . vbody) ...) all-val-defs)
|
||||||
((((sid ...) . sbody) ...) all-stx-defs)
|
((((sid ...) . sbody) ...) all-stx-defs))
|
||||||
(((cid . cbody) ...) all-ctc-pairs))
|
|
||||||
#`(begin
|
#`(begin
|
||||||
(define signature-tag (gensym))
|
(define signature-tag (gensym))
|
||||||
(define-syntax #,sigid
|
(define-syntax #,sigid
|
||||||
|
@ -230,16 +230,18 @@
|
||||||
((syntax-local-certifier)
|
((syntax-local-certifier)
|
||||||
(quote-syntax sbody)))
|
(quote-syntax sbody)))
|
||||||
...)
|
...)
|
||||||
(list (cons (quote-syntax cid)
|
(list #,@(map (lambda (c)
|
||||||
((syntax-local-certifier)
|
(if c
|
||||||
(quote-syntax cbody)))
|
#`((syntax-local-certifier)
|
||||||
...)
|
(quote-syntax #,c))
|
||||||
|
#'#f))
|
||||||
|
all-ctcs))
|
||||||
(quote-syntax #,sigid))))))))
|
(quote-syntax #,sigid))))))))
|
||||||
(else
|
(else
|
||||||
(syntax-case (car sig-exprs) (define-values define-syntaxes contracted)
|
(syntax-case (car sig-exprs) (define-values define-syntaxes contracted)
|
||||||
(x
|
(x
|
||||||
(identifier? #'x)
|
(identifier? #'x)
|
||||||
(loop (cdr sig-exprs) (cons #'x bindings) val-defs stx-defs ctc-pairs))
|
(loop (cdr sig-exprs) (cons #'x bindings) val-defs stx-defs (cons #f ctcs)))
|
||||||
((x y z)
|
((x y z)
|
||||||
(and (identifier? #'x)
|
(and (identifier? #'x)
|
||||||
(module-identifier=? #'x #'contracted)
|
(module-identifier=? #'x #'contracted)
|
||||||
|
@ -248,7 +250,7 @@
|
||||||
(cons #'y bindings)
|
(cons #'y bindings)
|
||||||
val-defs
|
val-defs
|
||||||
stx-defs
|
stx-defs
|
||||||
(cons (cons #'y #'z) ctc-pairs)))
|
(cons #'z ctcs)))
|
||||||
((x . y)
|
((x . y)
|
||||||
(and (identifier? #'x)
|
(and (identifier? #'x)
|
||||||
(or (module-identifier=? #'x #'define-values)
|
(or (module-identifier=? #'x #'define-values)
|
||||||
|
@ -271,7 +273,7 @@
|
||||||
(cons (cons (syntax->list #'(name ...)) b)
|
(cons (cons (syntax->list #'(name ...)) b)
|
||||||
stx-defs)
|
stx-defs)
|
||||||
stx-defs)
|
stx-defs)
|
||||||
ctc-pairs)))))))
|
ctcs)))))))
|
||||||
((x . y)
|
((x . y)
|
||||||
(let ((trans
|
(let ((trans
|
||||||
(set!-trans-extract
|
(set!-trans-extract
|
||||||
|
@ -290,7 +292,7 @@
|
||||||
bindings
|
bindings
|
||||||
val-defs
|
val-defs
|
||||||
stx-defs
|
stx-defs
|
||||||
ctc-pairs))))
|
ctcs))))
|
||||||
(x (raise-stx-err
|
(x (raise-stx-err
|
||||||
"expected either an identifier or signature form"
|
"expected either an identifier or signature form"
|
||||||
#'x))))))))
|
#'x))))))))
|
||||||
|
@ -449,6 +451,13 @@
|
||||||
(define-for-syntax process-unit-export
|
(define-for-syntax process-unit-export
|
||||||
(process-unit-import/export process-tagged-export))
|
(process-unit-import/export process-tagged-export))
|
||||||
|
|
||||||
|
(define-for-syntax (make-import-unboxing loc ctc name)
|
||||||
|
(if ctc
|
||||||
|
(quasisyntax/loc (error-syntax)
|
||||||
|
(quote-syntax (contract #,ctc (unbox #,loc) 'cant-happen '#,name)))
|
||||||
|
(quasisyntax/loc (error-syntax)
|
||||||
|
(quote-syntax (unbox #,loc)))))
|
||||||
|
|
||||||
;; build-unit : syntax-object ->
|
;; build-unit : syntax-object ->
|
||||||
;; (values syntax-object (listof identifier) (listof identifier))
|
;; (values syntax-object (listof identifier) (listof identifier))
|
||||||
;; constructs the code for a unit expression. stx must be
|
;; constructs the code for a unit expression. stx must be
|
||||||
|
@ -525,11 +534,17 @@
|
||||||
(let-values ([(iloc ...)
|
(let-values ([(iloc ...)
|
||||||
(vector->values (hash-table-get import-table import-key) 0 icount)]
|
(vector->values (hash-table-get import-table import-key) 0 icount)]
|
||||||
...)
|
...)
|
||||||
(letrec-syntaxes ([(int-ivar ...)
|
(letrec-syntaxes (#,@(map (lambda (ivs ils ics)
|
||||||
(make-id-mappers
|
(quasisyntax/loc (error-syntax)
|
||||||
(quote-syntax (unbox iloc))
|
[#,ivs
|
||||||
...)]
|
(make-id-mappers
|
||||||
...
|
#,@(map (lambda (l c)
|
||||||
|
(make-import-unboxing l c #'name))
|
||||||
|
(syntax->list ils)
|
||||||
|
ics))]))
|
||||||
|
(syntax->list #'((int-ivar ...) ...))
|
||||||
|
(syntax->list #'((iloc ...) ...))
|
||||||
|
(map cadddr import-sigs))
|
||||||
[(int-evar ...)
|
[(int-evar ...)
|
||||||
(make-id-mappers
|
(make-id-mappers
|
||||||
(quote-syntax (unbox eloc))
|
(quote-syntax (unbox eloc))
|
||||||
|
@ -1205,9 +1220,12 @@
|
||||||
(map
|
(map
|
||||||
(lambda (os ov)
|
(lambda (os ov)
|
||||||
(map
|
(map
|
||||||
(lambda (i)
|
(lambda (i c)
|
||||||
#`(vector-ref #,ov #,i))
|
(if c
|
||||||
(iota (length (car os)))))
|
#`(contract #,c (unbox (vector-ref #,ov #,i)) 'cant-happen (#%variable-reference))
|
||||||
|
#`(unbox (vector-ref #,ov #,i))))
|
||||||
|
(iota (length (car os)))
|
||||||
|
(cadddr os)))
|
||||||
out-sigs
|
out-sigs
|
||||||
out-vec)))
|
out-vec)))
|
||||||
(quasisyntax/loc stx
|
(quasisyntax/loc stx
|
||||||
|
@ -1225,7 +1243,7 @@
|
||||||
((unit-go unit-tmp))))
|
((unit-go unit-tmp))))
|
||||||
(let ([out-vec (hash-table-get export-table key1)] ...)
|
(let ([out-vec (hash-table-get export-table key1)] ...)
|
||||||
(unit-fn #f)
|
(unit-fn #f)
|
||||||
(values (unbox out-code) ... ...))))))
|
(values out-code ... ...))))))
|
||||||
(define-syntaxes . renames) ...
|
(define-syntaxes . renames) ...
|
||||||
(define-syntaxes (mac-name ...) mac-body) ... ...
|
(define-syntaxes (mac-name ...) mac-body) ... ...
|
||||||
(define-values (val-name ...) val-body) ... ...)))))
|
(define-values (val-name ...) val-body) ... ...)))))
|
||||||
|
|
|
@ -103,30 +103,33 @@
|
||||||
|
|
||||||
;; http://getpost-impure-port : bool x url x union (str, #f) x list (str) -> in-port
|
;; http://getpost-impure-port : bool x url x union (str, #f) x list (str) -> in-port
|
||||||
(define (http://getpost-impure-port get? url post-data strings)
|
(define (http://getpost-impure-port get? url post-data strings)
|
||||||
(let*-values
|
(define proxy (assoc (url-scheme url) (current-proxy-servers)))
|
||||||
([(proxy) (assoc (url-scheme url) (current-proxy-servers))]
|
(define-values (server->client client->server) (make-ports url proxy))
|
||||||
[(server->client client->server) (make-ports url proxy)]
|
(define access-string
|
||||||
[(access-string) (url->string
|
(url->string
|
||||||
(if proxy
|
(if proxy
|
||||||
url
|
url
|
||||||
(make-url #f #f #f #f
|
;; RFCs 1945 and 2616 say:
|
||||||
(url-path-absolute? url)
|
;; Note that the absolute path cannot be empty; if none is present in
|
||||||
(url-path url)
|
;; the original URI, it must be given as "/" (the server root).
|
||||||
(url-query url)
|
(let-values ([(abs? path)
|
||||||
(url-fragment url))))])
|
(if (null? (url-path url))
|
||||||
(define (println . xs)
|
(values #t (list (make-path/param "" '())))
|
||||||
(for-each (lambda (x) (display x client->server)) xs)
|
(values (url-path-absolute? url) (url-path url)))])
|
||||||
(display "\r\n" client->server))
|
(make-url #f #f #f #f abs? path (url-query url) (url-fragment url))))))
|
||||||
(println (if get? "GET " "POST ") access-string " HTTP/1.0")
|
(define (println . xs)
|
||||||
(println "Host: " (url-host url)
|
(for-each (lambda (x) (display x client->server)) xs)
|
||||||
(let ([p (url-port url)]) (if p (format ":~a" p) "")))
|
(display "\r\n" client->server))
|
||||||
(when post-data (println "Content-Length: " (bytes-length post-data)))
|
(println (if get? "GET " "POST ") access-string " HTTP/1.0")
|
||||||
(for-each println strings)
|
(println "Host: " (url-host url)
|
||||||
(println)
|
(let ([p (url-port url)]) (if p (format ":~a" p) "")))
|
||||||
(when post-data (display post-data client->server))
|
(when post-data (println "Content-Length: " (bytes-length post-data)))
|
||||||
(flush-output client->server)
|
(for-each println strings)
|
||||||
(tcp-abandon-port client->server)
|
(println)
|
||||||
server->client))
|
(when post-data (display post-data client->server))
|
||||||
|
(flush-output client->server)
|
||||||
|
(tcp-abandon-port client->server)
|
||||||
|
server->client)
|
||||||
|
|
||||||
(define (file://->path url [kind (system-path-convention-type)])
|
(define (file://->path url [kind (system-path-convention-type)])
|
||||||
(let ([strs (map path/param-path (url-path url))]
|
(let ([strs (map path/param-path (url-path url))]
|
||||||
|
|
Loading…
Reference in New Issue
Block a user