bump(ugoriji/go/codec): ded73eae5db7e7a0ef6f55aace87a2873c5d2b74
This commit is contained in:

committed by
Dr. Stefan Schimanski

parent
1122bf2c58
commit
9045892464
66
vendor/github.com/ugorji/go/codec/decode.go
generated
vendored
66
vendor/github.com/ugorji/go/codec/decode.go
generated
vendored
@@ -91,10 +91,12 @@ type decDriver interface {
|
||||
uncacheRead()
|
||||
}
|
||||
|
||||
type decNoSeparator struct{}
|
||||
type decNoSeparator struct {
|
||||
}
|
||||
|
||||
func (_ decNoSeparator) ReadEnd() {}
|
||||
func (_ decNoSeparator) uncacheRead() {}
|
||||
func (_ decNoSeparator) ReadEnd() {}
|
||||
|
||||
// func (_ decNoSeparator) uncacheRead() {}
|
||||
|
||||
type DecodeOptions struct {
|
||||
// MapType specifies type to use during schema-less decoding of a map in the stream.
|
||||
@@ -161,6 +163,15 @@ type DecodeOptions struct {
|
||||
// Note: Handles will be smart when using the intern functionality.
|
||||
// So everything will not be interned.
|
||||
InternString bool
|
||||
|
||||
// PreferArrayOverSlice controls whether to decode to an array or a slice.
|
||||
//
|
||||
// This only impacts decoding into a nil interface{}.
|
||||
// Consequently, it has no effect on codecgen.
|
||||
//
|
||||
// *Note*: This only applies if using go1.5 and above,
|
||||
// as it requires reflect.ArrayOf support which was absent before go1.5.
|
||||
PreferArrayOverSlice bool
|
||||
}
|
||||
|
||||
// ------------------------------------
|
||||
@@ -433,6 +444,10 @@ func (f *decFnInfo) rawExt(rv reflect.Value) {
|
||||
f.d.d.DecodeExt(rv.Addr().Interface(), 0, nil)
|
||||
}
|
||||
|
||||
func (f *decFnInfo) raw(rv reflect.Value) {
|
||||
rv.SetBytes(f.d.raw())
|
||||
}
|
||||
|
||||
func (f *decFnInfo) ext(rv reflect.Value) {
|
||||
f.d.d.DecodeExt(rv.Addr().Interface(), f.xfTag, f.xfFn)
|
||||
}
|
||||
@@ -583,14 +598,16 @@ func (f *decFnInfo) kInterfaceNaked() (rvn reflect.Value) {
|
||||
if d.mtid == 0 || d.mtid == mapIntfIntfTypId {
|
||||
l := len(n.ms)
|
||||
n.ms = append(n.ms, nil)
|
||||
d.decode(&n.ms[l])
|
||||
rvn = reflect.ValueOf(&n.ms[l]).Elem()
|
||||
var v2 interface{} = &n.ms[l]
|
||||
d.decode(v2)
|
||||
rvn = reflect.ValueOf(v2).Elem()
|
||||
n.ms = n.ms[:l]
|
||||
} else if d.mtid == mapStrIntfTypId { // for json performance
|
||||
l := len(n.ns)
|
||||
n.ns = append(n.ns, nil)
|
||||
d.decode(&n.ns[l])
|
||||
rvn = reflect.ValueOf(&n.ns[l]).Elem()
|
||||
var v2 interface{} = &n.ns[l]
|
||||
d.decode(v2)
|
||||
rvn = reflect.ValueOf(v2).Elem()
|
||||
n.ns = n.ns[:l]
|
||||
} else {
|
||||
rvn = reflect.New(d.h.MapType).Elem()
|
||||
@@ -601,9 +618,13 @@ func (f *decFnInfo) kInterfaceNaked() (rvn reflect.Value) {
|
||||
if d.stid == 0 || d.stid == intfSliceTypId {
|
||||
l := len(n.ss)
|
||||
n.ss = append(n.ss, nil)
|
||||
d.decode(&n.ss[l])
|
||||
rvn = reflect.ValueOf(&n.ss[l]).Elem()
|
||||
var v2 interface{} = &n.ss[l]
|
||||
d.decode(v2)
|
||||
n.ss = n.ss[:l]
|
||||
rvn = reflect.ValueOf(v2).Elem()
|
||||
if reflectArrayOfSupported && d.stid == 0 && d.h.PreferArrayOverSlice {
|
||||
rvn = reflectArrayOf(rvn)
|
||||
}
|
||||
} else {
|
||||
rvn = reflect.New(d.h.SliceType).Elem()
|
||||
d.decodeValue(rvn, nil)
|
||||
@@ -615,9 +636,9 @@ func (f *decFnInfo) kInterfaceNaked() (rvn reflect.Value) {
|
||||
l := len(n.is)
|
||||
n.is = append(n.is, nil)
|
||||
v2 := &n.is[l]
|
||||
n.is = n.is[:l]
|
||||
d.decode(v2)
|
||||
v = *v2
|
||||
n.is = n.is[:l]
|
||||
}
|
||||
bfn := d.h.getExtForTag(tag)
|
||||
if bfn == nil {
|
||||
@@ -1166,7 +1187,7 @@ type decRtidFn struct {
|
||||
// primitives are being decoded.
|
||||
//
|
||||
// maps and arrays are not handled by this mechanism.
|
||||
// However, RawExt is, and we accomodate for extensions that decode
|
||||
// However, RawExt is, and we accommodate for extensions that decode
|
||||
// RawExt from DecodeNaked, but need to decode the value subsequently.
|
||||
// kInterfaceNaked and swallow, which call DecodeNaked, handle this caveat.
|
||||
//
|
||||
@@ -1453,8 +1474,8 @@ func (d *Decoder) swallow() {
|
||||
l := len(n.is)
|
||||
n.is = append(n.is, nil)
|
||||
v2 := &n.is[l]
|
||||
n.is = n.is[:l]
|
||||
d.decode(v2)
|
||||
n.is = n.is[:l]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1504,6 +1525,8 @@ func (d *Decoder) decode(iv interface{}) {
|
||||
*v = 0
|
||||
case *[]uint8:
|
||||
*v = nil
|
||||
case *Raw:
|
||||
*v = nil
|
||||
case reflect.Value:
|
||||
if v.Kind() != reflect.Ptr || v.IsNil() {
|
||||
d.errNotValidPtrValue(v)
|
||||
@@ -1543,7 +1566,6 @@ func (d *Decoder) decode(iv interface{}) {
|
||||
d.decodeValueNotNil(v.Elem(), nil)
|
||||
|
||||
case *string:
|
||||
|
||||
*v = d.d.DecodeString()
|
||||
case *bool:
|
||||
*v = d.d.DecodeBool()
|
||||
@@ -1574,6 +1596,9 @@ func (d *Decoder) decode(iv interface{}) {
|
||||
case *[]uint8:
|
||||
*v = d.d.DecodeBytes(*v, false, false)
|
||||
|
||||
case *Raw:
|
||||
*v = d.raw()
|
||||
|
||||
case *interface{}:
|
||||
d.decodeValueNotNil(reflect.ValueOf(iv).Elem(), nil)
|
||||
|
||||
@@ -1695,6 +1720,8 @@ func (d *Decoder) getDecFn(rt reflect.Type, checkFastpath, checkCodecSelfer bool
|
||||
fn.f = (*decFnInfo).selferUnmarshal
|
||||
} else if rtid == rawExtTypId {
|
||||
fn.f = (*decFnInfo).rawExt
|
||||
} else if rtid == rawTypId {
|
||||
fn.f = (*decFnInfo).raw
|
||||
} else if d.d.IsBuiltinType(rtid) {
|
||||
fn.f = (*decFnInfo).builtin
|
||||
} else if xfFn := d.h.getExt(rtid); xfFn != nil {
|
||||
@@ -1793,12 +1820,13 @@ func (d *Decoder) getDecFn(rt reflect.Type, checkFastpath, checkCodecSelfer bool
|
||||
}
|
||||
|
||||
func (d *Decoder) structFieldNotFound(index int, rvkencname string) {
|
||||
// NOTE: rvkencname may be a stringView, so don't pass it to another function.
|
||||
if d.h.ErrorIfNoField {
|
||||
if index >= 0 {
|
||||
d.errorf("no matching struct field found when decoding stream array at index %v", index)
|
||||
return
|
||||
} else if rvkencname != "" {
|
||||
d.errorf("no matching struct field found when decoding stream map with key %s", rvkencname)
|
||||
d.errorf("no matching struct field found when decoding stream map with key " + rvkencname)
|
||||
return
|
||||
}
|
||||
}
|
||||
@@ -1862,6 +1890,7 @@ func (d *Decoder) intern(s string) {
|
||||
}
|
||||
}
|
||||
|
||||
// nextValueBytes returns the next value in the stream as a set of bytes.
|
||||
func (d *Decoder) nextValueBytes() []byte {
|
||||
d.d.uncacheRead()
|
||||
d.r.track()
|
||||
@@ -1869,6 +1898,15 @@ func (d *Decoder) nextValueBytes() []byte {
|
||||
return d.r.stopTrack()
|
||||
}
|
||||
|
||||
func (d *Decoder) raw() []byte {
|
||||
// ensure that this is not a view into the bytes
|
||||
// i.e. make new copy always.
|
||||
bs := d.nextValueBytes()
|
||||
bs2 := make([]byte, len(bs))
|
||||
copy(bs2, bs)
|
||||
return bs2
|
||||
}
|
||||
|
||||
// --------------------------------------------------
|
||||
|
||||
// decSliceHelper assists when decoding into a slice, from a map or an array in the stream.
|
||||
|
Reference in New Issue
Block a user