|
|
|
@ -26,6 +26,7 @@ import ( |
|
|
|
|
"math/big" |
|
|
|
|
"reflect" |
|
|
|
|
"strings" |
|
|
|
|
"sync" |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
var ( |
|
|
|
@ -48,6 +49,10 @@ var ( |
|
|
|
|
errUintOverflow = errors.New("rlp: uint overflow") |
|
|
|
|
errNoPointer = errors.New("rlp: interface given to Decode must be a pointer") |
|
|
|
|
errDecodeIntoNil = errors.New("rlp: pointer given to Decode must not be nil") |
|
|
|
|
|
|
|
|
|
streamPool = sync.Pool{ |
|
|
|
|
New: func() interface{} { return new(Stream) }, |
|
|
|
|
} |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
// Decoder is implemented by types that require custom RLP
|
|
|
|
@ -126,17 +131,24 @@ type Decoder interface { |
|
|
|
|
//
|
|
|
|
|
// NewStream(r, limit).Decode(val)
|
|
|
|
|
func Decode(r io.Reader, val interface{}) error { |
|
|
|
|
// TODO: this could use a Stream from a pool.
|
|
|
|
|
return NewStream(r, 0).Decode(val) |
|
|
|
|
stream := streamPool.Get().(*Stream) |
|
|
|
|
defer streamPool.Put(stream) |
|
|
|
|
|
|
|
|
|
stream.Reset(r, 0) |
|
|
|
|
return stream.Decode(val) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// DecodeBytes parses RLP data from b into val.
|
|
|
|
|
// Please see the documentation of Decode for the decoding rules.
|
|
|
|
|
// The input must contain exactly one value and no trailing data.
|
|
|
|
|
func DecodeBytes(b []byte, val interface{}) error { |
|
|
|
|
// TODO: this could use a Stream from a pool.
|
|
|
|
|
r := bytes.NewReader(b) |
|
|
|
|
if err := NewStream(r, uint64(len(b))).Decode(val); err != nil { |
|
|
|
|
|
|
|
|
|
stream := streamPool.Get().(*Stream) |
|
|
|
|
defer streamPool.Put(stream) |
|
|
|
|
|
|
|
|
|
stream.Reset(r, uint64(len(b))) |
|
|
|
|
if err := stream.Decode(val); err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
if r.Len() > 0 { |
|
|
|
@ -853,6 +865,7 @@ func (s *Stream) Reset(r io.Reader, inputLimit uint64) { |
|
|
|
|
if s.uintbuf == nil { |
|
|
|
|
s.uintbuf = make([]byte, 8) |
|
|
|
|
} |
|
|
|
|
s.byteval = 0 |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Kind returns the kind and size of the next value in the
|
|
|
|
|