diff --git a/pkgs/racket-test-core/tests/racket/optimize.rktl b/pkgs/racket-test-core/tests/racket/optimize.rktl index 36e48238b4..9e9f9475c4 100644 --- a/pkgs/racket-test-core/tests/racket/optimize.rktl +++ b/pkgs/racket-test-core/tests/racket/optimize.rktl @@ -6390,6 +6390,37 @@ (set! f f) ((car f)))) +;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Regression test to check that `values` is +;; handled correctly for estimating clock advances + +(module triggers-optimizer-clock-estimation racket/base + (require (for-syntax racket/base)) + + (define (in-naturals0 n) + (in-naturals n)) + + ;; restrict for/xyz to simple form and name it for/xyz0 + (define-syntax (define-for stx) + (syntax-case stx () + [(_ for/xyz0 for/xyz cleanup) + #'(define-syntax (for/xyz0 stx) + (syntax-case stx () + [(_ ((clause0.x clause0.range)) body) + #`(cleanup + (for/xyz ((clause0.x (string> clause0.range))) + ;; the following line exists only so that coverage doesn't hilite x0 x ... + clause0.x + body))]))])) + + (define-for for/list0 for/list values) + + (define (string> s) + (if (string? s) (string->list s) s)) + + (void + (for/list0 ((dropping-which-one (in-naturals0))) 1))) + ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (report-errs) diff --git a/racket/src/racket/src/optimize.c b/racket/src/racket/src/optimize.c index 601df134fb..573766c8a4 100644 --- a/racket/src/racket/src/optimize.c +++ b/racket/src/racket/src/optimize.c @@ -2815,6 +2815,8 @@ static int is_noncapturing_primitive(Scheme_Object *rator, int n) t = (((Scheme_Primitive_Proc *)rator)->pp.flags & SCHEME_PRIM_OTHER_TYPE_MASK); if (!n && (t == SCHEME_PRIM_TYPE_PARAMETER)) return 1; + if (SAME_TYPE(rator, scheme_values_proc)) + return 1; } return 0; @@ -2827,6 +2829,8 @@ static int is_nonsaving_primitive(Scheme_Object *rator, int n) opt = ((Scheme_Prim_Proc_Header *)rator)->flags & SCHEME_PRIM_OPT_MASK; if (opt >= SCHEME_PRIM_OPT_IMMEDIATE) return 1; + if (SAME_TYPE(rator, scheme_values_proc)) + return 1; } return 0; @@ -6893,7 +6897,7 @@ void advance_clocks_for_optimized(Scheme_Object *o, Optimize_Info *info, int fuel) /* It's ok for this function to advance clocks *less* than - acurrately, but not more than acurrately */ + accurately, but not more than accurately */ { Scheme_Object *rator = NULL; int argc = 0;