|
@@ -91,10 +91,12 @@ type decDriver interface {
|
|
|
uncacheRead()
|
|
uncacheRead()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-type decNoSeparator struct{}
|
|
|
|
|
|
|
+type decNoSeparator struct {
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func (_ decNoSeparator) ReadEnd() {}
|
|
|
|
|
|
|
|
-func (_ decNoSeparator) ReadEnd() {}
|
|
|
|
|
-func (_ decNoSeparator) uncacheRead() {}
|
|
|
|
|
|
|
+// func (_ decNoSeparator) uncacheRead() {}
|
|
|
|
|
|
|
|
type DecodeOptions struct {
|
|
type DecodeOptions struct {
|
|
|
// MapType specifies type to use during schema-less decoding of a map in the stream.
|
|
// MapType specifies type to use during schema-less decoding of a map in the stream.
|
|
@@ -433,6 +435,10 @@ func (f *decFnInfo) rawExt(rv reflect.Value) {
|
|
|
f.d.d.DecodeExt(rv.Addr().Interface(), 0, nil)
|
|
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) {
|
|
func (f *decFnInfo) ext(rv reflect.Value) {
|
|
|
f.d.d.DecodeExt(rv.Addr().Interface(), f.xfTag, f.xfFn)
|
|
f.d.d.DecodeExt(rv.Addr().Interface(), f.xfTag, f.xfFn)
|
|
|
}
|
|
}
|
|
@@ -1507,6 +1513,8 @@ func (d *Decoder) decode(iv interface{}) {
|
|
|
*v = 0
|
|
*v = 0
|
|
|
case *[]uint8:
|
|
case *[]uint8:
|
|
|
*v = nil
|
|
*v = nil
|
|
|
|
|
+ case *Raw:
|
|
|
|
|
+ *v = nil
|
|
|
case reflect.Value:
|
|
case reflect.Value:
|
|
|
if v.Kind() != reflect.Ptr || v.IsNil() {
|
|
if v.Kind() != reflect.Ptr || v.IsNil() {
|
|
|
d.errNotValidPtrValue(v)
|
|
d.errNotValidPtrValue(v)
|
|
@@ -1576,6 +1584,9 @@ func (d *Decoder) decode(iv interface{}) {
|
|
|
case *[]uint8:
|
|
case *[]uint8:
|
|
|
*v = d.d.DecodeBytes(*v, false, false)
|
|
*v = d.d.DecodeBytes(*v, false, false)
|
|
|
|
|
|
|
|
|
|
+ case *Raw:
|
|
|
|
|
+ *v = d.raw()
|
|
|
|
|
+
|
|
|
case *interface{}:
|
|
case *interface{}:
|
|
|
d.decodeValueNotNil(reflect.ValueOf(iv).Elem(), nil)
|
|
d.decodeValueNotNil(reflect.ValueOf(iv).Elem(), nil)
|
|
|
|
|
|
|
@@ -1697,6 +1708,8 @@ func (d *Decoder) getDecFn(rt reflect.Type, checkFastpath, checkCodecSelfer bool
|
|
|
fn.f = (*decFnInfo).selferUnmarshal
|
|
fn.f = (*decFnInfo).selferUnmarshal
|
|
|
} else if rtid == rawExtTypId {
|
|
} else if rtid == rawExtTypId {
|
|
|
fn.f = (*decFnInfo).rawExt
|
|
fn.f = (*decFnInfo).rawExt
|
|
|
|
|
+ } else if rtid == rawTypId {
|
|
|
|
|
+ fn.f = (*decFnInfo).raw
|
|
|
} else if d.d.IsBuiltinType(rtid) {
|
|
} else if d.d.IsBuiltinType(rtid) {
|
|
|
fn.f = (*decFnInfo).builtin
|
|
fn.f = (*decFnInfo).builtin
|
|
|
} else if xfFn := d.h.getExt(rtid); xfFn != nil {
|
|
} else if xfFn := d.h.getExt(rtid); xfFn != nil {
|
|
@@ -1873,6 +1886,15 @@ func (d *Decoder) nextValueBytes() []byte {
|
|
|
return d.r.stopTrack()
|
|
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.
|
|
// decSliceHelper assists when decoding into a slice, from a map or an array in the stream.
|