diff options
author | Robert Griesemer <gri@golang.org> | 2016-10-31 16:58:15 -0700 |
---|---|---|
committer | Robert Griesemer <gri@golang.org> | 2016-11-01 05:18:47 +0000 |
commit | 7a26d9fcedd94a1ba0d95833b0cdbbdcc776fe19 (patch) | |
tree | 313c90278a6268c3f1b20eb4e6fe87ef8e086caf /src/cmd/compile/internal/syntax/syntax.go | |
parent | 53fc330e2d154443acf3d01e0d68bae22b2b7804 (diff) | |
download | go-7a26d9fcedd94a1ba0d95833b0cdbbdcc776fe19.tar.gz go-7a26d9fcedd94a1ba0d95833b0cdbbdcc776fe19.zip |
cmd/compile/internal/syntax: don't panic if no error handler is provided
If no error handler is provided, terminate parsing with first error
and report that error.
Fixes #17697.
Change-Id: I9070faf7239bd53725de141507912b92ded3474b
Reviewed-on: https://go-review.googlesource.com/32456
Run-TryBot: Robert Griesemer <gri@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Diffstat (limited to 'src/cmd/compile/internal/syntax/syntax.go')
-rw-r--r-- | src/cmd/compile/internal/syntax/syntax.go | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/src/cmd/compile/internal/syntax/syntax.go b/src/cmd/compile/internal/syntax/syntax.go index 49831d0fbd..71fc097c3b 100644 --- a/src/cmd/compile/internal/syntax/syntax.go +++ b/src/cmd/compile/internal/syntax/syntax.go @@ -5,6 +5,7 @@ package syntax import ( + "errors" "fmt" "io" "os" @@ -52,18 +53,31 @@ func ReadBytes(src []byte, errh ErrorHandler, pragh PragmaHandler, mode Mode) (* return Read(&bytesReader{src}, errh, pragh, mode) } -func Read(src io.Reader, errh ErrorHandler, pragh PragmaHandler, mode Mode) (*File, error) { +func Read(src io.Reader, errh ErrorHandler, pragh PragmaHandler, mode Mode) (ast *File, err error) { + defer func() { + if p := recover(); p != nil { + if msg, ok := p.(parserError); ok { + err = errors.New(string(msg)) + return + } + panic(p) + } + }() + var p parser p.init(src, errh, pragh) - p.next() - ast := p.file() + ast = p.file() + // TODO(gri) This isn't quite right: Even if there's an error handler installed + // we should report an error if parsing found syntax errors. This also + // requires updating the noder's ReadFile call. if errh == nil && p.nerrors > 0 { - return nil, fmt.Errorf("%d syntax errors", p.nerrors) + ast = nil + err = fmt.Errorf("%d syntax errors", p.nerrors) } - return ast, nil + return } func Write(w io.Writer, n *File) error { |