From 93d84170d00ab54adb97aa84425f6a88bd40a61e Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Mon, 6 May 2019 07:56:37 -0600 Subject: [PATCH] read: fix `#e` after `#x` Corrects a bug in 0549bfb1e5 where `#x` causes the `e` in `#e` to be interpreted as 14 instead of the character `#\e`. --- pkgs/racket-test-core/tests/racket/numstrs.rktl | 5 +++++ racket/src/expander/read/number.rkt | 3 ++- racket/src/racket/src/startup.inc | 3 +-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/pkgs/racket-test-core/tests/racket/numstrs.rktl b/pkgs/racket-test-core/tests/racket/numstrs.rktl index 655af4bf8f..11661025c1 100644 --- a/pkgs/racket-test-core/tests/racket/numstrs.rktl +++ b/pkgs/racket-test-core/tests/racket/numstrs.rktl @@ -132,7 +132,12 @@ (5000.0 "1#/2#e4") (500000000.0 "1/2#e10") (500000000 "#e1/2#e10") + (36 "#e#x24") + (-36 "#e#x-24") + (36 "#x#e24") + (-36 "#x#e-24") (16140901064495857664-50176i "#e#x+e#s+e@-e#l-e") + (16140901064495857664-50176i "#x#e+e#s+e@-e#l-e") (,(make-rectangular -inf.f 3.1415927f0) "-inf.f+3.1415927f0i") (,(make-rectangular -inf.0 3.1415927) "-inf.f+3.1415927i") diff --git a/racket/src/expander/read/number.rkt b/racket/src/expander/read/number.rkt index 463c5a8dab..02ced7cc50 100644 --- a/racket/src/expander/read/number.rkt +++ b/racket/src/expander/read/number.rkt @@ -434,7 +434,8 @@ [(#\#) (define next (fx+ 1 start)) (parse-case - s next end radix => i + ;; use `10` instead of `radix`, because we don't want a hex conversion + s next end 10 => i [(eof) (fail convert-mode "no character after `#` indicator in `~.a`" s)] [(#\e #\E #\i #\I) diff --git a/racket/src/racket/src/startup.inc b/racket/src/racket/src/startup.inc index 1c8ca351e6..a80263e02c 100644 --- a/racket/src/racket/src/startup.inc +++ b/racket/src/racket/src/startup.inc @@ -54680,8 +54680,7 @@ static const char *startup_source = "(let-values(((i_0)" "(if(fx= next_0 end_0)" " 'eof" -"(let-values(((c_1)(string-ref s_0 next_0)))" -"(maybe-digit c_1 radix_0)))))" +"(let-values(((c_1)(string-ref s_0 next_0)))(maybe-digit c_1 10)))))" "(if(let-values(((or-part_0)(eqv? i_0 'eof)))(if or-part_0 or-part_0 #f))" "(let-values()" "(if(eq?(state->convert-mode convert-mode_0) 'must-read)"