From bc5ab1e03128db600a6909e2150ebfdfb9b3dee6 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Sun, 30 Jan 2011 07:47:10 -0600 Subject: [PATCH] fix problems with `read-language' error reporting --- collects/scribblings/reference/read.scrbl | 4 +++- collects/tests/racket/read.rktl | 8 ++++++++ src/racket/src/read.c | 9 ++++++--- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/collects/scribblings/reference/read.scrbl b/collects/scribblings/reference/read.scrbl index 9355611abb..3e63ed48b3 100644 --- a/collects/scribblings/reference/read.scrbl +++ b/collects/scribblings/reference/read.scrbl @@ -158,7 +158,9 @@ is @racket[#f]. If @racket[in] has a @litchar{#lang} or @litchar{#!} specification, but parsing and resolving the specification raises an exception, the -exception is propagated by @racket[read-language]. +exception is propagated by @racket[read-language]. Having at least +@litchar{#l} or @litchar{#!} (after comments and whitespace) counts as +starting a @litchar{#lang} or @litchar{#!} specification. If @racket[in] does not specify a @tech{reader language} with @litchar{#lang} or @litchar{#!}, then @racket[fail-thunk] is diff --git a/collects/tests/racket/read.rktl b/collects/tests/racket/read.rktl index 55a860963a..38f93b84d3 100644 --- a/collects/tests/racket/read.rktl +++ b/collects/tests/racket/read.rktl @@ -1095,6 +1095,14 @@ (check-nothing ";" exn:fail:read:eof?) (check-nothing "#| |#" exn:fail:read:eof?) (check-nothing "8 9" exn:fail:read?)) +(err/rt-test (read-language (open-input-string "#l") void) exn:fail:read:eof?) +(err/rt-test (read-language (open-input-string "#la") void) exn:fail:read:eof?) +(err/rt-test (read-language (open-input-string ";;\n;\n#la") void) exn:fail:read:eof?) +(err/rt-test (read-language (open-input-string ";;\n;\n#lx") void) exn:fail:read?) +(test (void) read-language (open-input-string ";;\n;\n#xa") void) +;; Check error-message formatting: +(err/rt-test (read (open-input-string "#l")) + (lambda (exn) (regexp-match? #rx"`#l'" (exn-message exn)))) ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/src/racket/src/read.c b/src/racket/src/read.c index a1e31523d0..6f0535b408 100644 --- a/src/racket/src/read.c +++ b/src/racket/src/read.c @@ -1547,16 +1547,19 @@ read_inner_inner(Scheme_Object *port, Scheme_Object *stxsrc, Scheme_Hash_Table * } return v; } else { + if (ch == EOF) --fl; scheme_read_err(port, stxsrc, line, col, pos, 6, ch, indentation, - "read: expected a single space after `#lang'", - found, fl); + "read%s: expected a single space after `#lang'", + (get_info ? "-language" : "")); return NULL; } } } } + if (ch == EOF) --fl; scheme_read_err(port, stxsrc, line, col, pos, fl, ch, indentation, - "read: bad input: `#%u'", + "read%s: bad input: `#%u'", + (get_info ? "-language" : ""), found, (intptr_t)fl); return NULL; }