From ef47f7b3b0c39c6512f55a48324342f95063d3a3 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Fri, 10 Feb 2023 17:57:33 -0700 Subject: decode: Move the recover() from Decode() to decode() --- decode.go | 49 +++++++++++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 18 deletions(-) (limited to 'decode.go') diff --git a/decode.go b/decode.go index 2078f92..976ab9b 100644 --- a/decode.go +++ b/decode.go @@ -243,17 +243,9 @@ func (dec *Decoder) Decode(ptr any) (err error) { dec.io.Reset() dec.io.PushReadBarrier() - defer func() { - if r := recover(); r != nil { - if de, ok := r.(decodeError); ok { - pub := DecodeError(de) - err = &pub - } else { - panic(r) - } - } - }() - dec.decode(ptrVal.Elem(), false) + if err := dec.decode(ptrVal.Elem(), false); err != nil { + return err + } dec.io.PopReadBarrier() return nil } @@ -375,7 +367,17 @@ var kind2bits = map[reflect.Kind]int{ reflect.Float64: 64, } -func (dec *Decoder) decode(val reflect.Value, nullOK bool) { +func (dec *Decoder) decode(val reflect.Value, nullOK bool) (_err *DecodeError) { + defer func() { + if r := recover(); r != nil { + if de, ok := r.(decodeError); ok { + pub := DecodeError(de) + _err = &pub + } else { + panic(r) + } + } + }() dec.posStackPush() defer dec.posStackPop() typ := val.Type() @@ -507,7 +509,9 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) { // We only need the pointer itself to be settable if we're // decoding null. if ptr.Elem() != val && (ptr.CanSet() || dec.peekRuneType() != jsonparse.RuneTypeNullN) { - dec.decode(ptr, false) + if err := dec.decode(ptr, false); err != nil { + return err + } break } } @@ -601,7 +605,9 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) { fVal.Type())) } } else { - dec.decode(fVal, true) + if err := dec.decode(fVal, true); err != nil { + panic(decodeError(*err)) + } } }) case reflect.Map: @@ -655,7 +661,9 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) { defer dec.structStackPop() fValPtr := reflect.New(typ.Elem()) - dec.decode(fValPtr.Elem(), false) + if err := dec.decode(fValPtr.Elem(), false); err != nil { + panic(decodeError(*err)) + } val.SetMapIndex(nameValPtr.Elem(), fValPtr.Elem()) }) @@ -710,7 +718,9 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) { dec.structStackPush(typ, i) defer dec.structStackPop() mValPtr := reflect.New(typ.Elem()) - dec.decode(mValPtr.Elem(), false) + if err := dec.decode(mValPtr.Elem(), false); err != nil { + panic(decodeError(*err)) + } val.Set(reflect.Append(val, mValPtr.Elem())) i++ }) @@ -732,7 +742,9 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) { defer dec.structStackPop() if i < n { mValPtr := reflect.New(typ.Elem()) - dec.decode(mValPtr.Elem(), false) + if err := dec.decode(mValPtr.Elem(), false); err != nil { + panic(decodeError(*err)) + } val.Index(i).Set(mValPtr.Elem()) } else { dec.scan(fastio.Discard) @@ -751,12 +763,13 @@ func (dec *Decoder) decode(val reflect.Value, nullOK bool) { if val.IsNil() { val.Set(reflect.New(typ.Elem())) } - dec.decode(val.Elem(), false) + return dec.decode(val.Elem(), false) } default: dec.panicType("", typ, fmt.Errorf("unsupported type (kind=%v)", typ.Kind())) } } + return nil } func (dec *Decoder) scan(out fastio.RuneWriter) { -- cgit v1.2.3-2-g168b