linklet flattener: repair to name simplifier

The linklet flattener's name-simplification pass (intended to avoid
gratuitious changes in "startup.inc") didn't recognize all binding
forms.
This commit is contained in:
Matthew Flatt 2018-08-12 08:50:35 -06:00
parent 107d1e42a7
commit 7cbeebbb89
5 changed files with 38225 additions and 39572 deletions

View File

@ -92,7 +92,7 @@
(define input-s (flip-introduction-scopes (add-intdef-scopes s all-intdefs) ctx))
(define tmp-env (for/fold ([env (expand-context-env ctx)]) ([sym (in-list syms)]
[intdef-id (in-list intdef-ids)])
(hash-set env sym (local-variable intdef-id))))
(env-extend env sym (local-variable intdef-id))))
(log-expand ctx 'enter-bind)
(define vals
(eval-for-syntaxes-binding 'syntax-local-bind-syntaxes

View File

@ -39,6 +39,8 @@
(define empty-env #hasheq())
(define (env-extend env key val)
(hash-set env key val))
(define (lookup env key default)
(hash-ref env key default))
;; `variable` is a token to represent a binding to a run-time variable
(define variable (gensym 'variable))
@ -134,13 +136,13 @@
(define insp (and mi (module-instance-module mi) (module-inspector (module-instance-module mi))))
(values t primitive? insp protected?)]
[(local-binding? b)
(define t (hash-ref env (local-binding-key b) missing))
(define t (lookup env (local-binding-key b) missing))
(cond
[(eq? t missing)
(values (or
;; check in lift envs, if any
(for/or ([lift-env (in-list lift-envs)])
(hash-ref (unbox lift-env) (local-binding-key b) #f))
(lookup (unbox lift-env) (local-binding-key b) #f))
(if out-of-context-as-variable?
variable
(error "identifier used out of context:" id)))

View File

@ -76,7 +76,7 @@
(define keys
(for/list ([id (in-list ids)])
(define key (add-local-binding! id phase counter))
(set-box! lift-env (hash-set (unbox lift-env) key variable))
(set-box! lift-env (env-extend (unbox lift-env) key variable))
key))
(values ids (lifted-bind ids keys rhs))))

View File

@ -80,8 +80,8 @@
(rename-vars formals replacements base-counts))
`[,new-formals . ,(collapse-in-body body new-replacements new-base-counts)]))]
[`(quote . ,_) e]
[`(let-values . _) (collapse-in-let e #f replacements base-counts)]
[`(letrec-values . _) (collapse-in-let e #t replacements base-counts)]
[`(let-values . ,_) (collapse-in-let e #f replacements base-counts)]
[`(letrec-values . ,_) (collapse-in-let e #t replacements base-counts)]
[`(,pseudo-es ...) ; catch-all for remaining syntactic forms
(collapse-in-body pseudo-es replacements base-counts)]
[_ (if (symbol? e)
@ -96,7 +96,7 @@
(match e
[`(,let-form ([,idss ,rhss] ...) ,body ...)
(define-values (new-idss body-replacements body-base-counts)
(rename-vars idss replacements body-base-counts))
(rename-vars idss replacements base-counts))
(define-values (rhs-replacements rhs-base-counts)
(if rec?
(values body-replacements body-base-counts)

File diff suppressed because it is too large Load Diff