expander: fix performance problem with datum->syntax

In a pattern like

 (let loop ([l l])
   (define v (syntax-e l))
   (cond
     [(null? v) 'done]
     [else
      (loop (datum->syntax #f (cdr v)))]))

the running time was O(N^2) for a list of syntax objects of length N.
That pattern is relevant for traversals that use `syntax-case` like

 (let loop ([l l])
   (syntax-case l ()
     [(a . b) (loop #'b)]
     [() 'done]))

Avoid bad behavior by recording in an weak hash table certain pairs
that were previously been produced by `datum->syntax` internally so
that they can be used as-is.
This commit is contained in:
Matthew Flatt 2019-07-18 11:56:19 -06:00
parent 68bbd79b3a
commit 43ba15ca38
5 changed files with 213 additions and 90 deletions

View File

@ -0,0 +1,19 @@
#lang racket/base
(define l (datum->syntax
#f
(for/list ([i 10000])
'x)))
(let ([now (current-inexact-milliseconds)])
(let loop ([l l])
(define v (syntax-e l))
(cond
[(null? v) 'done]
[else
(loop (datum->syntax #f (cdr v)))]))
(define t (- (current-inexact-milliseconds) now))
(unless (t . < . 1000.0)
(error 'datum->syntax-stress "took too long: ~a" t)))

View File

@ -34,6 +34,7 @@
compiled-expression-recompile) compiled-expression-recompile)
(only-in racket/private/config find-main-config) (only-in racket/private/config find-main-config)
(only-in "syntax/cache.rkt" cache-place-init!) (only-in "syntax/cache.rkt" cache-place-init!)
(only-in "syntax/syntax.rkt" syntax-place-init!)
(only-in "syntax/scope.rkt" scope-place-init!) (only-in "syntax/scope.rkt" scope-place-init!)
(only-in "eval/module-cache.rkt" module-cache-place-init!) (only-in "eval/module-cache.rkt" module-cache-place-init!)
(only-in "common/performance.rkt" performance-place-init!) (only-in "common/performance.rkt" performance-place-init!)
@ -207,6 +208,7 @@
(datum->syntax core-stx s)) (datum->syntax core-stx s))
(define (expander-place-init!) (define (expander-place-init!)
(syntax-place-init!)
(scope-place-init!) (scope-place-init!)
(cache-place-init!) (cache-place-init!)
(core-place-init!) (core-place-init!)

View File

@ -11,7 +11,9 @@
;; ;;
;; `(f tail? d)` is called on each datum `d`, where `tail?` ;; `(f tail? d)` is called on each datum `d`, where `tail?`
;; indicates that the value is a pair/null in a `cdr` --- so that it ;; indicates that the value is a pair/null in a `cdr` --- so that it
;; doesn't need to be wrapped for `datum->syntax`, for example ;; doesn't need to be wrapped for `datum->syntax`, for example;
;; the `tail?` argument is actually #f or a fixnum for a lower bound
;; on `cdr`s that have been taken
;; ;;
;; `gf` is like `f`, but `gf` is used when the argument might be ;; `gf` is like `f`, but `gf` is used when the argument might be
;; syntax; if `gf` is provided, `f` can assume that its argument ;; syntax; if `gf` is provided, `f` can assume that its argument
@ -21,28 +23,32 @@
;; hash table, and cycle checking is enabled; when a cycle is ;; hash table, and cycle checking is enabled; when a cycle is
;; discovered, the procedure attached to 'cycle-fail in the initial ;; discovered, the procedure attached to 'cycle-fail in the initial
;; table is called ;; table is called
;;
;; If a `known-pairs` argument is provided, then it should be an
;; `eq?`-based hash table to map pairs that can be returned as-is
;; in a `tail?` position
;; The inline version uses `f` only in an application position to ;; The inline version uses `f` only in an application position to
;; help avoid allocating a closure. It also covers only the most common ;; help avoid allocating a closure. It also covers only the most common
;; cases, defering to the general (not inlined) function for other cases. ;; cases, defering to the general (not inlined) function for other cases.
(define-inline (datum-map s f [gf f] [seen #f]) (define-inline (datum-map s f [gf f] [seen #f] [known-pairs #f])
(let loop ([tail? #f] [s s] [prev-depth 0]) (let loop ([tail? #f] [s s] [prev-depth 0])
(define depth (fx+ 1 prev-depth)) ; avoid cycle-checking overhead for shallow cases (define depth (fx+ 1 prev-depth)) ; avoid cycle-checking overhead for shallow cases
(cond (cond
[(and seen (depth . fx> . 32)) [(and seen (depth . fx> . 32))
(datum-map-slow tail? s (lambda (tail? s) (gf tail? s)) seen)] (datum-map-slow tail? s (lambda (tail? s) (gf tail? s)) seen known-pairs)]
[(null? s) (f tail? s)] [(null? s) (f tail? s)]
[(pair? s) [(pair? s)
(f tail? (cons (loop #f (car s) depth) (f tail? (cons (loop #f (car s) depth)
(loop #t (cdr s) depth)))] (loop 1 (cdr s) depth)))]
[(symbol? s) (f #f s)] [(symbol? s) (f #f s)]
[(boolean? s) (f #f s)] [(boolean? s) (f #f s)]
[(number? s) (f #f s)] [(number? s) (f #f s)]
[(or (vector? s) (box? s) (prefab-struct-key s) (hash? s)) [(or (vector? s) (box? s) (prefab-struct-key s) (hash? s))
(datum-map-slow tail? s (lambda (tail? s) (gf tail? s)) seen)] (datum-map-slow tail? s (lambda (tail? s) (gf tail? s)) seen known-pairs)]
[else (gf #f s)]))) [else (gf #f s)])))
(define (datum-map-slow tail? s f seen) (define (datum-map-slow tail? s f seen known-pairs)
(let loop ([tail? tail?] [s s] [prev-seen seen]) (let loop ([tail? tail?] [s s] [prev-seen seen])
(define seen (define seen
(cond (cond
@ -55,8 +61,14 @@
(cond (cond
[(null? s) (f tail? s)] [(null? s) (f tail? s)]
[(pair? s) [(pair? s)
(cond
[(and known-pairs
tail?
(hash-ref known-pairs s #f))
s]
[else
(f tail? (cons (loop #f (car s) seen) (f tail? (cons (loop #f (car s) seen)
(loop #t (cdr s) seen)))] (loop (if tail? (fx+ 1 tail?) 1) (cdr s) seen)))])]
[(or (symbol? s) (boolean? s) (number? s)) [(or (symbol? s) (boolean? s) (number? s))
(f #f s)] (f #f s)]
[(vector? s) [(vector? s)

View File

@ -1,5 +1,7 @@
#lang racket/base #lang racket/base
(require "../compile/serialize-property.rkt" (require racket/private/place-local
racket/fixnum
"../compile/serialize-property.rkt"
"../compile/serialize-state.rkt" "../compile/serialize-state.rkt"
"../common/set.rkt" "../common/set.rkt"
"../common/inline.rkt" "../common/inline.rkt"
@ -30,7 +32,9 @@
deserialize-syntax deserialize-syntax
deserialize-datum->syntax deserialize-datum->syntax
current-arm-inspectors) current-arm-inspectors
syntax-place-init!)
(struct syntax ([content #:mutable] ; datum and nested syntax objects; mutated for lazy propagation (struct syntax ([content #:mutable] ; datum and nested syntax objects; mutated for lazy propagation
scopes ; scopes that apply at all phases scopes ; scopes that apply at all phases
@ -186,6 +190,8 @@
(define (syntax->datum s) (define (syntax->datum s)
(syntax-map s (lambda (tail? x) x) (lambda (s d) d) syntax-content)) (syntax-map s (lambda (tail? x) x) (lambda (s d) d) syntax-content))
(define-place-local known-syntax-pairs (make-weak-hasheq))
(define (datum->syntax stx-c s [stx-l #f] [stx-p #f]) (define (datum->syntax stx-c s [stx-l #f] [stx-p #f])
(cond (cond
[(syntax? s) s] [(syntax? s) s]
@ -212,9 +218,16 @@
(weaker-inspector insp (syntax-inspector stx-c))))) (weaker-inspector insp (syntax-inspector stx-c)))))
(define result-s (define result-s
(non-syntax-map s (non-syntax-map s
(lambda (tail? x) (if tail? x (wrap x))) (lambda (tail? x) (cond
[tail?
(when (and (fx> tail? 32)
(fx= 0 (fxand tail? (fx- tail? 1))))
(hash-set! known-syntax-pairs x #t))
x]
[else (wrap x)]))
(lambda (s) s) (lambda (s) s)
disallow-cycles)) disallow-cycles
known-syntax-pairs))
(if (and stx-p (not (eq? (syntax-props stx-p) empty-props))) (if (and stx-p (not (eq? (syntax-props stx-p) empty-props)))
(struct-copy syntax result-s (struct-copy syntax result-s
[props (syntax-props stx-p)]) [props (syntax-props stx-p)])
@ -248,14 +261,15 @@
;; when a syntax object is found, it is just passed to `s->` --- so there's ;; when a syntax object is found, it is just passed to `s->` --- so there's
;; no `d->s` or `s-e`, since they would not be called ;; no `d->s` or `s-e`, since they would not be called
(define-inline (non-syntax-map s f [s-> (lambda (x) x)] [seen #f]) (define-inline (non-syntax-map s f [s-> (lambda (x) x)] [seen #f] [known-pairs #f])
(datum-map s (datum-map s
f f
(lambda (tail? v) (lambda (tail? v)
(cond (cond
[(syntax? v) (s-> v)] [(syntax? v) (s-> v)]
[else (f tail? v)])) [else (f tail? v)]))
seen)) seen
known-pairs))
(define disallow-cycles (define disallow-cycles
(hasheq 'cycle-fail (hasheq 'cycle-fail
@ -264,6 +278,9 @@
"cannot create syntax from cyclic datum" "cannot create syntax from cyclic datum"
"datum" s)))) "datum" s))))
(define (syntax-place-init!)
(set! known-syntax-pairs (make-weak-hasheq)))
;; ---------------------------------------- ;; ----------------------------------------
;; When serializing syntax objects, let nested objects know the ;; When serializing syntax objects, let nested objects know the

View File

@ -2755,7 +2755,7 @@ static const char *startup_source =
"(define-values(end-atomic)(lambda()(begin(unsafe-end-atomic))))" "(define-values(end-atomic)(lambda()(begin(unsafe-end-atomic))))"
"(define-values(start-breakable-atomic)(lambda()(begin(unsafe-start-breakable-atomic))))" "(define-values(start-breakable-atomic)(lambda()(begin(unsafe-start-breakable-atomic))))"
"(define-values(end-breakable-atomic)(lambda()(begin(unsafe-end-breakable-atomic))))" "(define-values(end-breakable-atomic)(lambda()(begin(unsafe-end-breakable-atomic))))"
"(define-values(cell.1$9)(unsafe-make-place-local #f))" "(define-values(cell.1$10)(unsafe-make-place-local #f))"
"(define-values" "(define-values"
"(entered-err-string-handler)" "(entered-err-string-handler)"
"(lambda(s_0 n_0)(begin(call-as-nonatomic(lambda()((error-value->string-handler) s_0 n_0))))))" "(lambda(s_0 n_0)(begin(call-as-nonatomic(lambda()((error-value->string-handler) s_0 n_0))))))"
@ -2772,7 +2772,7 @@ static const char *startup_source =
"(if(if(procedure? f_0)(procedure-arity-includes? f_0 0) #f)" "(if(if(procedure? f_0)(procedure-arity-includes? f_0 0) #f)"
"(void)" "(void)"
" (let-values () (raise-type-error 'call-as-atomic \"procedure (arity 0)\" f_0)))" " (let-values () (raise-type-error 'call-as-atomic \"procedure (arity 0)\" f_0)))"
"(if(eq?(unsafe-place-local-ref cell.1$9)(current-thread))" "(if(eq?(unsafe-place-local-ref cell.1$10)(current-thread))"
"(let-values()" "(let-values()"
"(dynamic-wind" "(dynamic-wind"
"(lambda()" "(lambda()"
@ -2791,7 +2791,7 @@ static const char *startup_source =
"(call-with-continuation-prompt" "(call-with-continuation-prompt"
"(lambda()" "(lambda()"
"(dynamic-wind" "(dynamic-wind"
"(lambda()(begin(start-breakable-atomic)(unsafe-place-local-set! cell.1$9(current-thread))))" "(lambda()(begin(start-breakable-atomic)(unsafe-place-local-set! cell.1$10(current-thread))))"
"(lambda()" "(lambda()"
"(begin" "(begin"
"(unsafe-place-local-set! cell.2$5(current-parameterization))" "(unsafe-place-local-set! cell.2$5(current-parameterization))"
@ -2817,7 +2817,7 @@ static const char *startup_source =
" f_0))))))))" " f_0))))))))"
"(lambda()" "(lambda()"
"(begin" "(begin"
"(unsafe-place-local-set! cell.1$9 #f)" "(unsafe-place-local-set! cell.1$10 #f)"
"(unsafe-place-local-set! cell.2$5 #f)" "(unsafe-place-local-set! cell.2$5 #f)"
"(unsafe-place-local-set! cell.3$2 #f)" "(unsafe-place-local-set! cell.3$2 #f)"
"(end-breakable-atomic)))))" "(end-breakable-atomic)))))"
@ -2831,7 +2831,7 @@ static const char *startup_source =
"(if(if(procedure? f_0)(procedure-arity-includes? f_0 0) #f)" "(if(if(procedure? f_0)(procedure-arity-includes? f_0 0) #f)"
"(void)" "(void)"
" (let-values () (raise-type-error 'call-as-nonatomic \"procedure (arity 0)\" f_0)))" " (let-values () (raise-type-error 'call-as-nonatomic \"procedure (arity 0)\" f_0)))"
"(if(eq?(unsafe-place-local-ref cell.1$9)(current-thread))" "(if(eq?(unsafe-place-local-ref cell.1$10)(current-thread))"
"(void)" "(void)"
" (let-values () (error 'call-as-nonatomic \"not in atomic area for ~e\" f_0)))" " (let-values () (error 'call-as-nonatomic \"not in atomic area for ~e\" f_0)))"
"(let-values(((paramz_0)(unsafe-place-local-ref cell.2$5))" "(let-values(((paramz_0)(unsafe-place-local-ref cell.2$5))"
@ -2849,7 +2849,7 @@ static const char *startup_source =
"(dynamic-wind" "(dynamic-wind"
"(lambda()" "(lambda()"
"(begin" "(begin"
"(unsafe-place-local-set! cell.1$9 #f)" "(unsafe-place-local-set! cell.1$10 #f)"
"(unsafe-place-local-set! cell.4$2 0)" "(unsafe-place-local-set! cell.4$2 0)"
"(end-breakable-atomic)" "(end-breakable-atomic)"
"((letrec-values(((loop_0)" "((letrec-values(((loop_0)"
@ -2877,7 +2877,7 @@ static const char *startup_source =
" loop_0)" " loop_0)"
" extra-depth_0)" " extra-depth_0)"
"(unsafe-place-local-set! cell.4$2 extra-depth_0)" "(unsafe-place-local-set! cell.4$2 extra-depth_0)"
"(unsafe-place-local-set! cell.1$9(current-thread)))))))))))))))" "(unsafe-place-local-set! cell.1$10(current-thread)))))))))))))))"
"(define-values(prop:serialize serialize? serialize-ref)(make-struct-type-property 'serialize))" "(define-values(prop:serialize serialize? serialize-ref)(make-struct-type-property 'serialize))"
"(define-values" "(define-values"
"(prop:serialize-fill! serialize-fill!? serialize-fill!-ref)" "(prop:serialize-fill! serialize-fill!? serialize-fill!-ref)"
@ -2892,7 +2892,7 @@ static const char *startup_source =
"(define-values" "(define-values"
"(log-performance?)" "(log-performance?)"
" (if (environment-variables-ref (current-environment-variables) #\"PLT_EXPANDER_TIMES\") #t #f))" " (if (environment-variables-ref (current-environment-variables) #\"PLT_EXPANDER_TIMES\") #t #f))"
"(define-values(cell.1$8)(unsafe-make-place-local #f))" "(define-values(cell.1$9)(unsafe-make-place-local #f))"
"(define-values(cell.2$4)(unsafe-make-place-local(make-hasheq)))" "(define-values(cell.2$4)(unsafe-make-place-local(make-hasheq)))"
"(define-values(performance-place-init!)(lambda()(begin(unsafe-place-local-set! cell.2$4(make-hasheq)))))" "(define-values(performance-place-init!)(lambda()(begin(unsafe-place-local-set! cell.2$4(make-hasheq)))))"
"(define-values" "(define-values"
@ -2945,10 +2945,10 @@ static const char *startup_source =
"(lambda path_0" "(lambda path_0"
"(begin" "(begin"
"(unsafe-place-local-set!" "(unsafe-place-local-set!"
" cell.1$8" " cell.1$9"
"(cons" "(cons"
"(region1.1" "(region1.1"
"(if(unsafe-place-local-ref cell.1$8)" "(if(unsafe-place-local-ref cell.1$9)"
"((letrec-values(((loop_0)" "((letrec-values(((loop_0)"
"(lambda(path_1 enclosing-path_0)" "(lambda(path_1 enclosing-path_0)"
"(begin" "(begin"
@ -2964,22 +2964,22 @@ static const char *startup_source =
"(if(pair? enclosing-path_0)(cdr enclosing-path_0) null))))))))" "(if(pair? enclosing-path_0)(cdr enclosing-path_0) null))))))))"
" loop_0)" " loop_0)"
" path_0" " path_0"
"(region-path(car(unsafe-place-local-ref cell.1$8))))" "(region-path(car(unsafe-place-local-ref cell.1$9))))"
" path_0)" " path_0)"
"(current-inexact-milliseconds)" "(current-inexact-milliseconds)"
"(current-memory-use 'cumulative)" "(current-memory-use 'cumulative)"
" 0.0" " 0.0"
" 0)" " 0)"
"(unsafe-place-local-ref cell.1$8))))))" "(unsafe-place-local-ref cell.1$9))))))"
"(define-values" "(define-values"
"(end-performance-region)" "(end-performance-region)"
"(lambda()" "(lambda()"
"(begin" "(begin"
"(let-values(((now_0)(current-inexact-milliseconds)))" "(let-values(((now_0)(current-inexact-milliseconds)))"
"(let-values(((now-memory_0)(current-memory-use 'cumulative)))" "(let-values(((now-memory_0)(current-memory-use 'cumulative)))"
"(let-values(((r_0)(car(unsafe-place-local-ref cell.1$8))))" "(let-values(((r_0)(car(unsafe-place-local-ref cell.1$9))))"
"(let-values((()" "(let-values((()"
"(begin(unsafe-place-local-set! cell.1$8(cdr(unsafe-place-local-ref cell.1$8)))(values))))" "(begin(unsafe-place-local-set! cell.1$9(cdr(unsafe-place-local-ref cell.1$9)))(values))))"
"(let-values(((full-delta_0)(- now_0(region-start r_0))))" "(let-values(((full-delta_0)(- now_0(region-start r_0))))"
"(let-values(((delta_0)(- full-delta_0(region-as-nested r_0))))" "(let-values(((delta_0)(- full-delta_0(region-as-nested r_0))))"
"(let-values(((full-delta-memory_0)(- now-memory_0(region-start-memory r_0))))" "(let-values(((full-delta-memory_0)(- now-memory_0(region-start-memory r_0))))"
@ -3017,16 +3017,16 @@ static const char *startup_source =
" loop_0)" " loop_0)"
"(unsafe-place-local-ref cell.2$4)" "(unsafe-place-local-ref cell.2$4)"
"(region-path r_0))" "(region-path r_0))"
"(if(unsafe-place-local-ref cell.1$8)" "(if(unsafe-place-local-ref cell.1$9)"
"(let-values()" "(let-values()"
"(begin" "(begin"
"(set-region-as-nested!" "(set-region-as-nested!"
"(car(unsafe-place-local-ref cell.1$8))" "(car(unsafe-place-local-ref cell.1$9))"
"(+(region-as-nested(car(unsafe-place-local-ref cell.1$8))) full-delta_0))" "(+(region-as-nested(car(unsafe-place-local-ref cell.1$9))) full-delta_0))"
"(set-region-as-nested-memory!" "(set-region-as-nested-memory!"
"(car(unsafe-place-local-ref cell.1$8))" "(car(unsafe-place-local-ref cell.1$9))"
"(+" "(+"
"(region-as-nested-memory(car(unsafe-place-local-ref cell.1$8)))" "(region-as-nested-memory(car(unsafe-place-local-ref cell.1$9)))"
" full-delta-memory_0))))" " full-delta-memory_0))))"
"(void))))))))))))))" "(void))))))))))))))"
"(call-with-values" "(call-with-values"
@ -4784,9 +4784,9 @@ static const char *startup_source =
"(make-self-module-path-index" "(make-self-module-path-index"
"(let-values(((name25_0) name_0)((temp26_0)(if enclosing_0(1/module-path-index-resolve enclosing_0) #f)))" "(let-values(((name25_0) name_0)((temp26_0)(if enclosing_0(1/module-path-index-resolve enclosing_0) #f)))"
"(build-module-name16.1 unsafe-undefined name25_0 temp26_0))))))" "(build-module-name16.1 unsafe-undefined name25_0 temp26_0))))))"
"(define-values(cell.1$7)(unsafe-make-place-local(make-weak-hash)))" "(define-values(cell.1$8)(unsafe-make-place-local(make-weak-hash)))"
"(define-values(generic-module-name) '|expanded module|)" "(define-values(generic-module-name) '|expanded module|)"
"(define-values(module-path-place-init!)(lambda()(begin(unsafe-place-local-set! cell.1$7(make-weak-hash)))))" "(define-values(module-path-place-init!)(lambda()(begin(unsafe-place-local-set! cell.1$8(make-weak-hash)))))"
"(define-values" "(define-values"
"(make-generic-self-module-path-index)" "(make-generic-self-module-path-index)"
"(lambda(self_0)" "(lambda(self_0)"
@ -4796,12 +4796,12 @@ static const char *startup_source =
"(start-atomic)" "(start-atomic)"
"(begin0" "(begin0"
"(let-values(((or-part_0)" "(let-values(((or-part_0)"
"(let-values(((e_0)(hash-ref(unsafe-place-local-ref cell.1$7) r_0 #f)))" "(let-values(((e_0)(hash-ref(unsafe-place-local-ref cell.1$8) r_0 #f)))"
"(if e_0(ephemeron-value e_0) #f))))" "(if e_0(ephemeron-value e_0) #f))))"
"(if or-part_0" "(if or-part_0"
" or-part_0" " or-part_0"
"(let-values(((mpi_0)(module-path-index2.1 #f #f r_0 #f)))" "(let-values(((mpi_0)(module-path-index2.1 #f #f r_0 #f)))"
"(begin(hash-set!(unsafe-place-local-ref cell.1$7) r_0(make-ephemeron r_0 mpi_0)) mpi_0))))" "(begin(hash-set!(unsafe-place-local-ref cell.1$8) r_0(make-ephemeron r_0 mpi_0)) mpi_0))))"
"(end-atomic)))))))" "(end-atomic)))))))"
"(define-values" "(define-values"
"(resolved-module-path-to-generic-resolved-module-path)" "(resolved-module-path-to-generic-resolved-module-path)"
@ -5278,6 +5278,7 @@ static const char *startup_source =
"(pop-syntax-context!)" "(pop-syntax-context!)"
"(lambda(state_0)" "(lambda(state_0)"
"(begin(let-values(((b_0)(serialize-state-syntax-context state_0)))(set-box! b_0(cdr(unbox b_0)))))))" "(begin(let-values(((b_0)(serialize-state-syntax-context state_0)))(set-box! b_0(cdr(unbox b_0)))))))"
" (define-values (not-an-fX.1) (lambda (who_0 v_0) (begin 'not-an-fX (raise-argument-error who_0 \"fixnum?\" v_0))))"
"(define-values(root-tag)(unsafe-root-continuation-prompt-tag))" "(define-values(root-tag)(unsafe-root-continuation-prompt-tag))"
"(define-values(default-val.1$2) #f)" "(define-values(default-val.1$2) #f)"
"(define-values" "(define-values"
@ -5317,10 +5318,9 @@ static const char *startup_source =
"(if(zero?(vector-length(car rk_2)))(all-fields-immutable?$1(cdr rk_2)) #f)" "(if(zero?(vector-length(car rk_2)))(all-fields-immutable?$1(cdr rk_2)) #f)"
"(all-fields-immutable?$1 rk_2))))))))))))" "(all-fields-immutable?$1 rk_2))))))))))))"
"(define-values(all-fields-immutable?)(lambda(k_0)(begin(prefab-key-all-fields-immutable? k_0))))" "(define-values(all-fields-immutable?)(lambda(k_0)(begin(prefab-key-all-fields-immutable? k_0))))"
" (define-values (not-an-fX.1) (lambda (who_0 v_0) (begin 'not-an-fX (raise-argument-error who_0 \"fixnum?\" v_0))))"
"(define-values" "(define-values"
"(datum-map-slow)" "(datum-map-slow)"
"(lambda(tail?_0 s_0 f_0 seen_0)" "(lambda(tail?_0 s_0 f_0 seen_0 known-pairs_0)"
"(begin" "(begin"
"((letrec-values(((loop_0)" "((letrec-values(((loop_0)"
"(lambda(tail?_1 s_1 prev-seen_0)" "(lambda(tail?_1 s_1 prev-seen_0)"
@ -5337,7 +5337,14 @@ static const char *startup_source =
"(let-values()(f_0 tail?_1 s_1))" "(let-values()(f_0 tail?_1 s_1))"
"(if(pair? s_1)" "(if(pair? s_1)"
"(let-values()" "(let-values()"
"(f_0 tail?_1(cons(loop_0 #f(car s_1) seen_1)(loop_0 #t(cdr s_1) seen_1))))" "(if(if known-pairs_0(if tail?_1(hash-ref known-pairs_0 s_1 #f) #f) #f)"
"(let-values() s_1)"
"(let-values()"
"(f_0"
" tail?_1"
"(cons"
"(loop_0 #f(car s_1) seen_1)"
"(loop_0(if tail?_1(fx+ 1 tail?_1) 1)(cdr s_1) seen_1))))))"
"(if(let-values(((or-part_0)(symbol? s_1)))" "(if(let-values(((or-part_0)(symbol? s_1)))"
"(if or-part_0" "(if or-part_0"
" or-part_0" " or-part_0"
@ -5716,7 +5723,11 @@ static const char *startup_source =
" \"value\"" " \"value\""
" v_1)))" " v_1)))"
" v_1)))))" " v_1)))))"
"(let-values(((s_0) v_0)((f_0) check-preserve_0)((gf_0) check-preserve_0)((seen_0) disallow-cycles$1))" "(let-values(((s_0) v_0)"
"((f_0) check-preserve_0)"
"((gf_0) check-preserve_0)"
"((seen_0) disallow-cycles$1)"
"((known-pairs_0) #f))"
"((letrec-values(((loop_0)" "((letrec-values(((loop_0)"
"(lambda(tail?_0 s_1 prev-depth_0)" "(lambda(tail?_0 s_1 prev-depth_0)"
"(begin" "(begin"
@ -5724,14 +5735,19 @@ static const char *startup_source =
"(let-values(((depth_0)(fx+ 1 prev-depth_0)))" "(let-values(((depth_0)(fx+ 1 prev-depth_0)))"
"(if(if seen_0(fx> depth_0 32) #f)" "(if(if seen_0(fx> depth_0 32) #f)"
"(let-values()" "(let-values()"
"(datum-map-slow tail?_0 s_1(lambda(tail?_1 s_2)(gf_0 tail?_1 s_2)) seen_0))" "(datum-map-slow"
" tail?_0"
" s_1"
"(lambda(tail?_1 s_2)(gf_0 tail?_1 s_2))"
" seen_0"
" known-pairs_0))"
"(if(null? s_1)" "(if(null? s_1)"
"(let-values()(f_0 tail?_0 s_1))" "(let-values()(f_0 tail?_0 s_1))"
"(if(pair? s_1)" "(if(pair? s_1)"
"(let-values()" "(let-values()"
"(f_0" "(f_0"
" tail?_0" " tail?_0"
"(cons(loop_0 #f(car s_1) depth_0)(loop_0 #t(cdr s_1) depth_0))))" "(cons(loop_0 #f(car s_1) depth_0)(loop_0 1(cdr s_1) depth_0))))"
"(if(symbol? s_1)" "(if(symbol? s_1)"
"(let-values()(f_0 #f s_1))" "(let-values()(f_0 #f s_1))"
"(if(boolean? s_1)" "(if(boolean? s_1)"
@ -5751,7 +5767,8 @@ static const char *startup_source =
" tail?_0" " tail?_0"
" s_1" " s_1"
"(lambda(tail?_1 s_2)(gf_0 tail?_1 s_2))" "(lambda(tail?_1 s_2)(gf_0 tail?_1 s_2))"
" seen_0))" " seen_0"
" known-pairs_0))"
"(let-values()(gf_0 #f s_1))))))))))))))" "(let-values()(gf_0 #f s_1))))))))))))))"
" loop_0)" " loop_0)"
" #f" " #f"
@ -5948,7 +5965,7 @@ static const char *startup_source =
"(let-values((()(begin(ser-push!_0 'tag '#:syntax)(values))))" "(let-values((()(begin(ser-push!_0 'tag '#:syntax)(values))))"
"(let-values(((this-state_0)" "(let-values(((this-state_0)"
"(if(no-pair-syntax-in-cdr? content_0)" "(if(no-pair-syntax-in-cdr? content_0)"
"(syntax-state17.1" "(syntax-state18.1"
" #t" " #t"
" context-triple_0" " context-triple_0"
"(syntax-srcloc s_0))" "(syntax-srcloc s_0))"
@ -6075,7 +6092,8 @@ static const char *startup_source =
"(if(syntax?$1 v_0)" "(if(syntax?$1 v_0)"
"(let-values()(d->s_0 v_0(loop_0(s-e_0 v_0))))" "(let-values()(d->s_0 v_0(loop_0(s-e_0 v_0))))"
"(let-values()(f_0 tail?_0 v_0))))))" "(let-values()(f_0 tail?_0 v_0))))))"
"((seen_1) seen_0))" "((seen_1) seen_0)"
"((known-pairs_0) #f))"
"((letrec-values(((loop_1)" "((letrec-values(((loop_1)"
"(lambda(tail?_0 s_4 prev-depth_0)" "(lambda(tail?_0 s_4 prev-depth_0)"
"(begin" "(begin"
@ -6087,7 +6105,8 @@ static const char *startup_source =
" tail?_0" " tail?_0"
" s_4" " s_4"
"(lambda(tail?_1 s_5)(gf_0 tail?_1 s_5))" "(lambda(tail?_1 s_5)(gf_0 tail?_1 s_5))"
" seen_1))" " seen_1"
" known-pairs_0))"
"(if(null? s_4)" "(if(null? s_4)"
"(let-values()(f_1 tail?_0 s_4))" "(let-values()(f_1 tail?_0 s_4))"
"(if(pair? s_4)" "(if(pair? s_4)"
@ -6096,7 +6115,7 @@ static const char *startup_source =
" tail?_0" " tail?_0"
"(cons" "(cons"
"(loop_1 #f(car s_4) depth_0)" "(loop_1 #f(car s_4) depth_0)"
"(loop_1 #t(cdr s_4) depth_0))))" "(loop_1 1(cdr s_4) depth_0))))"
"(if(symbol? s_4)" "(if(symbol? s_4)"
"(let-values()(f_1 #f s_4))" "(let-values()(f_1 #f s_4))"
"(if(boolean? s_4)" "(if(boolean? s_4)"
@ -6119,7 +6138,8 @@ static const char *startup_source =
" tail?_0" " tail?_0"
" s_4" " s_4"
"(lambda(tail?_1 s_5)(gf_0 tail?_1 s_5))" "(lambda(tail?_1 s_5)(gf_0 tail?_1 s_5))"
" seen_1))" " seen_1"
" known-pairs_0))"
"(let-values()(gf_0 #f s_4))))))))))))))" "(let-values()(gf_0 #f s_4))))))))))))))"
" loop_1)" " loop_1)"
" #f" " #f"
@ -6127,6 +6147,7 @@ static const char *startup_source =
" 0))))))" " 0))))))"
" loop_0)" " loop_0)"
" s_1)))))" " s_1)))))"
"(define-values(cell.1$7)(unsafe-make-place-local(make-weak-hasheq)))"
"(define-values" "(define-values"
"(datum->syntax$1)" "(datum->syntax$1)"
"(let-values(((datum->syntax6_0)" "(let-values(((datum->syntax6_0)"
@ -6182,9 +6203,27 @@ static const char *startup_source =
"(let-values(((s_1) s_0)" "(let-values(((s_1) s_0)"
"((f_0)" "((f_0)"
"(lambda(tail?_0 x_0)" "(lambda(tail?_0 x_0)"
"(begin 'f(if tail?_0 x_0(wrap_0 x_0)))))" "(begin"
" 'f"
"(if tail?_0"
"(let-values()"
"(begin"
"(if(if(fx> tail?_0 32)"
"(fx="
" 0"
"(fxand tail?_0(fx- tail?_0 1)))"
" #f)"
"(let-values()"
"(hash-set!"
"(unsafe-place-local-ref cell.1$7)"
" x_0"
" #t))"
"(void))"
" x_0))"
"(let-values()(wrap_0 x_0))))))"
"((s->_0)(lambda(s_1)(begin 's-> s_1)))" "((s->_0)(lambda(s_1)(begin 's-> s_1)))"
"((seen_0) disallow-cycles))" "((seen_0) disallow-cycles)"
"((known-pairs_0)(unsafe-place-local-ref cell.1$7)))"
"(let-values(((s_2) s_1)" "(let-values(((s_2) s_1)"
"((f_1) f_0)" "((f_1) f_0)"
"((gf_0)" "((gf_0)"
@ -6194,7 +6233,8 @@ static const char *startup_source =
"(if(syntax?$1 v_0)" "(if(syntax?$1 v_0)"
"(let-values()(s->_0 v_0))" "(let-values()(s->_0 v_0))"
"(let-values()(f_0 tail?_0 v_0))))))" "(let-values()(f_0 tail?_0 v_0))))))"
"((seen_1) seen_0))" "((seen_1) seen_0)"
"((known-pairs_1) known-pairs_0))"
"((letrec-values(((loop_0)" "((letrec-values(((loop_0)"
"(lambda(tail?_0 s_3 prev-depth_0)" "(lambda(tail?_0 s_3 prev-depth_0)"
"(begin" "(begin"
@ -6208,7 +6248,8 @@ static const char *startup_source =
" s_3" " s_3"
"(lambda(tail?_1 s_4)" "(lambda(tail?_1 s_4)"
"(gf_0 tail?_1 s_4))" "(gf_0 tail?_1 s_4))"
" seen_1))" " seen_1"
" known-pairs_1))"
"(if(null? s_3)" "(if(null? s_3)"
"(let-values()(f_1 tail?_0 s_3))" "(let-values()(f_1 tail?_0 s_3))"
"(if(pair? s_3)" "(if(pair? s_3)"
@ -6218,7 +6259,7 @@ static const char *startup_source =
"(cons" "(cons"
"(loop_0 #f(car s_3) depth_0)" "(loop_0 #f(car s_3) depth_0)"
"(loop_0" "(loop_0"
" #t" " 1"
"(cdr s_3)" "(cdr s_3)"
" depth_0))))" " depth_0))))"
"(if(symbol? s_3)" "(if(symbol? s_3)"
@ -6250,7 +6291,8 @@ static const char *startup_source =
" s_3" " s_3"
"(lambda(tail?_1 s_4)" "(lambda(tail?_1 s_4)"
"(gf_0 tail?_1 s_4))" "(gf_0 tail?_1 s_4))"
" seen_1))" " seen_1"
" known-pairs_1))"
"(let-values()" "(let-values()"
"(gf_0" "(gf_0"
" #f" " #f"
@ -6262,7 +6304,7 @@ static const char *startup_source =
"(if(if stx-p_0(not(eq?(syntax-props stx-p_0) empty-props)) #f)" "(if(if stx-p_0(not(eq?(syntax-props stx-p_0) empty-props)) #f)"
"(let-values(((the-struct_0) result-s_0))" "(let-values(((the-struct_0) result-s_0))"
"(if(syntax?$1 the-struct_0)" "(if(syntax?$1 the-struct_0)"
"(let-values(((props19_0)(syntax-props stx-p_0)))" "(let-values(((props20_0)(syntax-props stx-p_0)))"
"(syntax1.1" "(syntax1.1"
"(syntax-content the-struct_0)" "(syntax-content the-struct_0)"
"(syntax-scopes the-struct_0)" "(syntax-scopes the-struct_0)"
@ -6270,7 +6312,7 @@ static const char *startup_source =
"(syntax-scope-propagations+tamper the-struct_0)" "(syntax-scope-propagations+tamper the-struct_0)"
"(syntax-mpi-shifts the-struct_0)" "(syntax-mpi-shifts the-struct_0)"
"(syntax-srcloc the-struct_0)" "(syntax-srcloc the-struct_0)"
" props19_0" " props20_0"
"(syntax-inspector 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)))"
" result-s_0)))))))))))))))" " result-s_0)))))))))))))))"
@ -6283,9 +6325,10 @@ static const char *startup_source =
"(hasheq" "(hasheq"
" 'cycle-fail" " 'cycle-fail"
" (lambda (s_0) (raise-arguments-error 'datum->syntax \"cannot create syntax from cyclic datum\" \"datum\" s_0))))" " (lambda (s_0) (raise-arguments-error 'datum->syntax \"cannot create syntax from cyclic datum\" \"datum\" s_0))))"
"(define-values(syntax-place-init!)(lambda()(begin(unsafe-place-local-set! cell.1$7(make-weak-hasheq)))))"
"(define-values" "(define-values"
"(struct:syntax-state" "(struct:syntax-state"
" syntax-state17.1" " syntax-state18.1"
" syntax-state?" " syntax-state?"
" syntax-state-all-sharing?" " syntax-state-all-sharing?"
" syntax-state-context-triple" " syntax-state-context-triple"
@ -7807,13 +7850,15 @@ static const char *startup_source =
"(syntax-props the-struct_0)" "(syntax-props the-struct_0)"
"(syntax-inspector 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))" "((seen_0) #f)"
"((known-pairs_0) #f))"
"(let-values(((s_1) s_0)" "(let-values(((s_1) s_0)"
"((f_1) f_0)" "((f_1) f_0)"
"((gf_0)" "((gf_0)"
"(lambda(tail?_0 v_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))))))" "(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))" "((seen_1) seen_0)"
"((known-pairs_1) known-pairs_0))"
"((letrec-values(((loop_0)" "((letrec-values(((loop_0)"
"(lambda(tail?_0 s_2 prev-depth_0)" "(lambda(tail?_0 s_2 prev-depth_0)"
"(begin" "(begin"
@ -7821,14 +7866,19 @@ static const char *startup_source =
"(let-values(((depth_0)(fx+ 1 prev-depth_0)))" "(let-values(((depth_0)(fx+ 1 prev-depth_0)))"
"(if(if seen_1(fx> depth_0 32) #f)" "(if(if seen_1(fx> depth_0 32) #f)"
"(let-values()" "(let-values()"
"(datum-map-slow tail?_0 s_2(lambda(tail?_1 s_3)(gf_0 tail?_1 s_3)) seen_1))" "(datum-map-slow"
" tail?_0"
" s_2"
"(lambda(tail?_1 s_3)(gf_0 tail?_1 s_3))"
" seen_1"
" known-pairs_1))"
"(if(null? s_2)" "(if(null? s_2)"
"(let-values()(f_1 tail?_0 s_2))" "(let-values()(f_1 tail?_0 s_2))"
"(if(pair? s_2)" "(if(pair? s_2)"
"(let-values()" "(let-values()"
"(f_1" "(f_1"
" tail?_0" " tail?_0"
"(cons(loop_0 #f(car s_2) depth_0)(loop_0 #t(cdr s_2) depth_0))))" "(cons(loop_0 #f(car s_2) depth_0)(loop_0 1(cdr s_2) depth_0))))"
"(if(symbol? s_2)" "(if(symbol? s_2)"
"(let-values()(f_1 #f s_2))" "(let-values()(f_1 #f s_2))"
"(if(boolean? s_2)" "(if(boolean? s_2)"
@ -7848,7 +7898,8 @@ static const char *startup_source =
" tail?_0" " tail?_0"
" s_2" " s_2"
"(lambda(tail?_1 s_3)(gf_0 tail?_1 s_3))" "(lambda(tail?_1 s_3)(gf_0 tail?_1 s_3))"
" seen_1))" " seen_1"
" known-pairs_1))"
"(let-values()(gf_0 #f s_2))))))))))))))" "(let-values()(gf_0 #f s_2))))))))))))))"
" loop_0)" " loop_0)"
" #f" " #f"
@ -9055,7 +9106,8 @@ static const char *startup_source =
"(syntax-props the-struct_0)" "(syntax-props the-struct_0)"
"(syntax-inspector 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))" "((seen_0) #f)"
"((known-pairs_0) #f))"
"(let-values(((s_2) s_1)" "(let-values(((s_2) s_1)"
"((f_1) f_0)" "((f_1) f_0)"
"((gf_0)" "((gf_0)"
@ -9065,7 +9117,8 @@ static const char *startup_source =
"(if(syntax?$1 v_0)" "(if(syntax?$1 v_0)"
"(let-values()(s->_0 v_0))" "(let-values()(s->_0 v_0))"
"(let-values()(f_0 tail?_0 v_0))))))" "(let-values()(f_0 tail?_0 v_0))))))"
"((seen_1) seen_0))" "((seen_1) seen_0)"
"((known-pairs_1) known-pairs_0))"
"((letrec-values(((loop_0)" "((letrec-values(((loop_0)"
"(lambda(tail?_0 s_3 prev-depth_0)" "(lambda(tail?_0 s_3 prev-depth_0)"
"(begin" "(begin"
@ -9077,7 +9130,8 @@ static const char *startup_source =
" tail?_0" " tail?_0"
" s_3" " s_3"
"(lambda(tail?_1 s_4)(gf_0 tail?_1 s_4))" "(lambda(tail?_1 s_4)(gf_0 tail?_1 s_4))"
" seen_1))" " seen_1"
" known-pairs_1))"
"(if(null? s_3)" "(if(null? s_3)"
"(let-values()(f_1 tail?_0 s_3))" "(let-values()(f_1 tail?_0 s_3))"
"(if(pair? s_3)" "(if(pair? s_3)"
@ -9086,7 +9140,7 @@ static const char *startup_source =
" tail?_0" " tail?_0"
"(cons" "(cons"
"(loop_0 #f(car s_3) depth_0)" "(loop_0 #f(car s_3) depth_0)"
"(loop_0 #t(cdr s_3) depth_0))))" "(loop_0 1(cdr s_3) depth_0))))"
"(if(symbol? s_3)" "(if(symbol? s_3)"
"(let-values()(f_1 #f s_3))" "(let-values()(f_1 #f s_3))"
"(if(boolean? s_3)" "(if(boolean? s_3)"
@ -9107,7 +9161,8 @@ static const char *startup_source =
" tail?_0" " tail?_0"
" s_3" " s_3"
"(lambda(tail?_1 s_4)(gf_0 tail?_1 s_4))" "(lambda(tail?_1 s_4)(gf_0 tail?_1 s_4))"
" seen_1))" " seen_1"
" known-pairs_1))"
"(let-values()(gf_0 #f s_3))))))))))))))" "(let-values()(gf_0 #f s_3))))))))))))))"
" loop_0)" " loop_0)"
" #f" " #f"
@ -9431,7 +9486,8 @@ static const char *startup_source =
"(if(syntax?$1 v_0)" "(if(syntax?$1 v_0)"
"(let-values()(d->s_0 v_0(loop_0(s-e_0 v_0))))" "(let-values()(d->s_0 v_0(loop_0(s-e_0 v_0))))"
"(let-values()(f_0 tail?_0 v_0))))))" "(let-values()(f_0 tail?_0 v_0))))))"
"((seen_1) seen_0))" "((seen_1) seen_0)"
"((known-pairs_0) #f))"
"((letrec-values(((loop_1)" "((letrec-values(((loop_1)"
"(lambda(tail?_0 s_4 prev-depth_0)" "(lambda(tail?_0 s_4 prev-depth_0)"
"(begin" "(begin"
@ -9443,7 +9499,8 @@ static const char *startup_source =
" tail?_0" " tail?_0"
" s_4" " s_4"
"(lambda(tail?_1 s_5)(gf_0 tail?_1 s_5))" "(lambda(tail?_1 s_5)(gf_0 tail?_1 s_5))"
" seen_1))" " seen_1"
" known-pairs_0))"
"(if(null? s_4)" "(if(null? s_4)"
"(let-values()(f_1 tail?_0 s_4))" "(let-values()(f_1 tail?_0 s_4))"
"(if(pair? s_4)" "(if(pair? s_4)"
@ -9452,7 +9509,7 @@ static const char *startup_source =
" tail?_0" " tail?_0"
"(cons" "(cons"
"(loop_1 #f(car s_4) depth_0)" "(loop_1 #f(car s_4) depth_0)"
"(loop_1 #t(cdr s_4) depth_0))))" "(loop_1 1(cdr s_4) depth_0))))"
"(if(symbol? s_4)" "(if(symbol? s_4)"
"(let-values()(f_1 #f s_4))" "(let-values()(f_1 #f s_4))"
"(if(boolean? s_4)" "(if(boolean? s_4)"
@ -9476,7 +9533,8 @@ static const char *startup_source =
" tail?_0" " tail?_0"
" s_4" " s_4"
"(lambda(tail?_1 s_5)(gf_0 tail?_1 s_5))" "(lambda(tail?_1 s_5)(gf_0 tail?_1 s_5))"
" seen_1))" " seen_1"
" known-pairs_0))"
"(let-values()(gf_0 #f s_4))))))))))))))" "(let-values()(gf_0 #f s_4))))))))))))))"
" loop_1)" " loop_1)"
" #f" " #f"
@ -10042,7 +10100,8 @@ static const char *startup_source =
"(if(syntax?$1 v_0)" "(if(syntax?$1 v_0)"
"(let-values()(d->s_0 v_0(loop_0(s-e_0 v_0))))" "(let-values()(d->s_0 v_0(loop_0(s-e_0 v_0))))"
"(let-values()(f_0 tail?_0 v_0))))))" "(let-values()(f_0 tail?_0 v_0))))))"
"((seen_1) seen_0))" "((seen_1) seen_0)"
"((known-pairs_0) #f))"
"((letrec-values(((loop_1)" "((letrec-values(((loop_1)"
"(lambda(tail?_0 s_4 prev-depth_0)" "(lambda(tail?_0 s_4 prev-depth_0)"
"(begin" "(begin"
@ -10054,7 +10113,8 @@ static const char *startup_source =
" tail?_0" " tail?_0"
" s_4" " s_4"
"(lambda(tail?_1 s_5)(gf_0 tail?_1 s_5))" "(lambda(tail?_1 s_5)(gf_0 tail?_1 s_5))"
" seen_1))" " seen_1"
" known-pairs_0))"
"(if(null? s_4)" "(if(null? s_4)"
"(let-values()(f_1 tail?_0 s_4))" "(let-values()(f_1 tail?_0 s_4))"
"(if(pair? s_4)" "(if(pair? s_4)"
@ -10063,7 +10123,7 @@ static const char *startup_source =
" tail?_0" " tail?_0"
"(cons" "(cons"
"(loop_1 #f(car s_4) depth_0)" "(loop_1 #f(car s_4) depth_0)"
"(loop_1 #t(cdr s_4) depth_0))))" "(loop_1 1(cdr s_4) depth_0))))"
"(if(symbol? s_4)" "(if(symbol? s_4)"
"(let-values()(f_1 #f s_4))" "(let-values()(f_1 #f s_4))"
"(if(boolean? s_4)" "(if(boolean? s_4)"
@ -10090,7 +10150,8 @@ static const char *startup_source =
" s_4" " s_4"
"(lambda(tail?_1 s_5)" "(lambda(tail?_1 s_5)"
"(gf_0 tail?_1 s_5))" "(gf_0 tail?_1 s_5))"
" seen_1))" " seen_1"
" known-pairs_0))"
"(let-values()" "(let-values()"
"(gf_0 #f s_4))))))))))))))" "(gf_0 #f s_4))))))))))))))"
" loop_1)" " loop_1)"
@ -10257,7 +10318,8 @@ static const char *startup_source =
"(if(syntax?$1 v_0)" "(if(syntax?$1 v_0)"
"(let-values()(d->s_0 v_0(loop_0(s-e_0 v_0))))" "(let-values()(d->s_0 v_0(loop_0(s-e_0 v_0))))"
"(let-values()(f_0 tail?_0 v_0))))))" "(let-values()(f_0 tail?_0 v_0))))))"
"((seen_1) seen_0))" "((seen_1) seen_0)"
"((known-pairs_0) #f))"
"((letrec-values(((loop_1)" "((letrec-values(((loop_1)"
"(lambda(tail?_0 s_4 prev-depth_0)" "(lambda(tail?_0 s_4 prev-depth_0)"
"(begin" "(begin"
@ -10269,7 +10331,8 @@ static const char *startup_source =
" tail?_0" " tail?_0"
" s_4" " s_4"
"(lambda(tail?_1 s_5)(gf_0 tail?_1 s_5))" "(lambda(tail?_1 s_5)(gf_0 tail?_1 s_5))"
" seen_1))" " seen_1"
" known-pairs_0))"
"(if(null? s_4)" "(if(null? s_4)"
"(let-values()(f_1 tail?_0 s_4))" "(let-values()(f_1 tail?_0 s_4))"
"(if(pair? s_4)" "(if(pair? s_4)"
@ -10278,7 +10341,7 @@ static const char *startup_source =
" tail?_0" " tail?_0"
"(cons" "(cons"
"(loop_1 #f(car s_4) depth_0)" "(loop_1 #f(car s_4) depth_0)"
"(loop_1 #t(cdr s_4) depth_0))))" "(loop_1 1(cdr s_4) depth_0))))"
"(if(symbol? s_4)" "(if(symbol? s_4)"
"(let-values()(f_1 #f s_4))" "(let-values()(f_1 #f s_4))"
"(if(boolean? s_4)" "(if(boolean? s_4)"
@ -10305,7 +10368,8 @@ static const char *startup_source =
" s_4" " s_4"
"(lambda(tail?_1 s_5)" "(lambda(tail?_1 s_5)"
"(gf_0 tail?_1 s_5))" "(gf_0 tail?_1 s_5))"
" seen_1))" " seen_1"
" known-pairs_0))"
"(let-values()" "(let-values()"
"(gf_0 #f s_4))))))))))))))" "(gf_0 #f s_4))))))))))))))"
" loop_1)" " loop_1)"
@ -16353,7 +16417,8 @@ static const char *startup_source =
"(begin" "(begin"
" 's->" " 's->"
"(loop_0 s_2(syntax-taint-mode-property s_2)))))" "(loop_0 s_2(syntax-taint-mode-property s_2)))))"
"((seen_0) #f))" "((seen_0) #f)"
"((known-pairs_0) #f))"
"(let-values(((s_3) s_2)" "(let-values(((s_3) s_2)"
"((f_1) f_0)" "((f_1) f_0)"
"((gf_0)" "((gf_0)"
@ -16363,7 +16428,8 @@ static const char *startup_source =
"(if(syntax?$1 v_0)" "(if(syntax?$1 v_0)"
"(let-values()(s->_0 v_0))" "(let-values()(s->_0 v_0))"
"(let-values()(f_0 tail?_0 v_0))))))" "(let-values()(f_0 tail?_0 v_0))))))"
"((seen_1) seen_0))" "((seen_1) seen_0)"
"((known-pairs_1) known-pairs_0))"
"((letrec-values(((loop_1)" "((letrec-values(((loop_1)"
"(lambda(tail?_0 s_4 prev-depth_0)" "(lambda(tail?_0 s_4 prev-depth_0)"
"(begin" "(begin"
@ -16377,7 +16443,8 @@ static const char *startup_source =
" s_4" " s_4"
"(lambda(tail?_1 s_5)" "(lambda(tail?_1 s_5)"
"(gf_0 tail?_1 s_5))" "(gf_0 tail?_1 s_5))"
" seen_1))" " seen_1"
" known-pairs_1))"
"(if(null? s_4)" "(if(null? s_4)"
"(let-values()(f_1 tail?_0 s_4))" "(let-values()(f_1 tail?_0 s_4))"
"(if(pair? s_4)" "(if(pair? s_4)"
@ -16387,7 +16454,7 @@ static const char *startup_source =
"(cons" "(cons"
"(loop_1 #f(car s_4) depth_0)" "(loop_1 #f(car s_4) depth_0)"
"(loop_1" "(loop_1"
" #t" " 1"
"(cdr s_4)" "(cdr s_4)"
" depth_0))))" " depth_0))))"
"(if(symbol? s_4)" "(if(symbol? s_4)"
@ -16419,7 +16486,8 @@ static const char *startup_source =
" s_4" " s_4"
"(lambda(tail?_1 s_5)" "(lambda(tail?_1 s_5)"
"(gf_0 tail?_1 s_5))" "(gf_0 tail?_1 s_5))"
" seen_1))" " seen_1"
" known-pairs_1))"
"(let-values()" "(let-values()"
"(gf_0" "(gf_0"
" #f" " #f"
@ -16465,7 +16533,8 @@ static const char *startup_source =
"(loop_0" "(loop_0"
" s_2" " s_2"
"(syntax-taint-mode-property s_2)))))" "(syntax-taint-mode-property s_2)))))"
"((seen_0) #f))" "((seen_0) #f)"
"((known-pairs_0) #f))"
"(let-values(((s_3) s_2)" "(let-values(((s_3) s_2)"
"((f_1) f_0)" "((f_1) f_0)"
"((gf_0)" "((gf_0)"
@ -16475,7 +16544,8 @@ static const char *startup_source =
"(if(syntax?$1 v_0)" "(if(syntax?$1 v_0)"
"(let-values()(s->_0 v_0))" "(let-values()(s->_0 v_0))"
"(let-values()(f_0 tail?_0 v_0))))))" "(let-values()(f_0 tail?_0 v_0))))))"
"((seen_1) seen_0))" "((seen_1) seen_0)"
"((known-pairs_1) known-pairs_0))"
"((letrec-values(((loop_1)" "((letrec-values(((loop_1)"
"(lambda(tail?_0 s_4 prev-depth_0)" "(lambda(tail?_0 s_4 prev-depth_0)"
"(begin" "(begin"
@ -16489,7 +16559,8 @@ static const char *startup_source =
" s_4" " s_4"
"(lambda(tail?_1 s_5)" "(lambda(tail?_1 s_5)"
"(gf_0 tail?_1 s_5))" "(gf_0 tail?_1 s_5))"
" seen_1))" " seen_1"
" known-pairs_1))"
"(if(null? s_4)" "(if(null? s_4)"
"(let-values()" "(let-values()"
"(f_1 tail?_0 s_4))" "(f_1 tail?_0 s_4))"
@ -16503,7 +16574,7 @@ static const char *startup_source =
"(car s_4)" "(car s_4)"
" depth_0)" " depth_0)"
"(loop_1" "(loop_1"
" #t" " 1"
"(cdr s_4)" "(cdr s_4)"
" depth_0))))" " depth_0))))"
"(if(symbol? s_4)" "(if(symbol? s_4)"
@ -16541,7 +16612,8 @@ static const char *startup_source =
"(gf_0" "(gf_0"
" tail?_1" " tail?_1"
" s_5))" " s_5))"
" seen_1))" " seen_1"
" known-pairs_1))"
"(let-values()" "(let-values()"
"(gf_0" "(gf_0"
" #f" " #f"
@ -83784,6 +83856,7 @@ static const char *startup_source =
"(lambda()" "(lambda()"
"(begin" "(begin"
"(begin" "(begin"
"(syntax-place-init!)"
"(scope-place-init!)" "(scope-place-init!)"
"(cache-place-init!)" "(cache-place-init!)"
"(core-place-init!)" "(core-place-init!)"