From 07d3f3a2ec0a5a83a2fbe539e9ef38da4727274d Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Wed, 20 May 2020 06:17:53 -0600 Subject: [PATCH] cs: faster `number->string` on flonums --- pkgs/racket-test-core/tests/racket/number.rktl | 2 ++ racket/src/cs/rumble/number.ss | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/pkgs/racket-test-core/tests/racket/number.rktl b/pkgs/racket-test-core/tests/racket/number.rktl index dc50978f9e..57a750d3a1 100644 --- a/pkgs/racket-test-core/tests/racket/number.rktl +++ b/pkgs/racket-test-core/tests/racket/number.rktl @@ -179,6 +179,8 @@ (test "+nan.0" number->string +nan.0) (test "+nan.0" number->string +nan.0) +(test "1589935744527.254" number->string 1589935744527.254) + #reader "maybe-single.rkt" (begin (test (if has-single-flonum? "+inf.f" "+inf.0") number->string +inf.f) diff --git a/racket/src/cs/rumble/number.ss b/racket/src/cs/rumble/number.ss index c63ee90602..7ee27af8ff 100644 --- a/racket/src/cs/rumble/number.ss +++ b/racket/src/cs/rumble/number.ss @@ -393,6 +393,13 @@ result)] [else (cond + [(and (eq? radix 10) + (number? n)) + ;; `number->string` goes through `format` to get to an implementation + ;; like this, so take a shortcut: + (let ([op (#%open-output-string)]) + (#%display n op) + (#%get-output-string op))] [(eq? radix 16) ;; Host generates uppercase letters, Racket generates lowercase (string-downcase (#2%number->string n radix))]