diff --git a/pkgs/racket-test/tests/racket/print.rktl b/pkgs/racket-test/tests/racket/print.rktl index a05436cd28..7e00ad3f76 100644 --- a/pkgs/racket-test/tests/racket/print.rktl +++ b/pkgs/racket-test/tests/racket/print.rktl @@ -255,6 +255,18 @@ (test +inf.0 print-syntax-width)) ;; ---------------------------------------- +;; Try to provoke a stack overflow during printing of truncated +;; values, ensuring that the stack-overflow handling doesn't +;; interfere with the printer escape on truncation: + +(with-handlers ([void void]) + (let loop ([i 6013]) + (if (zero? i) + (break-thread) + (with-handlers ([void (lambda (x y) x)]) + (loop (sub1 i)))))) + +;; ---------------------------------------- (report-errs) diff --git a/racket/src/racket/src/print.c b/racket/src/racket/src/print.c index 1929acddde..03e0b2d324 100644 --- a/racket/src/racket/src/print.c +++ b/racket/src/racket/src/print.c @@ -1411,13 +1411,15 @@ static Scheme_Object *print_k(void) pp->print_escape = save; return scheme_void; } else { - return print(o, - p->ku.k.i1, - p->ku.k.i2, - ht, - mt, - pp) - ? scheme_true : scheme_false; + int r; + r = print(o, + p->ku.k.i1, + p->ku.k.i2, + ht, + mt, + pp); + pp->print_escape = save; + return r ? scheme_true : scheme_false; } } #endif