From 483bbdc970b26d774ace39edfde8420aba53b742 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Tue, 7 Feb 2023 14:01:44 -0700 Subject: Sync borrowed code from Go 1.20 New tests mean encode.go and compat.go also need some bugfixes. --- compat/json/compat.go | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) (limited to 'compat/json/compat.go') diff --git a/compat/json/compat.go b/compat/json/compat.go index 688b35c..3678135 100644 --- a/compat/json/compat.go +++ b/compat/json/compat.go @@ -72,25 +72,35 @@ func Marshal(v any) ([]byte, error) { } type Encoder struct { + out io.Writer + buf bytes.Buffer encoder *lowmemjson.Encoder formatter *lowmemjson.ReEncoder } func NewEncoder(w io.Writer) *Encoder { ret := &Encoder{ - formatter: lowmemjson.NewReEncoder(w, lowmemjson.ReEncoderConfig{ - AllowMultipleValues: true, - - Compact: true, - ForceTrailingNewlines: true, - }), + out: w, } + ret.formatter = lowmemjson.NewReEncoder(&ret.buf, lowmemjson.ReEncoderConfig{ + AllowMultipleValues: true, + + Compact: true, + ForceTrailingNewlines: true, + }) ret.encoder = lowmemjson.NewEncoder(ret.formatter) return ret } func (enc *Encoder) Encode(v any) error { - return convertEncodeError(enc.encoder.Encode(v)) + if err := convertEncodeError(enc.encoder.Encode(v)); err != nil { + enc.buf.Reset() + return err + } + if _, err := enc.buf.WriteTo(enc.out); err != nil { + return err + } + return nil } func (enc *Encoder) SetEscapeHTML(on bool) { -- cgit v1.2.3-2-g168b