diff --git a/collects/typed-scheme/base-env/base-special-env.rkt b/collects/typed-scheme/base-env/base-special-env.rkt index 39a2b4ee..ee27d504 100644 --- a/collects/typed-scheme/base-env/base-special-env.rkt +++ b/collects/typed-scheme/base-env/base-special-env.rkt @@ -26,7 +26,6 @@ (initialize-type-env initial-env)) (provide (for-syntax initialize-env))))])) - (define-initial-env initialize-special ;; make-promise [(syntax-parse (local-expand #'(delay 3) 'expression null) @@ -50,8 +49,7 @@ [(syntax-parse (local-expand #'(for ([x '()]) x) 'expression #f) #:context #'make-sequence #:literals (let-values quote) - [(let-values ([_ (m-s '(_) '())]) . _) - #'m-s]) + [(let-values ([_ (m-s '(_) '())]) . _) #'m-s]) (-poly (a b) (let ([seq-vals (lambda (a) diff --git a/collects/typed-scheme/core.rkt b/collects/typed-scheme/core.rkt index fefdf970..c8c25175 100644 --- a/collects/typed-scheme/core.rkt +++ b/collects/typed-scheme/core.rkt @@ -11,7 +11,7 @@ (env type-name-env type-alias-env) (r:infer infer) (rep type-rep) - (except-in (utils utils tc-utils) infer) + (except-in (utils utils tc-utils arm) infer) (only-in (r:infer infer-dummy) infer-param) "tc-setup.rkt") @@ -40,7 +40,7 @@ [(optimized-body ...) (maybe-optimize #'transformed-body)]) ;; reconstruct the module with the extra code ;; use the regular %#module-begin from `racket/base' for top-level printing - #`(#%module-begin optimized-body ... #,after-code check-syntax-help)))))])) + (arm #`(#%module-begin optimized-body ... #,after-code check-syntax-help))))))])) (define (ti-core stx) (syntax-parse stx @@ -53,7 +53,7 @@ ([optimized-body (car (maybe-optimize #`(#,body2)))]) (syntax-parse body2 ;; any of these do not produce an expression to be printed - [(head:invis-kw . _) #'optimized-body] + [(head:invis-kw . _) (arm #'optimized-body)] [_ (let ([ty-str (match type ;; don't print results of type void [(tc-result1: (== -Void type-equal?)) #f] @@ -64,5 +64,5 @@ [x (int-err "bad type result: ~a" x)])]) (if ty-str #`(let ([type '#,ty-str]) - (begin0 optimized-body (display type))) - #'optimized-body))])))])) + (begin0 #,(arm #'optimized-body) (display type))) + (arm #'optimized-body)))])))])) diff --git a/collects/typed-scheme/optimizer/optimizer.rkt b/collects/typed-scheme/optimizer/optimizer.rkt index 9f412703..0011c30b 100644 --- a/collects/typed-scheme/optimizer/optimizer.rkt +++ b/collects/typed-scheme/optimizer/optimizer.rkt @@ -14,7 +14,7 @@ (define-syntax-class opt-expr #:commit (pattern e:opt-expr* - #:with opt (syntax-recertify #'e.opt this-syntax (current-code-inspector) #f))) + #:with opt #'e.opt)) (define-syntax-class opt-expr* #:commit diff --git a/collects/typed-scheme/tc-setup.rkt b/collects/typed-scheme/tc-setup.rkt index 87ce15f0..0d4beec1 100644 --- a/collects/typed-scheme/tc-setup.rkt +++ b/collects/typed-scheme/tc-setup.rkt @@ -11,7 +11,7 @@ (typecheck typechecker provide-handling tc-toplevel) (env tvar-env type-name-env type-alias-env) (r:infer infer) - (utils tc-utils) + (utils tc-utils disarm) (rep type-rep) (except-in (utils utils) infer) (only-in (r:infer infer-dummy) infer-param) @@ -59,7 +59,7 @@ ;; reinitialize seen type variables [type-name-references null]) (do-time "Initialized Envs") - (let ([fully-expanded-stx (local-expand stx expand-ctxt null)]) + (let ([fully-expanded-stx (disarm* (local-expand stx expand-ctxt null))]) (when (show-input?) (pretty-print (syntax->datum fully-expanded-stx))) (do-time "Local Expand Done") @@ -69,4 +69,4 @@ [debugging? #f]) (let ([result (checker fully-expanded-stx)]) (do-time "Typechecking Done") - . body))))))) + (let () . body)))))))) diff --git a/collects/typed-scheme/typecheck/tc-expr-unit.rkt b/collects/typed-scheme/typecheck/tc-expr-unit.rkt index ff1cb31b..bdb582db 100644 --- a/collects/typed-scheme/typecheck/tc-expr-unit.rkt +++ b/collects/typed-scheme/typecheck/tc-expr-unit.rkt @@ -409,7 +409,9 @@ (begin (tc-exprs (syntax->list #'es)) (tc-expr #'e))] ;; other - [_ (tc-error/expr #:return (ret (Un)) "cannot typecheck unknown form : ~a\n" (syntax->datum form))])) + [_ + (printf "~s\n" (continuation-mark-set->context (current-continuation-marks))) + (tc-error/expr #:return (ret (Un)) "cannot typecheck unknown form : ~a\n" (syntax->datum form))])) (parameterize ([current-orig-stx form]) ;(printf "form: ~a\n" (syntax->datum form)) diff --git a/collects/typed-scheme/typecheck/tc-toplevel.rkt b/collects/typed-scheme/typecheck/tc-toplevel.rkt index 4d0e25f4..84a0f982 100644 --- a/collects/typed-scheme/typecheck/tc-toplevel.rkt +++ b/collects/typed-scheme/typecheck/tc-toplevel.rkt @@ -50,7 +50,7 @@ #:literals (values define-type-alias-internal define-typed-struct-internal define-type-internal define-typed-struct/exec-internal :-internal assert-predicate-internal require/typed-internal declare-refinement-internal - define-values quote-syntax #%plain-app begin) + define-values quote-syntax #%plain-app begin define-syntaxes) ;#:literal-sets (kernel-literals) ;; forms that are handled in other ways @@ -157,7 +157,7 @@ ;; define-syntaxes just get noted [(define-syntaxes (var:id ...) . rest) (map make-def-stx-binding (syntax->list #'(var ...)))] - + ;; otherwise, do nothing in this pass ;; handles expressions, provides, requires, etc and whatnot [_ (list)]))) diff --git a/collects/typed-scheme/utils/arm.rkt b/collects/typed-scheme/utils/arm.rkt new file mode 100644 index 00000000..d044e569 --- /dev/null +++ b/collects/typed-scheme/utils/arm.rkt @@ -0,0 +1,25 @@ +#lang racket/base +(require (for-template racket/base)) + +(provide arm) + +;; For simplicity, protect everything produced by Typed Racket. +(define (arm stx) + (syntax-case stx (module #%plain-module-begin + #%require #%provide begin + define-values define-syntaxes + define-values-for-syntax) + [(module name initial-import mb) + (quasisyntax/loc stx (module name initial-import #,(arm #'mb)))] + [(#%plain-module-begin . _) (syntax-arm stx)] + [(#%require . _) stx] + [(#%provide . _) stx] + [(begin form ...) + (quasisyntax/loc stx (begin #,@(map arm (syntax->list #'(form ...)))))] + [(define-values ids expr) + (quasisyntax/loc stx (define-values ids #,(arm #'expr)))] + [(define-syntaxes ids expr) + (quasisyntax/loc stx (define-syntaxes ids #,(arm #'expr)))] + [(define-values-for-syntax ids expr) + (quasisyntax/loc stx (define-values-for-syntax ids #,(arm #'expr)))] + [_ (syntax-arm stx)])) diff --git a/collects/typed-scheme/utils/disarm.rkt b/collects/typed-scheme/utils/disarm.rkt new file mode 100644 index 00000000..3e31384c --- /dev/null +++ b/collects/typed-scheme/utils/disarm.rkt @@ -0,0 +1,26 @@ +#lang racket/base + +(provide disarm*) + +;; Typed Racket runs after macro expansion, and it must be priviledged, +;; so it can just disarm all taints (and arm everything afterward). + +(define (disarm* stx) + (let loop ([v stx]) + (cond + [(syntax? v) + (let* ([stx (syntax-disarm v orig-insp)] + [r (loop (syntax-e stx))]) + (if (eq? r (syntax-e stx)) + stx + (datum->syntax stx r stx stx)))] + [(pair? v) (let ([a (loop (car v))] + [d (loop (cdr v))]) + (if (and (eq? a (car v)) + (eq? d (cdr v))) + v + (cons a d)))] + [else v]))) + +(define orig-insp (current-code-inspector)) + diff --git a/collects/typed/private/rewriter.rkt b/collects/typed/private/rewriter.rkt index 45c29a5c..95e5f187 100644 --- a/collects/typed/private/rewriter.rkt +++ b/collects/typed/private/rewriter.rkt @@ -2,10 +2,11 @@ (require (for-syntax syntax/parse racket/base syntax/id-table racket/dict unstable/debug)) +(define-for-syntax code-insp (current-code-inspector)) + (define-for-syntax (rewrite stx tbl from) (define (rw stx) - (syntax-recertify - (syntax-parse stx #:literal-sets (kernel-literals) + (syntax-parse (syntax-disarm stx code-insp) #:literal-sets (kernel-literals) [i:identifier (dict-ref tbl #'i #'i)] ;; no expressions here @@ -34,10 +35,7 @@ (~or if begin begin0 set! #%plain-app #%expression #%variable-reference with-continuation-mark)) expr ...) - (quasisyntax/loc stx (#,#'kw #,@(map rw (syntax->list #'(expr ...)))))]) - stx - (current-code-inspector) - #f)) + (quasisyntax/loc stx (#,#'kw #,@(map rw (syntax->list #'(expr ...)))))])) (rw stx)) (define-syntax (define-rewriter stx)