From 03c978d2e8d4907c2be59e61154c50a2d40557f6 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Mon, 11 May 2020 13:43:48 -0600 Subject: [PATCH] expander: avoid race condition on `syntax-e` Concurrent lazy scope propagation had a (very unlikely) race condition updating a syntax object. Ryan pointed out this problem as part of the discussion for #3162. Switch to using a single field for a syntax object's content and propagations, so a CAS can be used to update the field. As a pleasant side effect, this change tends to make syntax objects more compact. --- pkgs/base/info.rkt | 2 +- .../tests/racket/stress/stx-concurrent.rkt | 31 + racket/src/expander/expand/main.rkt | 13 +- racket/src/expander/syntax/binding.rkt | 46 +- racket/src/expander/syntax/read-syntax.rkt | 2 +- racket/src/expander/syntax/scope.rkt | 175 ++-- racket/src/expander/syntax/syntax.rkt | 78 +- racket/src/expander/syntax/taint.rkt | 22 +- racket/src/racket/src/schvers.h | 2 +- racket/src/racket/src/startup.inc | 905 ++++++++++++------ 10 files changed, 862 insertions(+), 414 deletions(-) create mode 100644 pkgs/racket-test/tests/racket/stress/stx-concurrent.rkt diff --git a/pkgs/base/info.rkt b/pkgs/base/info.rkt index d44a0cf00e..a93868fb8e 100644 --- a/pkgs/base/info.rkt +++ b/pkgs/base/info.rkt @@ -12,7 +12,7 @@ (define collection 'multi) -(define version "7.7.0.4") +(define version "7.7.0.5") (define deps `("racket-lib" ["racket" #:version ,version])) diff --git a/pkgs/racket-test/tests/racket/stress/stx-concurrent.rkt b/pkgs/racket-test/tests/racket/stress/stx-concurrent.rkt new file mode 100644 index 0000000000..bcf37702eb --- /dev/null +++ b/pkgs/racket-test/tests/racket/stress/stx-concurrent.rkt @@ -0,0 +1,31 @@ +#lang racket/base + +;; Try to provoke a race for the internal side effect of propagating +;; scopes in a syntax object + +(define stx (datum->syntax + #'here + (for/list ([i 10000]) i))) +(define i (make-syntax-introducer)) + +(define (burn n) + (if (zero? n) + 'done + (burn (sub1 n)))) + +(for ([j (in-range 100)]) + (define failed? #f) + (define stx2 (i stx)) + (for-each + sync + (for/list ([i 10]) + (thread (lambda () + (burn (random 100000)) + (unless (eq? (syntax-e stx2) + (begin + (sleep) + (syntax-e stx2))) + (set! failed? #t) + (printf "CHANGED\n")))))) + (when failed? + (error "failed"))) diff --git a/racket/src/expander/expand/main.rkt b/racket/src/expander/expand/main.rkt index 076dafe3e2..b5a304ebe4 100644 --- a/racket/src/expander/expand/main.rkt +++ b/racket/src/expander/expand/main.rkt @@ -73,19 +73,20 @@ ;; For expanding an implicit implemented by a rename transformer: #:fail-non-transformer [fail-non-transformer #f]) (log-expand ctx 'visit s) + (define content (syntax-content s)) (cond - [(syntax-identifier? s) + [(symbol? content) (expand-identifier s ctx alternate-id)] - [(and (pair? (syntax-content s)) - (syntax-identifier? (car (syntax-content s)))) + [(and (pair? content) + (syntax-identifier? (car content))) (expand-id-application-form s ctx alternate-id #:fail-non-transformer fail-non-transformer)] - [(or (pair? (syntax-content s)) - (null? (syntax-content s))) + [(or (pair? content) + (null? content)) ;; An "application" form that doesn't start with an identifier, so ;; use implicit `#%app` (expand-implicit '#%app s ctx #f)] - [(already-expanded? (syntax-content s)) + [(already-expanded? content) (expand-already-expanded s ctx)] [else ;; Anything other than an identifier or parens triggers the diff --git a/racket/src/expander/syntax/binding.rkt b/racket/src/expander/syntax/binding.rkt index d0e583b9e7..9898d834c2 100644 --- a/racket/src/expander/syntax/binding.rkt +++ b/racket/src/expander/syntax/binding.rkt @@ -158,18 +158,25 @@ (define shift (if non-source? (non-source-shift from-mpi to-mpi) (cons from-mpi to-mpi))) + (define content* (syntax-content* s)) + (define content (if (modified-content? content*) + (modified-content-content content*) + content*)) (struct-copy syntax s [mpi-shifts (shift-cons shift (syntax-mpi-shifts s))] [inspector (or (syntax-inspector s) inspector)] - [scope-propagations+tamper (if (datum-has-elements? (syntax-content s)) - (propagation-mpi-shift (syntax-scope-propagations+tamper s) - (lambda (s) (shift-cons shift s)) - inspector - (syntax-scopes s) - (syntax-shifted-multi-scopes s) - (syntax-mpi-shifts s)) - (syntax-scope-propagations+tamper s))])])) + [content* (if (datum-has-elements? content) + (modified-content + content + (propagation-mpi-shift (and (modified-content? content*) + (modified-content-scope-propagations+tamper content*)) + (lambda (s) (shift-cons shift s)) + inspector + (syntax-scopes s) + (syntax-shifted-multi-scopes s) + (syntax-mpi-shifts s))) + content*)])])) (define (shift-cons shift shifts) (cond @@ -303,17 +310,24 @@ (define (syntax-set-inspector s insp) ;; This inspector merging is also implemented via propagations in "scope.rkt" + (define content* (syntax-content* s)) + (define content (if (modified-content? content*) + (modified-content-content content*) + content*)) (struct-copy syntax s [inspector (or (syntax-inspector s) insp)] - [scope-propagations+tamper (if (datum-has-elements? (syntax-content s)) - (propagation-mpi-shift (syntax-scope-propagations+tamper s) - #f - insp - (syntax-scopes s) - (syntax-shifted-multi-scopes s) - (syntax-mpi-shifts s)) - (syntax-scope-propagations+tamper s))])) + [content* (if (datum-has-elements? content) + (modified-content + content + (propagation-mpi-shift (and (modified-content? content*) + (modified-content-scope-propagations+tamper content*)) + #f + insp + (syntax-scopes s) + (syntax-shifted-multi-scopes s) + (syntax-mpi-shifts s))) + content*)])) ;; ---------------------------------------- diff --git a/racket/src/expander/syntax/read-syntax.rkt b/racket/src/expander/syntax/read-syntax.rkt index 717ab9574c..213f04ca5d 100644 --- a/racket/src/expander/syntax/read-syntax.rkt +++ b/racket/src/expander/syntax/read-syntax.rkt @@ -94,7 +94,7 @@ (define (read-to-syntax s-exp srcloc rep) (struct-copy syntax empty-syntax - [content (datum-intern-literal s-exp)] + [content* (datum-intern-literal s-exp)] [srcloc srcloc] [props (case rep [(#\[) original-square-props] diff --git a/racket/src/expander/syntax/scope.rkt b/racket/src/expander/syntax/scope.rkt index dfc5372350..5257f541c7 100644 --- a/racket/src/expander/syntax/scope.rkt +++ b/racket/src/expander/syntax/scope.rkt @@ -379,84 +379,133 @@ ;; Adding, removing, or flipping a scope is propagated ;; lazily to subforms (define-inline (apply-scope s sc op prop-op) + (define content* (syntax-content* s)) + (define content (if (modified-content? content*) + (modified-content-content content*) + content*)) (if (shifted-multi-scope? sc) (struct-copy syntax s [shifted-multi-scopes (fallback-update-first (syntax-shifted-multi-scopes s) (lambda (smss) (op (fallback-first smss) sc)))] - [scope-propagations+tamper (if (datum-has-elements? (syntax-content s)) - (prop-op (syntax-scope-propagations+tamper s) - sc - (syntax-scopes s) - (syntax-shifted-multi-scopes s) - (syntax-mpi-shifts s)) - (syntax-scope-propagations+tamper s))]) + [content* (if (datum-has-elements? content) + (let ([prop (prop-op (and (modified-content? content*) + (modified-content-scope-propagations+tamper content*)) + sc + (syntax-scopes s) + (syntax-shifted-multi-scopes s) + (syntax-mpi-shifts s))]) + (if prop + (modified-content content prop) + content)) + content*)]) (struct-copy syntax s [scopes (op (syntax-scopes s) sc)] - [scope-propagations+tamper (if (datum-has-elements? (syntax-content s)) - (prop-op (syntax-scope-propagations+tamper s) - sc - (syntax-scopes s) - (syntax-shifted-multi-scopes s) - (syntax-mpi-shifts s)) - (syntax-scope-propagations+tamper s))]))) + [content* (if (datum-has-elements? content) + (let ([prop (prop-op (and (modified-content? content*) + (modified-content-scope-propagations+tamper content*)) + sc + (syntax-scopes s) + (syntax-shifted-multi-scopes s) + (syntax-mpi-shifts s))]) + (if prop + (modified-content content prop) + content)) + content*)]))) -(define (syntax-e/no-taint s) - (define prop (syntax-scope-propagations+tamper s)) - (if (or (propagation? prop) - (tamper-needs-propagate? prop)) - (let ([new-content - (non-syntax-map (syntax-content s) +(define (syntax-propagated-content* s) + (define content* (syntax-content* s)) + (cond + [(not (modified-content? content*)) + content*] + [else + (define prop (modified-content-scope-propagations+tamper content*)) + (cond + [(or (propagation? prop) + (tamper-needs-propagate? prop)) + (define content (modified-content-content content*)) + (define new-content + (cond + [(propagation? prop) + (non-syntax-map content (lambda (tail? x) x) (lambda (sub-s) - (if (propagation? prop) - (struct-copy syntax sub-s - [scopes (propagation-apply + (define sub-content* (syntax-content* sub-s)) + (define sub-content (if (modified-content? sub-content*) + (modified-content-content sub-content*) + sub-content*)) + (define scope-propagations+tamper + (propagation-merge + sub-content + prop + (and (modified-content? sub-content*) + (modified-content-scope-propagations+tamper sub-content*)) + (syntax-scopes sub-s) + (syntax-shifted-multi-scopes sub-s) + (syntax-mpi-shifts sub-s))) + (struct-copy syntax sub-s + [scopes (propagation-apply + prop + (syntax-scopes sub-s) + s)] + [shifted-multi-scopes (propagation-apply-shifted + prop + (syntax-shifted-multi-scopes sub-s) + s)] + [mpi-shifts (propagation-apply-mpi-shifts prop - (syntax-scopes sub-s) + (syntax-mpi-shifts sub-s) s)] - [shifted-multi-scopes (propagation-apply-shifted - prop - (syntax-shifted-multi-scopes sub-s) - s)] - [mpi-shifts (propagation-apply-mpi-shifts - prop - (syntax-mpi-shifts sub-s) - s)] - [inspector (propagation-apply-inspector - prop - (syntax-inspector sub-s))] - [scope-propagations+tamper (propagation-merge - (syntax-content sub-s) - prop - (syntax-scope-propagations+tamper sub-s) - (syntax-scopes sub-s) - (syntax-shifted-multi-scopes sub-s) - (syntax-mpi-shifts sub-s))]) - (struct-copy/t syntax sub-s - [tamper (tamper-tainted-for-content - (syntax-content sub-s))]))))]) - (set-syntax-content! s new-content) - (set-syntax-scope-propagations+tamper! s (tamper-propagated (if (propagation? prop) - (propagation-tamper prop) - prop))) - new-content) - (syntax-content s))) + [inspector (propagation-apply-inspector + prop + (syntax-inspector sub-s))] + [content* (if scope-propagations+tamper + (modified-content sub-content scope-propagations+tamper) + sub-content)])))] + [else + (non-syntax-map content + (lambda (tail? x) x) + (lambda (sub-s) + (struct-copy/t syntax sub-s + [tamper (tamper-tainted-for-content + (syntax-content sub-s))])))])) + (define new-tamper (tamper-propagated (if (propagation? prop) + (propagation-tamper prop) + prop))) + (define new-content* (if new-tamper + (modified-content new-content new-tamper) + new-content)) + (if (syntax-content*-cas! s content* new-content*) + new-content* + ;; some other thread beat us to it? + (syntax-propagated-content* s))] + [else content*])])) + +(define (syntax-e/no-taint s) + (define content* (syntax-propagated-content* s)) + (if (modified-content? content*) + (modified-content-content content*) + content*)) (define (syntax-e s) - (define e (syntax-content s)) + (define e (syntax-content* s)) (cond ;; Shortcut for most common case: [(symbol? e) e] ;; General case: [else - (define content (syntax-e/no-taint s)) - ;; Since we just called `syntax-e/no-taint`, we know that - ;; `(syntax-scope-propagations+tamper s)` is not a propagation + (define content* (syntax-propagated-content* s)) (cond - [(not (tamper-armed? (syntax-scope-propagations+tamper s))) content] - [(datum-has-elements? content) (taint-content content)] - [else content])])) + [(modified-content? content*) + (define content (modified-content-content content*)) + (define prop (modified-content-scope-propagations+tamper content*)) + ;; Since we just called `syntax-propagate-content*`, we know that + ;; `prop` is not a propagation + (cond + [(not (tamper-armed? prop)) content] + [(datum-has-elements? content) (taint-content content)] + [else content])] + [else content*])])) ;; When a representative-scope is manipulated, we want to ;; manipulate the multi scope, instead (at a particular @@ -507,7 +556,7 @@ (lambda (tail? x) x) (lambda (s d) (struct-copy syntax s - [content d] + [content* (re-modify-content s d)] [shifted-multi-scopes (push (syntax-shifted-multi-scopes s))])) syntax-e/no-taint)) @@ -558,8 +607,8 @@ (= 1 (hash-count ops)) (not (propagation-inspector prop)) (not (propagation-add-mpi-shifts prop))) - ;; Nothing left to propagate - #f] + ;; Nothing left to propagate, except maybe taint + (propagation-tamper prop)] [else (struct-copy propagation prop [scope-ops @@ -754,7 +803,7 @@ (lambda (tail? d) d) (lambda (s d) (struct-copy syntax s - [content d] + [content* (re-modify-content s d)] [shifted-multi-scopes (shift-all (syntax-shifted-multi-scopes s))])) syntax-e/no-taint)))) @@ -797,7 +846,7 @@ (lambda (tail? d) d) (lambda (s d) (struct-copy syntax s - [content d] + [content* (re-modify-content s d)] [scopes (swap-scs (syntax-scopes s))] [shifted-multi-scopes (swap-smss (syntax-shifted-multi-scopes s))])) diff --git a/racket/src/expander/syntax/syntax.rkt b/racket/src/expander/syntax/syntax.rkt index b63a6e789f..2bd2407ece 100644 --- a/racket/src/expander/syntax/syntax.rkt +++ b/racket/src/expander/syntax/syntax.rkt @@ -1,6 +1,7 @@ #lang racket/base (require racket/private/place-local racket/fixnum + (only-in racket/unsafe/ops unsafe-struct*-cas!) "../compile/serialize-property.rkt" "../compile/serialize-state.rkt" "../common/set.rkt" @@ -13,10 +14,15 @@ (provide (struct-out syntax) ; includes `syntax?` + syntax-content syntax-tamper empty-syntax identifier? syntax-identifier? + + (struct-out modified-content) + re-modify-content + syntax-content*-cas! syntax->datum datum->syntax @@ -36,10 +42,14 @@ syntax-place-init!) -(struct syntax ([content #:mutable] ; datum and nested syntax objects; mutated for lazy propagation +;; Used for content wrapped with scope propagations and/or a tamper, +;; so a `content*` is either a `modified-content` or plain content +(struct modified-content (content scope-propagations+tamper) + #:authentic) + +(struct syntax ([content* #:mutable] ; datum and nested syntax objects; mutated for lazy propagation scopes ; scopes that apply at all phases shifted-multi-scopes ; scopes with a distinct identity at each phase; maybe a fallback search - [scope-propagations+tamper #:mutable] ; lazy propagation info and/or tamper state mpi-shifts ; chain of module-path-index substitutions srcloc ; source location props ; properties @@ -58,11 +68,14 @@ (write-string ">" port)) #:property prop:serialize (lambda (s ser-push! state) - (define prop (syntax-scope-propagations+tamper s)) + (define content* (syntax-content* s)) (define content - (if (propagation? prop) - ((propagation-ref prop) s) - (syntax-content s))) + (if (modified-content? content*) + (let ([prop (modified-content-scope-propagations+tamper content*)]) + (if (propagation? prop) + ((propagation-ref prop) s) + (modified-content-content content*))) + content*)) (define properties (intern-properties (syntax-props s) @@ -135,10 +148,14 @@ (set-syntax-state-all-sharing?! stx-state #f)))])) #:property prop:reach-scopes (lambda (s reach) - (define prop (syntax-scope-propagations+tamper s)) - (reach (if (propagation? prop) + (define content* (syntax-content* s)) + (reach + (if (modified-content? content*) + (let ([prop (modified-content-scope-propagations+tamper content*)]) + (if (propagation? prop) ((propagation-ref prop) s) - (syntax-content s))) + (modified-content-content content*))) + content*)) (reach (syntax-scopes s)) (reach (syntax-shifted-multi-scopes s)) (for ([(k v) (in-immutable-hash (syntax-props s))] @@ -158,11 +175,30 @@ (define-values (prop:propagation-set-tamper propagation-set-tamper? propagation-set-tamper-ref) (make-struct-type-property 'propagation-set-tamper)) +(define (syntax-content s) + (define content* (syntax-content* s)) + (if (modified-content? content*) + (modified-content-content content*) + content*)) + (define (syntax-tamper s) - (define v (syntax-scope-propagations+tamper s)) - (if (tamper? v) - v - ((propagation-tamper-ref v) v))) + (define content* (syntax-content* s)) + (cond + [(modified-content? content*) + (define v (modified-content-scope-propagations+tamper content*)) + (if (tamper? v) + v + ((propagation-tamper-ref v) v))] + [else #f])) + +(define (syntax-content*-cas! stx old new) + (unsafe-struct*-cas! stx 0 old new)) + +(define (re-modify-content s d) + (define content* (syntax-content* s)) + (if (modified-content? content*) + (modified-content d (modified-content-scope-propagations+tamper content*)) + d)) ;; ---------------------------------------- @@ -175,7 +211,6 @@ (syntax #f empty-scopes empty-shifted-multi-scopes - #f ; scope-propogations+tamper (clean) empty-mpi-shifts #f ; srcloc empty-props @@ -198,16 +233,17 @@ [else (define insp (if (syntax? s) 'not-needed (current-module-code-inspector))) (define (wrap content) - (syntax content + (syntax (if (and stx-c + (syntax-tamper stx-c)) + (modified-content content + (tamper-tainted-for-content content)) + content) (if stx-c (syntax-scopes stx-c) empty-scopes) (if stx-c (syntax-shifted-multi-scopes stx-c) empty-shifted-multi-scopes) - (and stx-c - (syntax-tamper stx-c) - (tamper-tainted-for-content content)) (if stx-c (syntax-mpi-shifts stx-c) empty-mpi-shifts) @@ -308,10 +344,12 @@ ;; Called by the deserializer (define (deserialize-syntax content context-triple srcloc props tamper inspector) - (syntax content + (syntax (let ([t (deserialize-tamper tamper)]) + (if t + (modified-content content t) + content)) (vector*-ref context-triple 0) (vector*-ref context-triple 1) - (deserialize-tamper tamper) (vector*-ref context-triple 2) srcloc (if props diff --git a/racket/src/expander/syntax/taint.rkt b/racket/src/expander/syntax/taint.rkt index 66d27ce071..37292b7f8b 100644 --- a/racket/src/expander/syntax/taint.rkt +++ b/racket/src/expander/syntax/taint.rkt @@ -17,14 +17,22 @@ (define-syntax struct-copy/t (syntax-rules (syntax tamper) [(struct-copy/t syntax s [tamper v]) - (let ([stx s]) + (let* ([stx s] + [t v] + [content* (syntax-content* stx)] + [content (if (modified-content? content*) + (modified-content-content content*) + content*)] + [p (and (modified-content? content*) + (modified-content-scope-propagations+tamper content*))]) (struct-copy syntax stx - [scope-propagations+tamper - (let ([t v] - [p (syntax-scope-propagations+tamper stx)]) - (if (tamper? p) - t - ((propagation-set-tamper-ref p) p t)))]))])) + [content* + (let ([new-p (if (tamper? p) + t + ((propagation-set-tamper-ref p) p t))]) + (if new-p + (modified-content content new-p) + content))]))])) (define (taint-content d) (non-syntax-map d diff --git a/racket/src/racket/src/schvers.h b/racket/src/racket/src/schvers.h index f26248202d..3f13deb7bf 100644 --- a/racket/src/racket/src/schvers.h +++ b/racket/src/racket/src/schvers.h @@ -16,7 +16,7 @@ #define MZSCHEME_VERSION_X 7 #define MZSCHEME_VERSION_Y 7 #define MZSCHEME_VERSION_Z 0 -#define MZSCHEME_VERSION_W 4 +#define MZSCHEME_VERSION_W 5 /* A level of indirection makes `#` work as needed: */ #define AS_a_STR_HELPER(x) #x diff --git a/racket/src/racket/src/startup.inc b/racket/src/racket/src/startup.inc index 50ef818608..a43fadea15 100644 --- a/racket/src/racket/src/startup.inc +++ b/racket/src/racket/src/startup.inc @@ -5797,26 +5797,51 @@ static const char *startup_source = "(define-values(current-arm-inspectors)(make-parameter(seteq) #f 'current-arm-inspectors))" "(define-values(deserialize-tamper)(lambda(t_0)(begin(if(eq? t_0 'armed)(current-arm-inspectors) t_0))))" "(define-values" +"(struct:modified-content" +" modified-content1.1" +" modified-content?" +" modified-content-content" +" modified-content-scope-propagations+tamper)" +"(let-values(((struct:_0 make-_0 ?_0 -ref_0 -set!_0)" +"(let-values()" +"(let-values()" +"(make-struct-type" +" 'modified-content" +" #f" +" 2" +" 0" +" #f" +"(list(cons prop:authentic #t))" +"(current-inspector)" +" #f" +" '(0 1)" +" #f" +" 'modified-content)))))" +"(values" +" struct:_0" +" make-_0" +" ?_0" +"(make-struct-field-accessor -ref_0 0 'content)" +"(make-struct-field-accessor -ref_0 1 'scope-propagations+tamper))))" +"(define-values" "(struct:syntax" -" syntax1.1" +" syntax2.1" " syntax?$1" -" syntax-content" +" syntax-content*" " syntax-scopes" " syntax-shifted-multi-scopes" -" syntax-scope-propagations+tamper" " syntax-mpi-shifts" " syntax-srcloc" " syntax-props" " syntax-inspector" -" set-syntax-content!" -" set-syntax-scope-propagations+tamper!)" +" set-syntax-content*!)" "(let-values(((struct:_0 make-_0 ?_0 -ref_0 -set!_0)" "(let-values()" "(let-values()" "(make-struct-type" " 'syntax" " #f" -" 8" +" 7" " 0" " #f" "(list" @@ -5824,9 +5849,15 @@ static const char *startup_source = "(cons" " prop:reach-scopes" "(lambda(s_0 reach_0)" -"(let-values(((prop_0)(syntax-scope-propagations+tamper s_0)))" +"(let-values(((content*_0)(syntax-content* s_0)))" "(begin" -"(reach_0(if(propagation?$1 prop_0)((propagation-ref prop_0) s_0)(syntax-content s_0)))" +"(reach_0" +"(if(modified-content? content*_0)" +"(let-values(((prop_0)(modified-content-scope-propagations+tamper content*_0)))" +"(if(propagation?$1 prop_0)" +"((propagation-ref prop_0) s_0)" +"(modified-content-content content*_0)))" +" content*_0))" "(reach_0(syntax-scopes s_0))" "(reach_0(syntax-shifted-multi-scopes s_0))" "(let-values(((ht_0)(syntax-props s_0)))" @@ -5869,11 +5900,15 @@ static const char *startup_source = "(cons" " prop:serialize" "(lambda(s_0 ser-push!_0 state_0)" -"(let-values(((prop_0)(syntax-scope-propagations+tamper s_0)))" +"(let-values(((content*_0)(syntax-content* s_0)))" "(let-values(((content_0)" +"(if(modified-content? content*_0)" +"(let-values(((prop_0)" +"(modified-content-scope-propagations+tamper content*_0)))" "(if(propagation?$1 prop_0)" "((propagation-ref prop_0) s_0)" -"(syntax-content s_0))))" +"(modified-content-content content*_0)))" +" content*_0)))" "(let-values(((properties_0)" "(intern-properties" "(syntax-props s_0)" @@ -5965,7 +6000,7 @@ static const char *startup_source = "(let-values((()(begin(ser-push!_0 'tag '#:syntax)(values))))" "(let-values(((this-state_0)" "(if(no-pair-syntax-in-cdr? content_0)" -"(syntax-state16.1" +"(syntax-state17.1" " #t" " context-triple_0" "(syntax-srcloc s_0))" @@ -6030,23 +6065,21 @@ static const char *startup_source = " (write-string \">\" port_0)))))))" "(current-inspector)" " #f" -" '(1 2 4 5 6 7)" +" '(1 2 3 4 5 6)" " #f" " 'syntax)))))" "(values" " struct:_0" " make-_0" " ?_0" -"(make-struct-field-accessor -ref_0 0 'content)" +"(make-struct-field-accessor -ref_0 0 'content*)" "(make-struct-field-accessor -ref_0 1 'scopes)" "(make-struct-field-accessor -ref_0 2 'shifted-multi-scopes)" -"(make-struct-field-accessor -ref_0 3 'scope-propagations+tamper)" -"(make-struct-field-accessor -ref_0 4 'mpi-shifts)" -"(make-struct-field-accessor -ref_0 5 'srcloc)" -"(make-struct-field-accessor -ref_0 6 'props)" -"(make-struct-field-accessor -ref_0 7 'inspector)" -"(make-struct-field-mutator -set!_0 0 'content)" -"(make-struct-field-mutator -set!_0 3 'scope-propagations+tamper))))" +"(make-struct-field-accessor -ref_0 3 'mpi-shifts)" +"(make-struct-field-accessor -ref_0 4 'srcloc)" +"(make-struct-field-accessor -ref_0 5 'props)" +"(make-struct-field-accessor -ref_0 6 'inspector)" +"(make-struct-field-mutator -set!_0 0 'content*))))" "(define-values(prop:propagation propagation?$1 propagation-ref)(make-struct-type-property 'propagation))" "(define-values" "(prop:propagation-tamper propagation-tamper? propagation-tamper-ref)" @@ -6055,18 +6088,37 @@ static const char *startup_source = "(prop:propagation-set-tamper propagation-set-tamper? propagation-set-tamper-ref)" "(make-struct-type-property 'propagation-set-tamper))" "(define-values" +"(syntax-content)" +"(lambda(s_0)" +"(begin" +"(let-values(((content*_0)(syntax-content* s_0)))" +"(if(modified-content? content*_0)(modified-content-content content*_0) content*_0)))))" +"(define-values" "(syntax-tamper)" "(lambda(s_0)" "(begin" -"(let-values(((v_0)(syntax-scope-propagations+tamper s_0)))" -"(if(tamper? v_0) v_0((propagation-tamper-ref v_0) v_0))))))" +"(let-values(((content*_0)(syntax-content* s_0)))" +"(if(modified-content? content*_0)" +"(let-values()" +"(let-values(((v_0)(modified-content-scope-propagations+tamper content*_0)))" +"(if(tamper? v_0) v_0((propagation-tamper-ref v_0) v_0))))" +"(let-values() #f))))))" +"(define-values(syntax-content*-cas!)(lambda(stx_0 old_0 new_0)(begin(unsafe-struct*-cas! stx_0 0 old_0 new_0))))" +"(define-values" +"(re-modify-content)" +"(lambda(s_0 d_0)" +"(begin" +"(let-values(((content*_0)(syntax-content* s_0)))" +"(if(modified-content? content*_0)" +"(modified-content1.1 d_0(modified-content-scope-propagations+tamper content*_0))" +" d_0)))))" "(define-values(empty-scopes)(seteq))" "(define-values(empty-shifted-multi-scopes)(seteq))" "(define-values(empty-mpi-shifts) null)" "(define-values(empty-props) '#hasheq())" "(define-values" "(empty-syntax)" -"(syntax1.1 #f empty-scopes empty-shifted-multi-scopes #f empty-mpi-shifts #f empty-props #f))" +"(syntax2.1 #f empty-scopes empty-shifted-multi-scopes empty-mpi-shifts #f empty-props #f))" "(define-values(identifier?)(lambda(s_0)(begin(if(syntax?$1 s_0)(symbol?(syntax-content s_0)) #f))))" "(define-values(syntax-identifier?)(lambda(s_0)(begin(symbol?(syntax-content s_0)))))" "(define-values" @@ -6151,13 +6203,13 @@ static const char *startup_source = "(define-values" "(datum->syntax$1)" "(let-values(((datum->syntax_0)" -"(lambda(stx-c4_0 s5_0 stx-l2_0 stx-p3_0)" +"(lambda(stx-c5_0 s6_0 stx-l3_0 stx-p4_0)" "(begin" " 'datum->syntax" -"(let-values(((stx-c_0) stx-c4_0))" -"(let-values(((s_0) s5_0))" -"(let-values(((stx-l_0) stx-l2_0))" -"(let-values(((stx-p_0) stx-p3_0))" +"(let-values(((stx-c_0) stx-c5_0))" +"(let-values(((s_0) s6_0))" +"(let-values(((stx-l_0) stx-l3_0))" +"(let-values(((stx-p_0) stx-p4_0))" "(let-values()" "(if(syntax?$1 s_0)" "(let-values() s_0)" @@ -6168,17 +6220,16 @@ static const char *startup_source = "(lambda(content_0)" "(begin" " 'wrap" -"(syntax1.1" +"(syntax2.1" +"(if(if stx-c_0(syntax-tamper stx-c_0) #f)" +"(modified-content1.1" " content_0" +"(tamper-tainted-for-content content_0))" +" content_0)" "(if stx-c_0(syntax-scopes stx-c_0) empty-scopes)" "(if stx-c_0" "(syntax-shifted-multi-scopes stx-c_0)" " empty-shifted-multi-scopes)" -"(if stx-c_0" -"(if(syntax-tamper stx-c_0)" -"(tamper-tainted-for-content content_0)" -" #f)" -" #f)" "(if stx-c_0(syntax-mpi-shifts stx-c_0) empty-mpi-shifts)" "(if stx-l_0(syntax-srcloc stx-l_0) #f)" " empty-props" @@ -6304,22 +6355,21 @@ static const char *startup_source = "(if(if stx-p_0(not(eq?(syntax-props stx-p_0) empty-props)) #f)" "(let-values(((the-struct_0) result-s_0))" "(if(syntax?$1 the-struct_0)" -"(let-values(((props18_0)(syntax-props stx-p_0)))" -"(syntax1.1" -"(syntax-content the-struct_0)" +"(let-values(((props20_0)(syntax-props stx-p_0)))" +"(syntax2.1" +"(syntax-content* the-struct_0)" "(syntax-scopes the-struct_0)" "(syntax-shifted-multi-scopes the-struct_0)" -"(syntax-scope-propagations+tamper the-struct_0)" "(syntax-mpi-shifts the-struct_0)" "(syntax-srcloc the-struct_0)" -" props18_0" +" props20_0" "(syntax-inspector the-struct_0)))" " (raise-argument-error 'struct-copy \"syntax?\" the-struct_0)))" " result-s_0)))))))))))))))" "(case-lambda" "((stx-c_0 s_0)(begin 'datum->syntax(datum->syntax_0 stx-c_0 s_0 #f #f)))" -"((stx-c_0 s_0 stx-l_0 stx-p3_0)(datum->syntax_0 stx-c_0 s_0 stx-l_0 stx-p3_0))" -"((stx-c_0 s_0 stx-l2_0)(datum->syntax_0 stx-c_0 s_0 stx-l2_0 #f)))))" +"((stx-c_0 s_0 stx-l_0 stx-p4_0)(datum->syntax_0 stx-c_0 s_0 stx-l_0 stx-p4_0))" +"((stx-c_0 s_0 stx-l3_0)(datum->syntax_0 stx-c_0 s_0 stx-l3_0 #f)))))" "(define-values" "(disallow-cycles)" "(hasheq" @@ -6328,7 +6378,7 @@ static const char *startup_source = "(define-values(syntax-place-init!)(lambda()(begin(unsafe-place-local-set! cell.1$7(make-weak-hasheq)))))" "(define-values" "(struct:syntax-state" -" syntax-state16.1" +" syntax-state17.1" " syntax-state?" " syntax-state-all-sharing?" " syntax-state-context-triple" @@ -6379,11 +6429,10 @@ static const char *startup_source = "(deserialize-syntax)" "(lambda(content_0 context-triple_0 srcloc_0 props_0 tamper_0 inspector_0)" "(begin" -"(syntax1.1" -" content_0" +"(syntax2.1" +"(let-values(((t_0)(deserialize-tamper tamper_0)))(if t_0(modified-content1.1 content_0 t_0) content_0))" "(vector*-ref context-triple_0 0)" "(vector*-ref context-triple_0 1)" -"(deserialize-tamper tamper_0)" "(vector*-ref context-triple_0 2)" " srcloc_0" "(if props_0" @@ -7693,11 +7742,10 @@ static const char *startup_source = "(let-values(((the-struct_0) s_0))" "(if(syntax?$1 the-struct_0)" "(let-values(((props2_0)(hash-set(syntax-props s_0) key_0 pval_0)))" -"(syntax1.1" -"(syntax-content the-struct_0)" +"(syntax2.1" +"(syntax-content* the-struct_0)" "(syntax-scopes the-struct_0)" "(syntax-shifted-multi-scopes the-struct_0)" -"(syntax-scope-propagations+tamper the-struct_0)" "(syntax-mpi-shifts the-struct_0)" "(syntax-srcloc the-struct_0)" " props2_0" @@ -7730,11 +7778,10 @@ static const char *startup_source = "(let-values(((the-struct_0) s_0))" "(if(syntax?$1 the-struct_0)" "(let-values(((props3_0)(hash-set(syntax-props s_0) key_0 pval_0)))" -"(syntax1.1" -"(syntax-content the-struct_0)" +"(syntax2.1" +"(syntax-content* the-struct_0)" "(syntax-scopes the-struct_0)" "(syntax-shifted-multi-scopes the-struct_0)" -"(syntax-scope-propagations+tamper the-struct_0)" "(syntax-mpi-shifts the-struct_0)" "(syntax-srcloc the-struct_0)" " props3_0" @@ -7804,11 +7851,10 @@ static const char *startup_source = "(let-values(((the-struct_0) s_0))" "(if(syntax?$1 the-struct_0)" "(let-values(((props7_0)(hash-remove(syntax-props s_0) key_0)))" -"(syntax1.1" -"(syntax-content the-struct_0)" +"(syntax2.1" +"(syntax-content* the-struct_0)" "(syntax-scopes the-struct_0)" "(syntax-shifted-multi-scopes the-struct_0)" -"(syntax-scope-propagations+tamper the-struct_0)" "(syntax-mpi-shifts the-struct_0)" "(syntax-srcloc the-struct_0)" " props7_0" @@ -7829,23 +7875,35 @@ static const char *startup_source = "(let-values() sub-s_0)" "(let-values()" "(let-values(((stx_0) sub-s_0))" +"(let-values(((t_0)(tamper-tainted-for-content(syntax-content sub-s_0))))" +"(let-values(((content*_0)(syntax-content* stx_0)))" +"(let-values(((content_0)" +"(if(modified-content? content*_0)" +"(modified-content-content content*_0)" +" content*_0)))" +"(let-values(((p_0)" +"(if(modified-content? content*_0)" +"(modified-content-scope-propagations+tamper content*_0)" +" #f)))" "(let-values(((the-struct_0) stx_0))" "(if(syntax?$1 the-struct_0)" -"(let-values(((scope-propagations+tamper3_0)" -"(let-values(((t_0)" -"(tamper-tainted-for-content(syntax-content sub-s_0)))" -"((p_0)(syntax-scope-propagations+tamper stx_0)))" -"(if(tamper? p_0) t_0((propagation-set-tamper-ref p_0) p_0 t_0)))))" -"(syntax1.1" -"(syntax-content the-struct_0)" +"(let-values(((content*3_0)" +"(let-values(((new-p_0)" +"(if(tamper? p_0)" +" t_0" +"((propagation-set-tamper-ref p_0) p_0 t_0))))" +"(if new-p_0" +"(modified-content1.1 content_0 new-p_0)" +" content_0))))" +"(syntax2.1" +" content*3_0" "(syntax-scopes the-struct_0)" "(syntax-shifted-multi-scopes the-struct_0)" -" scope-propagations+tamper3_0" "(syntax-mpi-shifts the-struct_0)" "(syntax-srcloc the-struct_0)" "(syntax-props the-struct_0)" "(syntax-inspector the-struct_0)))" -" (raise-argument-error 'struct-copy \"syntax?\" the-struct_0)))))))))" +" (raise-argument-error 'struct-copy \"syntax?\" the-struct_0)))))))))))))" "((seen_0) #f)" "((known-pairs_0) #f))" "(let-values(((s_1) s_0)" @@ -7949,22 +8007,31 @@ static const char *startup_source = "(let-values() s_0)" "(let-values()" "(let-values(((stx_0) s_0))" +"(let-values(((t_1)(set-add(if t_0(remove-inferior t_0 insp_0)(seteq)) insp_0)))" +"(let-values(((content*_0)(syntax-content* stx_0)))" +"(let-values(((content_0)" +"(if(modified-content? content*_0)(modified-content-content content*_0) content*_0)))" +"(let-values(((p_0)" +"(if(modified-content? content*_0)" +"(modified-content-scope-propagations+tamper content*_0)" +" #f)))" "(let-values(((the-struct_0) stx_0))" "(if(syntax?$1 the-struct_0)" -"(let-values(((scope-propagations+tamper4_0)" -"(let-values(((t_1)(set-add(if t_0(remove-inferior t_0 insp_0)(seteq)) insp_0))" -"((p_0)(syntax-scope-propagations+tamper stx_0)))" -"(if(tamper? p_0) t_1((propagation-set-tamper-ref p_0) p_0 t_1)))))" -"(syntax1.1" -"(syntax-content the-struct_0)" +"(let-values(((content*4_0)" +"(let-values(((new-p_0)" +"(if(tamper? p_0)" +" t_1" +"((propagation-set-tamper-ref p_0) p_0 t_1))))" +"(if new-p_0(modified-content1.1 content_0 new-p_0) content_0))))" +"(syntax2.1" +" content*4_0" "(syntax-scopes the-struct_0)" "(syntax-shifted-multi-scopes the-struct_0)" -" scope-propagations+tamper4_0" "(syntax-mpi-shifts the-struct_0)" "(syntax-srcloc the-struct_0)" "(syntax-props the-struct_0)" "(syntax-inspector the-struct_0)))" -" (raise-argument-error 'struct-copy \"syntax?\" the-struct_0)))))))))))" +" (raise-argument-error 'struct-copy \"syntax?\" the-struct_0)))))))))))))))" "(define-values" "(remove-inferior)" "(lambda(t_0 insp_0)" @@ -8016,45 +8083,74 @@ static const char *startup_source = "(if(not insp_0)" "(let-values()" "(let-values(((stx_0) s_0))" +"(let-values(((t_1) #f))" +"(let-values(((content*_0)(syntax-content* stx_0)))" +"(let-values(((content_0)" +"(if(modified-content? content*_0)" +"(modified-content-content content*_0)" +" content*_0)))" +"(let-values(((p_0)" +"(if(modified-content? content*_0)" +"(modified-content-scope-propagations+tamper content*_0)" +" #f)))" "(let-values(((the-struct_0) stx_0))" "(if(syntax?$1 the-struct_0)" -"(let-values(((scope-propagations+tamper5_0)" -"(let-values(((t_1) #f)" -"((p_0)(syntax-scope-propagations+tamper stx_0)))" +"(let-values(((content*5_0)" +"(let-values(((new-p_0)" "(if(tamper? p_0)" " t_1" -"((propagation-set-tamper-ref p_0) p_0 t_1)))))" -"(syntax1.1" -"(syntax-content the-struct_0)" +"((propagation-set-tamper-ref p_0)" +" p_0" +" t_1))))" +"(if new-p_0" +"(modified-content1.1 content_0 new-p_0)" +" content_0))))" +"(syntax2.1" +" content*5_0" "(syntax-scopes the-struct_0)" "(syntax-shifted-multi-scopes the-struct_0)" -" scope-propagations+tamper5_0" "(syntax-mpi-shifts the-struct_0)" "(syntax-srcloc the-struct_0)" "(syntax-props the-struct_0)" "(syntax-inspector the-struct_0)))" -" (raise-argument-error 'struct-copy \"syntax?\" the-struct_0)))))" +" (raise-argument-error 'struct-copy \"syntax?\" the-struct_0)))))))))" "(let-values()" "(let-values(((new-t_0)(remove-inferior t_0 insp_0)))" "(let-values(((stx_0) s_0))" +"(let-values(((t_1)(if(not(set-empty? new-t_0)) new-t_0 #f)))" +"(let-values(((content*_0)(syntax-content* stx_0)))" +"(let-values(((content_0)" +"(if(modified-content? content*_0)" +"(modified-content-content content*_0)" +" content*_0)))" +"(let-values(((p_0)" +"(if(modified-content? content*_0)" +"(modified-content-scope-propagations+tamper content*_0)" +" #f)))" "(let-values(((the-struct_0) stx_0))" "(if(syntax?$1 the-struct_0)" -"(let-values(((scope-propagations+tamper6_0)" -"(let-values(((t_1)(if(not(set-empty? new-t_0)) new-t_0 #f))" -"((p_0)(syntax-scope-propagations+tamper stx_0)))" +"(let-values(((content*6_0)" +"(let-values(((new-p_0)" "(if(tamper? p_0)" " t_1" -"((propagation-set-tamper-ref p_0) p_0 t_1)))))" -"(syntax1.1" -"(syntax-content the-struct_0)" +"((propagation-set-tamper-ref p_0)" +" p_0" +" t_1))))" +"(if new-p_0" +"(modified-content1.1 content_0 new-p_0)" +" content_0))))" +"(syntax2.1" +" content*6_0" "(syntax-scopes the-struct_0)" "(syntax-shifted-multi-scopes the-struct_0)" -" scope-propagations+tamper6_0" "(syntax-mpi-shifts the-struct_0)" "(syntax-srcloc the-struct_0)" "(syntax-props the-struct_0)" "(syntax-inspector the-struct_0)))" -" (raise-argument-error 'struct-copy \"syntax?\" the-struct_0))))))))))))))))" +"(raise-argument-error" +" 'struct-copy" +" \"syntax?\"" +" the-struct_0))))))))))))))))))))" "(case-lambda" "((s_0)(begin 'syntax-disarm(syntax-disarm_0 s_0 #f)))" "((s_0 insp1_0)(syntax-disarm_0 s_0 insp1_0)))))" @@ -8073,46 +8169,65 @@ static const char *startup_source = "(if(tamper-tainted? from-t_0)" "(let-values()" "(let-values(((stx_0) s_0))" +"(let-values(((t_1)(tamper-tainted-for-content(syntax-content s_0))))" +"(let-values(((content*_0)(syntax-content* stx_0)))" +"(let-values(((content_0)" +"(if(modified-content? content*_0)" +"(modified-content-content content*_0)" +" content*_0)))" +"(let-values(((p_0)" +"(if(modified-content? content*_0)" +"(modified-content-scope-propagations+tamper content*_0)" +" #f)))" "(let-values(((the-struct_0) stx_0))" "(if(syntax?$1 the-struct_0)" -"(let-values(((scope-propagations+tamper7_0)" -"(let-values(((t_1)(tamper-tainted-for-content(syntax-content s_0)))" -"((p_0)(syntax-scope-propagations+tamper stx_0)))" -"(if(tamper? p_0) t_1((propagation-set-tamper-ref p_0) p_0 t_1)))))" -"(syntax1.1" -"(syntax-content the-struct_0)" +"(let-values(((content*7_0)" +"(let-values(((new-p_0)" +"(if(tamper? p_0)" +" t_1" +"((propagation-set-tamper-ref p_0) p_0 t_1))))" +"(if new-p_0(modified-content1.1 content_0 new-p_0) content_0))))" +"(syntax2.1" +" content*7_0" "(syntax-scopes the-struct_0)" "(syntax-shifted-multi-scopes the-struct_0)" -" scope-propagations+tamper7_0" "(syntax-mpi-shifts the-struct_0)" "(syntax-srcloc the-struct_0)" "(syntax-props the-struct_0)" "(syntax-inspector the-struct_0)))" -" (raise-argument-error 'struct-copy \"syntax?\" the-struct_0)))))" +" (raise-argument-error 'struct-copy \"syntax?\" the-struct_0)))))))))" "(if(tamper-clean? t_0)" "(let-values()" "(let-values(((stx_0) s_0))" +"(let-values(((t_1) from-t_0))" +"(let-values(((content*_0)(syntax-content* stx_0)))" +"(let-values(((content_0)" +"(if(modified-content? content*_0)" +"(modified-content-content content*_0)" +" content*_0)))" +"(let-values(((p_0)" +"(if(modified-content? content*_0)" +"(modified-content-scope-propagations+tamper content*_0)" +" #f)))" "(let-values(((the-struct_0) stx_0))" "(if(syntax?$1 the-struct_0)" -"(let-values(((scope-propagations+tamper8_0)" -"(let-values(((t_1) from-t_0)" -"((p_0)(syntax-scope-propagations+tamper stx_0)))" -"(if(tamper? p_0) t_1((propagation-set-tamper-ref p_0) p_0 t_1)))))" -"(syntax1.1" -"(syntax-content the-struct_0)" +"(let-values(((content*8_0)" +"(let-values(((new-p_0)" +"(if(tamper? p_0)" +" t_1" +"((propagation-set-tamper-ref p_0) p_0 t_1))))" +"(if new-p_0(modified-content1.1 content_0 new-p_0) content_0))))" +"(syntax2.1" +" content*8_0" "(syntax-scopes the-struct_0)" "(syntax-shifted-multi-scopes the-struct_0)" -" scope-propagations+tamper8_0" "(syntax-mpi-shifts the-struct_0)" "(syntax-srcloc the-struct_0)" "(syntax-props the-struct_0)" "(syntax-inspector the-struct_0)))" -" (raise-argument-error 'struct-copy \"syntax?\" the-struct_0)))))" +" (raise-argument-error 'struct-copy \"syntax?\" the-struct_0)))))))))" "(let-values()" "(let-values(((stx_0) s_0))" -"(let-values(((the-struct_0) stx_0))" -"(if(syntax?$1 the-struct_0)" -"(let-values(((scope-propagations+tamper9_0)" "(let-values(((t_1)" "(let-values(((ht_0) from-t_0))" "(begin" @@ -8129,8 +8244,7 @@ static const char *startup_source = " ht_0" " i_0)))" "(let-values(((t_2)" -"(let-values(((t_2)" -" t_1))" +"(let-values(((t_2) t_1))" "(let-values(((t_3)" "(let-values()" "(if(set-member?" @@ -8153,26 +8267,38 @@ static const char *startup_source = "(if(not #f)" "(for-loop_0" " t_2" -"(unsafe-immutable-hash-iterate-next" -" ht_0" -" i_0))" +"(unsafe-immutable-hash-iterate-next ht_0 i_0))" " t_2)))" " t_1)))))" " for-loop_0)" " t_0" -"(unsafe-immutable-hash-iterate-first ht_0)))))" -"((p_0)(syntax-scope-propagations+tamper stx_0)))" -"(if(tamper? p_0) t_1((propagation-set-tamper-ref p_0) p_0 t_1)))))" -"(syntax1.1" -"(syntax-content the-struct_0)" +"(unsafe-immutable-hash-iterate-first ht_0))))))" +"(let-values(((content*_0)(syntax-content* stx_0)))" +"(let-values(((content_0)" +"(if(modified-content? content*_0)" +"(modified-content-content content*_0)" +" content*_0)))" +"(let-values(((p_0)" +"(if(modified-content? content*_0)" +"(modified-content-scope-propagations+tamper content*_0)" +" #f)))" +"(let-values(((the-struct_0) stx_0))" +"(if(syntax?$1 the-struct_0)" +"(let-values(((content*9_0)" +"(let-values(((new-p_0)" +"(if(tamper? p_0)" +" t_1" +"((propagation-set-tamper-ref p_0) p_0 t_1))))" +"(if new-p_0(modified-content1.1 content_0 new-p_0) content_0))))" +"(syntax2.1" +" content*9_0" "(syntax-scopes the-struct_0)" "(syntax-shifted-multi-scopes the-struct_0)" -" scope-propagations+tamper9_0" "(syntax-mpi-shifts the-struct_0)" "(syntax-srcloc the-struct_0)" "(syntax-props the-struct_0)" "(syntax-inspector the-struct_0)))" -" (raise-argument-error 'struct-copy \"syntax?\" the-struct_0)))))))))))))))" +" (raise-argument-error 'struct-copy \"syntax?\" the-struct_0)))))))))))))))))))" "(define-values" "(syntax-taint$1)" "(lambda(s_0)" @@ -8181,22 +8307,29 @@ static const char *startup_source = "(if(tamper-tainted?(syntax-tamper s_0))" " s_0" "(let-values(((stx_0) s_0))" +"(let-values(((t_0)(tamper-tainted-for-content(syntax-content s_0))))" +"(let-values(((content*_0)(syntax-content* stx_0)))" +"(let-values(((content_0)" +"(if(modified-content? content*_0)(modified-content-content content*_0) content*_0)))" +"(let-values(((p_0)" +"(if(modified-content? content*_0)" +"(modified-content-scope-propagations+tamper content*_0)" +" #f)))" "(let-values(((the-struct_0) stx_0))" "(if(syntax?$1 the-struct_0)" -"(let-values(((scope-propagations+tamper10_0)" -"(let-values(((t_0)(tamper-tainted-for-content(syntax-content s_0)))" -"((p_0)(syntax-scope-propagations+tamper stx_0)))" -"(if(tamper? p_0) t_0((propagation-set-tamper-ref p_0) p_0 t_0)))))" -"(syntax1.1" -"(syntax-content the-struct_0)" +"(let-values(((content*10_0)" +"(let-values(((new-p_0)" +"(if(tamper? p_0) t_0((propagation-set-tamper-ref p_0) p_0 t_0))))" +"(if new-p_0(modified-content1.1 content_0 new-p_0) content_0))))" +"(syntax2.1" +" content*10_0" "(syntax-scopes the-struct_0)" "(syntax-shifted-multi-scopes the-struct_0)" -" scope-propagations+tamper10_0" "(syntax-mpi-shifts the-struct_0)" "(syntax-srcloc the-struct_0)" "(syntax-props the-struct_0)" "(syntax-inspector the-struct_0)))" -" (raise-argument-error 'struct-copy \"syntax?\" the-struct_0))))))))" +" (raise-argument-error 'struct-copy \"syntax?\" the-struct_0))))))))))))" "(define-values" "(any-superior?)" "(lambda(t_0 from-i_0)" @@ -9045,23 +9178,50 @@ static const char *startup_source = "(if(shifted-to-label-phase? p2_0)(let-values() #t)(let-values()(phase_0)" "(lambda(sub-s_0)" "(begin" " 's->" -"(if(propagation? prop_0)" +"(let-values(((sub-content*_0)(syntax-content* sub-s_0)))" +"(let-values(((sub-content_0)" +"(if(modified-content? sub-content*_0)" +"(modified-content-content sub-content*_0)" +" sub-content*_0)))" +"(let-values(((scope-propagations+tamper_0)" +"(propagation-merge" +" sub-content_0" +" prop_0" +"(if(modified-content? sub-content*_0)" +"(modified-content-scope-propagations+tamper" +" sub-content*_0)" +" #f)" +"(syntax-scopes sub-s_0)" +"(syntax-shifted-multi-scopes sub-s_0)" +"(syntax-mpi-shifts sub-s_0))))" "(let-values(((the-struct_0) sub-s_0))" "(if(syntax?$1 the-struct_0)" "(let-values(((scopes41_0)" -"(propagation-apply prop_0(syntax-scopes sub-s_0) s_0))" +"(propagation-apply" +" prop_0" +"(syntax-scopes sub-s_0)" +" s_0))" "((shifted-multi-scopes42_0)" "(propagation-apply-shifted" " prop_0" @@ -9076,46 +9236,24 @@ static const char *startup_source = "(propagation-apply-inspector" " prop_0" "(syntax-inspector sub-s_0)))" -"((scope-propagations+tamper45_0)" -"(propagation-merge" -"(syntax-content sub-s_0)" -" prop_0" -"(syntax-scope-propagations+tamper sub-s_0)" -"(syntax-scopes sub-s_0)" -"(syntax-shifted-multi-scopes sub-s_0)" -"(syntax-mpi-shifts sub-s_0))))" -"(syntax1.1" -"(syntax-content the-struct_0)" +"((content*45_0)" +"(if scope-propagations+tamper_0" +"(modified-content1.1" +" sub-content_0" +" scope-propagations+tamper_0)" +" sub-content_0)))" +"(syntax2.1" +" content*45_0" " scopes41_0" " shifted-multi-scopes42_0" -" scope-propagations+tamper45_0" " mpi-shifts43_0" "(syntax-srcloc the-struct_0)" "(syntax-props the-struct_0)" " inspector44_0))" -" (raise-argument-error 'struct-copy \"syntax?\" the-struct_0)))" -"(let-values(((stx_0) sub-s_0))" -"(let-values(((the-struct_0) stx_0))" -"(if(syntax?$1 the-struct_0)" -"(let-values(((scope-propagations+tamper46_0)" -"(let-values(((t_0)" -"(tamper-tainted-for-content" -"(syntax-content sub-s_0)))" -"((p_0)" -"(syntax-scope-propagations+tamper stx_0)))" -"(if(tamper? p_0)" -" t_0" -"((propagation-set-tamper-ref p_0) p_0 t_0)))))" -"(syntax1.1" -"(syntax-content the-struct_0)" -"(syntax-scopes the-struct_0)" -"(syntax-shifted-multi-scopes the-struct_0)" -" scope-propagations+tamper46_0" -"(syntax-mpi-shifts the-struct_0)" -"(syntax-srcloc the-struct_0)" -"(syntax-props the-struct_0)" -"(syntax-inspector the-struct_0)))" -" (raise-argument-error 'struct-copy \"syntax?\" the-struct_0))))))))" +"(raise-argument-error" +" 'struct-copy" +" \"syntax?\"" +" the-struct_0)))))))))" "((seen_0) #f)" "((known-pairs_0) #f))" "(let-values(((s_2) s_1)" @@ -9157,15 +9295,101 @@ static const char *startup_source = "(let-values()(f_1 #f s_3))" "(if(number? s_3)" "(let-values()(f_1 #f s_3))" -"(if(let-values(((or-part_0)(vector? s_3)))" +"(if(let-values(((or-part_0)" +"(vector? s_3)))" "(if or-part_0" " or-part_0" -"(let-values(((or-part_1)(box? s_3)))" +"(let-values(((or-part_1)" +"(box? s_3)))" "(if or-part_1" " or-part_1" "(let-values(((or-part_2)" -"(prefab-struct-key s_3)))" -"(if or-part_2 or-part_2(hash? s_3)))))))" +"(prefab-struct-key" +" s_3)))" +"(if or-part_2" +" or-part_2" +"(hash? s_3)))))))" +"(let-values()" +"(datum-map-slow" +" tail?_0" +" s_3" +"(lambda(tail?_1 s_4)" +"(gf_0 tail?_1 s_4))" +" seen_1" +" known-pairs_1))" +"(let-values()" +"(gf_0 #f s_3))))))))))))))" +" loop_0)" +" #f" +" s_2" +" 0))))" +"(let-values()" +"(let-values(((s_1) content_0)" +"((f_0)(lambda(tail?_0 x_0)(begin 'f x_0)))" +"((s->_0)" +"(lambda(sub-s_0)" +"(begin" +" 's->" +"(let-values(((stx_0) sub-s_0))" +"(let-values(((t_0)" +"(tamper-tainted-for-content" +"(syntax-content sub-s_0))))" +"(let-values(((content*_1)(syntax-content* stx_0)))" +"(let-values(((content_1)" +"(if(modified-content? content*_1)" +"(modified-content-content content*_1)" +" content*_1)))" +"(let-values(((p_0)" +"(if(modified-content? content*_1)" +"(modified-content-scope-propagations+tamper" +" content*_1)" +" #f)))" +"(let-values(((the-struct_0) stx_0))" +"(if(syntax?$1 the-struct_0)" +"(let-values(((content*46_0)" +"(let-values(((new-p_0)" +"(if(tamper? p_0)" +" t_0" +"((propagation-set-tamper-ref" +" p_0)" +" p_0" +" t_0))))" +"(if new-p_0" +"(modified-content1.1" +" content_1" +" new-p_0)" +" content_1))))" +"(syntax2.1" +" content*46_0" +"(syntax-scopes the-struct_0)" +"(syntax-shifted-multi-scopes the-struct_0)" +"(syntax-mpi-shifts the-struct_0)" +"(syntax-srcloc the-struct_0)" +"(syntax-props the-struct_0)" +"(syntax-inspector the-struct_0)))" +"(raise-argument-error" +" 'struct-copy" +" \"syntax?\"" +" the-struct_0)))))))))))" +"((seen_0) #f)" +"((known-pairs_0) #f))" +"(let-values(((s_2) s_1)" +"((f_1) f_0)" +"((gf_0)" +"(lambda(tail?_0 v_0)" +"(begin" +" 'gf" +"(if(syntax?$1 v_0)" +"(let-values()(s->_0 v_0))" +"(let-values()(f_0 tail?_0 v_0))))))" +"((seen_1) seen_0)" +"((known-pairs_1) known-pairs_0))" +"((letrec-values(((loop_0)" +"(lambda(tail?_0 s_3 prev-depth_0)" +"(begin" +" 'loop" +"(let-values(((depth_0)(fx+ 1 prev-depth_0)))" +"(if(if seen_1(fx> depth_0 32) #f)" "(let-values()" "(datum-map-slow" " tail?_0" @@ -9173,33 +9397,83 @@ static const char *startup_source = "(lambda(tail?_1 s_4)(gf_0 tail?_1 s_4))" " seen_1" " known-pairs_1))" -"(let-values()(gf_0 #f s_3))))))))))))))" +"(if(null? s_3)" +"(let-values()(f_1 tail?_0 s_3))" +"(if(pair? s_3)" +"(let-values()" +"(f_1" +" tail?_0" +"(cons" +"(loop_0 #f(car s_3) depth_0)" +"(loop_0 1(cdr s_3) depth_0))))" +"(if(symbol? s_3)" +"(let-values()(f_1 #f s_3))" +"(if(boolean? s_3)" +"(let-values()(f_1 #f s_3))" +"(if(number? s_3)" +"(let-values()(f_1 #f s_3))" +"(if(let-values(((or-part_0)" +"(vector? s_3)))" +"(if or-part_0" +" or-part_0" +"(let-values(((or-part_1)" +"(box? s_3)))" +"(if or-part_1" +" or-part_1" +"(let-values(((or-part_2)" +"(prefab-struct-key" +" s_3)))" +"(if or-part_2" +" or-part_2" +"(hash? s_3)))))))" +"(let-values()" +"(datum-map-slow" +" tail?_0" +" s_3" +"(lambda(tail?_1 s_4)" +"(gf_0 tail?_1 s_4))" +" seen_1" +" known-pairs_1))" +"(let-values()" +"(gf_0 #f s_3))))))))))))))" " loop_0)" " #f" " s_2" -" 0)))))" +" 0)))))))" +"(let-values(((new-tamper_0)" +"(tamper-propagated(if(propagation? prop_0)(propagation-tamper prop_0) prop_0))))" +"(let-values(((new-content*_0)" +"(if new-tamper_0(modified-content1.1 new-content_0 new-tamper_0) new-content_0)))" +"(if(syntax-content*-cas! s_0 content*_0 new-content*_0)" +" new-content*_0" +"(syntax-propagated-content* s_0)))))))" +"(let-values() content*_0)))))))))" +"(define-values" +"(syntax-e/no-taint)" +"(lambda(s_0)" "(begin" -"(set-syntax-content! s_0 new-content_0)" -"(set-syntax-scope-propagations+tamper!" -" s_0" -"(tamper-propagated(if(propagation? prop_0)(propagation-tamper prop_0) prop_0)))" -" new-content_0))" -"(syntax-content s_0))))))" +"(let-values(((content*_0)(syntax-propagated-content* s_0)))" +"(if(modified-content? content*_0)(modified-content-content content*_0) content*_0)))))" "(define-values" "(syntax-e$1)" "(lambda(s_0)" "(begin" " 'syntax-e" -"(let-values(((e_0)(syntax-content s_0)))" +"(let-values(((e_0)(syntax-content* s_0)))" "(if(symbol? e_0)" "(let-values() e_0)" "(let-values()" -"(let-values(((content_0)(syntax-e/no-taint s_0)))" -"(if(not(tamper-armed?(syntax-scope-propagations+tamper s_0)))" +"(let-values(((content*_0)(syntax-propagated-content* s_0)))" +"(if(modified-content? content*_0)" +"(let-values()" +"(let-values(((content_0)(modified-content-content content*_0)))" +"(let-values(((prop_0)(modified-content-scope-propagations+tamper content*_0)))" +"(if(not(tamper-armed? prop_0))" "(let-values() content_0)" "(if(datum-has-elements? content_0)" "(let-values()(taint-content content_0))" -"(let-values() content_0))))))))))" +"(let-values() content_0))))))" +"(let-values() content*_0)))))))))" "(define-values" "(generalize-scope)" "(lambda(sc_0)" @@ -9212,6 +9486,9 @@ static const char *startup_source = "(lambda(s_0 sc_0)" "(begin" "(let-values(((s_1) s_0)((sc_1)(generalize-scope sc_0))((op_0) set-add)((prop-op_0) propagation-add))" +"(let-values(((content*_0)(syntax-content* s_1)))" +"(let-values(((content_0)" +"(if(modified-content? content*_0)(modified-content-content content*_0) content*_0)))" "(if(shifted-multi-scope? sc_1)" "(let-values(((the-struct_0) s_1))" "(if(syntax?$1 the-struct_0)" @@ -9219,47 +9496,53 @@ static const char *startup_source = "(fallback-update-first" "(syntax-shifted-multi-scopes s_1)" "(lambda(smss_0)(op_0(fallback-first smss_0) sc_1))))" -"((scope-propagations+tamper48_0)" -"(if(datum-has-elements?(syntax-content s_1))" +"((content*48_0)" +"(if(datum-has-elements? content_0)" +"(let-values(((prop_0)" "(prop-op_0" -"(syntax-scope-propagations+tamper s_1)" +"(if(modified-content? content*_0)" +"(modified-content-scope-propagations+tamper content*_0)" +" #f)" " sc_1" "(syntax-scopes s_1)" "(syntax-shifted-multi-scopes s_1)" -"(syntax-mpi-shifts s_1))" -"(syntax-scope-propagations+tamper s_1))))" -"(syntax1.1" -"(syntax-content the-struct_0)" +"(syntax-mpi-shifts s_1))))" +"(if prop_0(modified-content1.1 content_0 prop_0) content_0))" +" content*_0)))" +"(syntax2.1" +" content*48_0" "(syntax-scopes the-struct_0)" " shifted-multi-scopes47_0" -" scope-propagations+tamper48_0" "(syntax-mpi-shifts the-struct_0)" "(syntax-srcloc the-struct_0)" "(syntax-props the-struct_0)" "(syntax-inspector the-struct_0)))" -" (raise-argument-error 'struct-copy \"syntax?\" the-struct_0)))" +" (raise-argument-error 'struct-copy \"syntax?\" the-struct_0)))" "(let-values(((the-struct_0) s_1))" "(if(syntax?$1 the-struct_0)" "(let-values(((scopes49_0)(op_0(syntax-scopes s_1) sc_1))" -"((scope-propagations+tamper50_0)" -"(if(datum-has-elements?(syntax-content s_1))" +"((content*50_0)" +"(if(datum-has-elements? content_0)" +"(let-values(((prop_0)" "(prop-op_0" -"(syntax-scope-propagations+tamper s_1)" +"(if(modified-content? content*_0)" +"(modified-content-scope-propagations+tamper content*_0)" +" #f)" " sc_1" "(syntax-scopes s_1)" "(syntax-shifted-multi-scopes s_1)" -"(syntax-mpi-shifts s_1))" -"(syntax-scope-propagations+tamper s_1))))" -"(syntax1.1" -"(syntax-content the-struct_0)" +"(syntax-mpi-shifts s_1))))" +"(if prop_0(modified-content1.1 content_0 prop_0) content_0))" +" content*_0)))" +"(syntax2.1" +" content*50_0" " scopes49_0" "(syntax-shifted-multi-scopes the-struct_0)" -" scope-propagations+tamper50_0" "(syntax-mpi-shifts the-struct_0)" "(syntax-srcloc the-struct_0)" "(syntax-props the-struct_0)" "(syntax-inspector the-struct_0)))" -" (raise-argument-error 'struct-copy \"syntax?\" the-struct_0))))))))" +" (raise-argument-error 'struct-copy \"syntax?\" the-struct_0))))))))))" "(define-values" "(add-scopes)" "(lambda(s_0 scs_0)" @@ -9287,6 +9570,9 @@ static const char *startup_source = "(lambda(s_0 sc_0)" "(begin" "(let-values(((s_1) s_0)((sc_1)(generalize-scope sc_0))((op_0) set-remove)((prop-op_0) propagation-remove))" +"(let-values(((content*_0)(syntax-content* s_1)))" +"(let-values(((content_0)" +"(if(modified-content? content*_0)(modified-content-content content*_0) content*_0)))" "(if(shifted-multi-scope? sc_1)" "(let-values(((the-struct_0) s_1))" "(if(syntax?$1 the-struct_0)" @@ -9294,47 +9580,53 @@ static const char *startup_source = "(fallback-update-first" "(syntax-shifted-multi-scopes s_1)" "(lambda(smss_0)(op_0(fallback-first smss_0) sc_1))))" -"((scope-propagations+tamper52_0)" -"(if(datum-has-elements?(syntax-content s_1))" +"((content*52_0)" +"(if(datum-has-elements? content_0)" +"(let-values(((prop_0)" "(prop-op_0" -"(syntax-scope-propagations+tamper s_1)" +"(if(modified-content? content*_0)" +"(modified-content-scope-propagations+tamper content*_0)" +" #f)" " sc_1" "(syntax-scopes s_1)" "(syntax-shifted-multi-scopes s_1)" -"(syntax-mpi-shifts s_1))" -"(syntax-scope-propagations+tamper s_1))))" -"(syntax1.1" -"(syntax-content the-struct_0)" +"(syntax-mpi-shifts s_1))))" +"(if prop_0(modified-content1.1 content_0 prop_0) content_0))" +" content*_0)))" +"(syntax2.1" +" content*52_0" "(syntax-scopes the-struct_0)" " shifted-multi-scopes51_0" -" scope-propagations+tamper52_0" "(syntax-mpi-shifts the-struct_0)" "(syntax-srcloc the-struct_0)" "(syntax-props the-struct_0)" "(syntax-inspector the-struct_0)))" -" (raise-argument-error 'struct-copy \"syntax?\" the-struct_0)))" +" (raise-argument-error 'struct-copy \"syntax?\" the-struct_0)))" "(let-values(((the-struct_0) s_1))" "(if(syntax?$1 the-struct_0)" "(let-values(((scopes53_0)(op_0(syntax-scopes s_1) sc_1))" -"((scope-propagations+tamper54_0)" -"(if(datum-has-elements?(syntax-content s_1))" +"((content*54_0)" +"(if(datum-has-elements? content_0)" +"(let-values(((prop_0)" "(prop-op_0" -"(syntax-scope-propagations+tamper s_1)" +"(if(modified-content? content*_0)" +"(modified-content-scope-propagations+tamper content*_0)" +" #f)" " sc_1" "(syntax-scopes s_1)" "(syntax-shifted-multi-scopes s_1)" -"(syntax-mpi-shifts s_1))" -"(syntax-scope-propagations+tamper s_1))))" -"(syntax1.1" -"(syntax-content the-struct_0)" +"(syntax-mpi-shifts s_1))))" +"(if prop_0(modified-content1.1 content_0 prop_0) content_0))" +" content*_0)))" +"(syntax2.1" +" content*54_0" " scopes53_0" "(syntax-shifted-multi-scopes the-struct_0)" -" scope-propagations+tamper54_0" "(syntax-mpi-shifts the-struct_0)" "(syntax-srcloc the-struct_0)" "(syntax-props the-struct_0)" "(syntax-inspector the-struct_0)))" -" (raise-argument-error 'struct-copy \"syntax?\" the-struct_0))))))))" +" (raise-argument-error 'struct-copy \"syntax?\" the-struct_0))))))))))" "(define-values" "(remove-scopes)" "(lambda(s_0 scs_0)" @@ -9363,6 +9655,9 @@ static const char *startup_source = "(lambda(s_0 sc_0)" "(begin" "(let-values(((s_1) s_0)((sc_1)(generalize-scope sc_0))((op_0) set-flip)((prop-op_0) propagation-flip))" +"(let-values(((content*_0)(syntax-content* s_1)))" +"(let-values(((content_0)" +"(if(modified-content? content*_0)(modified-content-content content*_0) content*_0)))" "(if(shifted-multi-scope? sc_1)" "(let-values(((the-struct_0) s_1))" "(if(syntax?$1 the-struct_0)" @@ -9370,47 +9665,53 @@ static const char *startup_source = "(fallback-update-first" "(syntax-shifted-multi-scopes s_1)" "(lambda(smss_0)(op_0(fallback-first smss_0) sc_1))))" -"((scope-propagations+tamper56_0)" -"(if(datum-has-elements?(syntax-content s_1))" +"((content*56_0)" +"(if(datum-has-elements? content_0)" +"(let-values(((prop_0)" "(prop-op_0" -"(syntax-scope-propagations+tamper s_1)" +"(if(modified-content? content*_0)" +"(modified-content-scope-propagations+tamper content*_0)" +" #f)" " sc_1" "(syntax-scopes s_1)" "(syntax-shifted-multi-scopes s_1)" -"(syntax-mpi-shifts s_1))" -"(syntax-scope-propagations+tamper s_1))))" -"(syntax1.1" -"(syntax-content the-struct_0)" +"(syntax-mpi-shifts s_1))))" +"(if prop_0(modified-content1.1 content_0 prop_0) content_0))" +" content*_0)))" +"(syntax2.1" +" content*56_0" "(syntax-scopes the-struct_0)" " shifted-multi-scopes55_0" -" scope-propagations+tamper56_0" "(syntax-mpi-shifts the-struct_0)" "(syntax-srcloc the-struct_0)" "(syntax-props the-struct_0)" "(syntax-inspector the-struct_0)))" -" (raise-argument-error 'struct-copy \"syntax?\" the-struct_0)))" +" (raise-argument-error 'struct-copy \"syntax?\" the-struct_0)))" "(let-values(((the-struct_0) s_1))" "(if(syntax?$1 the-struct_0)" "(let-values(((scopes57_0)(op_0(syntax-scopes s_1) sc_1))" -"((scope-propagations+tamper58_0)" -"(if(datum-has-elements?(syntax-content s_1))" +"((content*58_0)" +"(if(datum-has-elements? content_0)" +"(let-values(((prop_0)" "(prop-op_0" -"(syntax-scope-propagations+tamper s_1)" +"(if(modified-content? content*_0)" +"(modified-content-scope-propagations+tamper content*_0)" +" #f)" " sc_1" "(syntax-scopes s_1)" "(syntax-shifted-multi-scopes s_1)" -"(syntax-mpi-shifts s_1))" -"(syntax-scope-propagations+tamper s_1))))" -"(syntax1.1" -"(syntax-content the-struct_0)" +"(syntax-mpi-shifts s_1))))" +"(if prop_0(modified-content1.1 content_0 prop_0) content_0))" +" content*_0)))" +"(syntax2.1" +" content*58_0" " scopes57_0" "(syntax-shifted-multi-scopes the-struct_0)" -" scope-propagations+tamper58_0" "(syntax-mpi-shifts the-struct_0)" "(syntax-srcloc the-struct_0)" "(syntax-props the-struct_0)" "(syntax-inspector the-struct_0)))" -" (raise-argument-error 'struct-copy \"syntax?\" the-struct_0))))))))" +" (raise-argument-error 'struct-copy \"syntax?\" the-struct_0))))))))))" "(define-values" "(flip-scopes)" "(lambda(s_0 scs_0)" @@ -9469,13 +9770,12 @@ static const char *startup_source = " 'd->s" "(let-values(((the-struct_0) s_1))" "(if(syntax?$1 the-struct_0)" -"(let-values(((content60_0) d_0)" +"(let-values(((content*60_0)(re-modify-content s_1 d_0))" "((shifted-multi-scopes61_0)(push_0(syntax-shifted-multi-scopes s_1))))" -"(syntax1.1" -" content60_0" +"(syntax2.1" +" content*60_0" "(syntax-scopes the-struct_0)" " shifted-multi-scopes61_0" -"(syntax-scope-propagations+tamper the-struct_0)" "(syntax-mpi-shifts the-struct_0)" "(syntax-srcloc the-struct_0)" "(syntax-props the-struct_0)" @@ -9641,7 +9941,7 @@ static const char *startup_source = "(if(not(propagation-inspector prop_0))(not(propagation-add-mpi-shifts prop_0)) #f)" " #f)" " #f)" -"(let-values() #f)" +"(let-values()(propagation-tamper prop_0))" "(let-values()" "(let-values(((the-struct_0) prop_0))" "(if(propagation? the-struct_0)" @@ -10082,14 +10382,13 @@ static const char *startup_source = " 'd->s" "(let-values(((the-struct_0) s_1))" "(if(syntax?$1 the-struct_0)" -"(let-values(((content74_0) d_0)" +"(let-values(((content*74_0)(re-modify-content s_1 d_0))" "((shifted-multi-scopes75_0)" "(shift-all_0(syntax-shifted-multi-scopes s_1))))" -"(syntax1.1" -" content74_0" +"(syntax2.1" +" content*74_0" "(syntax-scopes the-struct_0)" " shifted-multi-scopes75_0" -"(syntax-scope-propagations+tamper the-struct_0)" "(syntax-mpi-shifts the-struct_0)" "(syntax-srcloc the-struct_0)" "(syntax-props the-struct_0)" @@ -10299,15 +10598,14 @@ static const char *startup_source = " 'd->s" "(let-values(((the-struct_0) s_1))" "(if(syntax?$1 the-struct_0)" -"(let-values(((content78_0) d_0)" +"(let-values(((content*78_0)(re-modify-content s_1 d_0))" "((scopes79_0)(swap-scs_0(syntax-scopes s_1)))" "((shifted-multi-scopes80_0)" "(swap-smss_0(syntax-shifted-multi-scopes s_1))))" -"(syntax1.1" -" content78_0" +"(syntax2.1" +" content*78_0" " scopes79_0" " shifted-multi-scopes80_0" -"(syntax-scope-propagations+tamper the-struct_0)" "(syntax-mpi-shifts the-struct_0)" "(syntax-srcloc the-struct_0)" "(syntax-props the-struct_0)" @@ -11202,32 +11500,40 @@ static const char *startup_source = "(if non-source?_0" "(non-source-shift4.1 from-mpi_0 to-mpi_0)" "(cons from-mpi_0 to-mpi_0))))" +"(let-values(((content*_0)(syntax-content* s_0)))" +"(let-values(((content_0)" +"(if(modified-content? content*_0)" +"(modified-content-content content*_0)" +" content*_0)))" "(let-values(((the-struct_0) s_0))" "(if(syntax?$1 the-struct_0)" "(let-values(((mpi-shifts62_0)(shift-cons shift_0(syntax-mpi-shifts s_0)))" "((inspector63_0)" "(let-values(((or-part_0)(syntax-inspector s_0)))" "(if or-part_0 or-part_0 inspector_0)))" -"((scope-propagations+tamper64_0)" -"(if(datum-has-elements?(syntax-content s_0))" +"((content*64_0)" +"(if(datum-has-elements? content_0)" +"(modified-content1.1" +" content_0" "(propagation-mpi-shift" -"(syntax-scope-propagations+tamper s_0)" +"(if(modified-content? content*_0)" +"(modified-content-scope-propagations+tamper content*_0)" +" #f)" "(lambda(s_1)(shift-cons shift_0 s_1))" " inspector_0" "(syntax-scopes s_0)" "(syntax-shifted-multi-scopes s_0)" -"(syntax-mpi-shifts s_0))" -"(syntax-scope-propagations+tamper s_0))))" -"(syntax1.1" -"(syntax-content the-struct_0)" +"(syntax-mpi-shifts s_0)))" +" content*_0)))" +"(syntax2.1" +" content*64_0" "(syntax-scopes the-struct_0)" "(syntax-shifted-multi-scopes the-struct_0)" -" scope-propagations+tamper64_0" " mpi-shifts62_0" "(syntax-srcloc the-struct_0)" "(syntax-props the-struct_0)" " inspector63_0))" -" (raise-argument-error 'struct-copy \"syntax?\" the-struct_0)))))))))))))))" +" (raise-argument-error 'struct-copy \"syntax?\" the-struct_0)))))))))))))))))" "(define-values" "(shift-cons)" "(lambda(shift_0 shifts_0)" @@ -11555,30 +11861,35 @@ static const char *startup_source = "(syntax-set-inspector)" "(lambda(s_0 insp_0)" "(begin" +"(let-values(((content*_0)(syntax-content* s_0)))" +"(let-values(((content_0)(if(modified-content? content*_0)(modified-content-content content*_0) content*_0)))" "(let-values(((the-struct_0) s_0))" "(if(syntax?$1 the-struct_0)" "(let-values(((inspector96_0)" "(let-values(((or-part_0)(syntax-inspector s_0)))(if or-part_0 or-part_0 insp_0)))" -"((scope-propagations+tamper97_0)" -"(if(datum-has-elements?(syntax-content s_0))" +"((content*97_0)" +"(if(datum-has-elements? content_0)" +"(modified-content1.1" +" content_0" "(propagation-mpi-shift" -"(syntax-scope-propagations+tamper s_0)" +"(if(modified-content? content*_0)" +"(modified-content-scope-propagations+tamper content*_0)" +" #f)" " #f" " insp_0" "(syntax-scopes s_0)" "(syntax-shifted-multi-scopes s_0)" -"(syntax-mpi-shifts s_0))" -"(syntax-scope-propagations+tamper s_0))))" -"(syntax1.1" -"(syntax-content the-struct_0)" +"(syntax-mpi-shifts s_0)))" +" content*_0)))" +"(syntax2.1" +" content*97_0" "(syntax-scopes the-struct_0)" "(syntax-shifted-multi-scopes the-struct_0)" -" scope-propagations+tamper97_0" "(syntax-mpi-shifts the-struct_0)" "(syntax-srcloc the-struct_0)" "(syntax-props the-struct_0)" " inspector96_0))" -" (raise-argument-error 'struct-copy \"syntax?\" the-struct_0))))))" +" (raise-argument-error 'struct-copy \"syntax?\" the-struct_0))))))))" "(define-values" "(1/syntax-source-module)" "(let-values(((syntax-source-module_0)" @@ -11658,11 +11969,10 @@ static const char *startup_source = "(let-values(((the-struct_0)(datum->syntax$1 #f(syntax-e$1 id_0) id_0 id_0)))" "(if(syntax?$1 the-struct_0)" "(let-values(((mpi-shifts98_0)(syntax-mpi-shifts id_0)))" -"(syntax1.1" -"(syntax-content the-struct_0)" +"(syntax2.1" +"(syntax-content* the-struct_0)" "(syntax-scopes the-struct_0)" "(syntax-shifted-multi-scopes the-struct_0)" -"(syntax-scope-propagations+tamper the-struct_0)" " mpi-shifts98_0" "(syntax-srcloc the-struct_0)" "(syntax-props the-struct_0)" @@ -12844,11 +13154,10 @@ static const char *startup_source = "(let-values(((the-struct_0) new-stx_0))" "(if(syntax?$1 the-struct_0)" "(let-values(((props4_0)(hash-set old-props_0 'origin origin_0)))" -"(syntax1.1" -"(syntax-content the-struct_0)" +"(syntax2.1" +"(syntax-content* the-struct_0)" "(syntax-scopes the-struct_0)" "(syntax-shifted-multi-scopes the-struct_0)" -"(syntax-scope-propagations+tamper the-struct_0)" "(syntax-mpi-shifts the-struct_0)" "(syntax-srcloc the-struct_0)" " props4_0" @@ -12858,11 +13167,10 @@ static const char *startup_source = "(let-values(((the-struct_0) new-stx_0))" "(if(syntax?$1 the-struct_0)" "(let-values(((props5_0) old-props_0))" -"(syntax1.1" -"(syntax-content the-struct_0)" +"(syntax2.1" +"(syntax-content* the-struct_0)" "(syntax-scopes the-struct_0)" "(syntax-shifted-multi-scopes the-struct_0)" -"(syntax-scope-propagations+tamper the-struct_0)" "(syntax-mpi-shifts the-struct_0)" "(syntax-srcloc the-struct_0)" " props5_0" @@ -12981,11 +13289,10 @@ static const char *startup_source = "(let-values(((the-struct_0) new-stx_0))" "(if(syntax?$1 the-struct_0)" "(let-values(((props6_0) updated-props_0))" -"(syntax1.1" -"(syntax-content the-struct_0)" +"(syntax2.1" +"(syntax-content* the-struct_0)" "(syntax-scopes the-struct_0)" "(syntax-shifted-multi-scopes the-struct_0)" -"(syntax-scope-propagations+tamper the-struct_0)" "(syntax-mpi-shifts the-struct_0)" "(syntax-srcloc the-struct_0)" " props6_0" @@ -43361,24 +43668,28 @@ static const char *startup_source = "(let-values(((alternate-id_0) alternate-id1_0))" "(let-values(((fail-non-transformer_0) fail-non-transformer2_0))" "(let-values()" +"(let-values((()" "(begin" "(let-values(((obs_0)(expand-context-observer ctx_0)))" -"(if obs_0(let-values()(let-values()(call-expand-observe obs_0 'visit s_0)))(void)))" -"(if(syntax-identifier? s_0)" +"(if obs_0" +"(let-values()(let-values()(call-expand-observe obs_0 'visit s_0)))" +"(void)))" +"(values))))" +"(let-values(((content_0)(syntax-content s_0)))" +"(if(symbol? content_0)" "(let-values()(expand-identifier s_0 ctx_0 alternate-id_0))" -"(if(if(pair?(syntax-content s_0))(syntax-identifier?(car(syntax-content s_0))) #f)" +"(if(if(pair? content_0)(syntax-identifier?(car content_0)) #f)" "(let-values()" "(let-values(((s98_0) s_0)" "((ctx99_0) ctx_0)" "((alternate-id100_0) alternate-id_0)" "((fail-non-transformer101_0) fail-non-transformer_0))" "(expand-id-application-form.1 fail-non-transformer101_0 s98_0 ctx99_0 alternate-id100_0)))" -"(if(let-values(((or-part_0)(pair?(syntax-content s_0))))" -"(if or-part_0 or-part_0(null?(syntax-content s_0))))" +"(if(let-values(((or-part_0)(pair? content_0)))(if or-part_0 or-part_0(null? content_0)))" "(let-values()(expand-implicit '#%app s_0 ctx_0 #f))" -"(if(already-expanded?(syntax-content s_0))" +"(if(already-expanded? content_0)" "(let-values()(expand-already-expanded s_0 ctx_0))" -"(let-values()(expand-implicit '#%datum s_0 ctx_0 #f)))))))))))))))" +"(let-values()(expand-implicit '#%datum s_0 ctx_0 #f))))))))))))))))" "(define-values" "(expand-identifier)" "(lambda(s_0 ctx_0 alternate-id_0)" @@ -44793,11 +45104,10 @@ static const char *startup_source = "(let-values(((the-struct_0) new-s_0))" "(if(syntax?$1 the-struct_0)" "(let-values(((srcloc237_0) srcloc_0))" -"(syntax1.1" -"(syntax-content the-struct_0)" +"(syntax2.1" +"(syntax-content* the-struct_0)" "(syntax-scopes the-struct_0)" "(syntax-shifted-multi-scopes the-struct_0)" -"(syntax-scope-propagations+tamper the-struct_0)" "(syntax-mpi-shifts the-struct_0)" " srcloc237_0" "(syntax-props the-struct_0)" @@ -47383,11 +47693,10 @@ static const char *startup_source = "(let-values(((the-struct_0) empty-syntax))" "(if(syntax?$1 the-struct_0)" "(let-values(((srcloc1_0) v_0))" -"(syntax1.1" -"(syntax-content the-struct_0)" +"(syntax2.1" +"(syntax-content* the-struct_0)" "(syntax-scopes the-struct_0)" "(syntax-shifted-multi-scopes the-struct_0)" -"(syntax-scope-propagations+tamper the-struct_0)" "(syntax-mpi-shifts the-struct_0)" " srcloc1_0" "(syntax-props the-struct_0)" @@ -47406,11 +47715,10 @@ static const char *startup_source = "(vector-ref v_0 2)" "(vector-ref v_0 3)" "(vector-ref v_0 4))))" -"(syntax1.1" -"(syntax-content the-struct_0)" +"(syntax2.1" +"(syntax-content* the-struct_0)" "(syntax-scopes the-struct_0)" "(syntax-shifted-multi-scopes the-struct_0)" -"(syntax-scope-propagations+tamper the-struct_0)" "(syntax-mpi-shifts the-struct_0)" " srcloc2_0" "(syntax-props the-struct_0)" @@ -62600,7 +62908,7 @@ static const char *startup_source = "(begin" "(let-values(((the-struct_0) empty-syntax))" "(if(syntax?$1 the-struct_0)" -"(let-values(((content57_0)(datum-intern-literal s-exp_0))" +"(let-values(((content*57_0)(datum-intern-literal s-exp_0))" "((srcloc58_0) srcloc_0)" "((props59_0)" "(let-values(((tmp_0) rep_0))" @@ -62609,11 +62917,10 @@ static const char *startup_source = "(if(equal? tmp_0 '#\\{)" "(let-values() original-curly-props)" "(let-values() original-props))))))" -"(syntax1.1" -" content57_0" +"(syntax2.1" +" content*57_0" "(syntax-scopes the-struct_0)" "(syntax-shifted-multi-scopes the-struct_0)" -"(syntax-scope-propagations+tamper the-struct_0)" "(syntax-mpi-shifts the-struct_0)" " srcloc58_0" " props59_0"