From 6b11bd03dd572a4c1b5bb2a72da5a556c7998c56 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Wed, 17 Aug 2022 00:48:11 -0600 Subject: decode: Don't be greedy unless we're looking for EOF --- decode.go | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/decode.go b/decode.go index 52fcb5e..9c05860 100644 --- a/decode.go +++ b/decode.go @@ -130,15 +130,25 @@ func DecodeThenEOF(r interface { if err := dec.Decode(ptr); err != nil { return err } - if c, _, err := r.ReadRune(); err == nil { - return &DecodeError{ - Err: &DecodeSyntaxError{ - Err: fmt.Errorf("invalid character %q after top-level value", c), - Offset: dec.InputOffset(), - }, + for { + c, s, t, _ := dec.io.ReadRuneType() + switch t { + case RuneTypeSpace: + // do nothing + case RuneTypeEOF: + if s > 0 { + return &DecodeError{ + Err: &DecodeSyntaxError{ + Err: fmt.Errorf("invalid character %q after top-level value", c), + Offset: dec.InputOffset(), + }, + } + } + return nil + default: + panic("should not happen") } } - return nil } func (dec *Decoder) Decode(ptr any) (err error) { @@ -167,15 +177,6 @@ func (dec *Decoder) Decode(ptr any) (err error) { } }() dec.decode(ptrVal.Elem(), false) - for { - _, s, t, _ := dec.io.ReadRuneType() - if t == RuneTypeEOF || t == RuneTypeError { - if s > 0 { - dec.io.UnreadRune() - } - break - } - } return nil } -- cgit v1.2.3-2-g168b