summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2023-02-10 17:57:33 -0700
committerLuke Shumaker <lukeshu@lukeshu.com>2023-02-10 21:49:02 -0700
commitef47f7b3b0c39c6512f55a48324342f95063d3a3 (patch)
treece93083691ddb586fc7828630b32cea3299933bc
parenta8d2fdc1ae082f350c221dbea0cfc9065a6ef2c0 (diff)
decode: Move the recover() from Decode() to decode()
-rw-r--r--decode.go49
1 files changed, 31 insertions, 18 deletions
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) {