Merge branch 'master' of github.com:racket/racket

This commit is contained in:
Matthew Flatt 2020-07-29 05:20:13 -06:00
commit af651ca435
3 changed files with 24 additions and 2 deletions

View File

@ -1013,7 +1013,7 @@ macro expansion in the current definition context.
In a @tech{syntax transformer} that runs in a non-expression context In a @tech{syntax transformer} that runs in a non-expression context
and forces the expansion of subforms with @racket[local-expand], use and forces the expansion of subforms with @racket[local-expand], use
@racket[syntax-local-identifier-as-binding] on an identifier from the @racket[syntax-local-identifier-as-binding] on an identifier from the
expansion before moving it into a binding position or comparing with expansion before moving it into a binding position or comparing it
with @racket[bound-identifier=?]. Otherwise, the results can be with @racket[bound-identifier=?]. Otherwise, the results can be
inconsistent with the way that @racket[define] works in the same inconsistent with the way that @racket[define] works in the same
definition context. definition context.

View File

@ -6619,6 +6619,28 @@
n)]) n)])
(lambda (x) (h x))))) (lambda (x) (h x)))))
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Regression test related to single-use variables
;; and disabled inlining
(parameterize ([compile-context-preservation-enabled #t]
[current-namespace (make-base-namespace)])
(void
(compile
'(module m racket/base
(letrec ([f (lambda () 0)]
[g (let ([g2
(lambda ()
(let ([x (f)])
(list (lambda () x) h)))])
g2)]
[h (letrec ([loop
(lambda ()
(let ([y (g)])
(list y loop)))])
loop)])
h)))))
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(report-errs) (report-errs)

View File

@ -9622,7 +9622,7 @@ Scheme_Object *optimize_expr(Scheme_Object *expr, Optimize_Info *info, int conte
int save_fuel = info->inline_fuel, save_no_types = info->no_types; int save_fuel = info->inline_fuel, save_no_types = info->no_types;
int save_vclock, save_aclock, save_kclock, save_sclock; int save_vclock, save_aclock, save_kclock, save_sclock;
info->size -= 1; info->size -= 1;
info->inline_fuel = 0; /* no more inlining; o->expr was already optimized */ info->inline_fuel = -1; /* no more inlining; o->expr was already optimized */
info->no_types = 1; /* cannot used inferred types, in case `val' inferred them */ info->no_types = 1; /* cannot used inferred types, in case `val' inferred them */
save_vclock = info->vclock; /* allowed to move => no change to clocks */ save_vclock = info->vclock; /* allowed to move => no change to clocks */
save_aclock = info->aclock; save_aclock = info->aclock;