rlp: remove allocation of bytes.Reader in DecodeBytes (#27987)

This commit is contained in:
Felix Lange 2023-08-23 20:31:05 +02:00 committed by GitHub
parent 52219ced8b
commit 5c7136adb4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -90,7 +90,7 @@ func Decode(r io.Reader, val interface{}) error {
// DecodeBytes parses RLP data from b into val. Please see package-level documentation for
// the decoding rules. The input must contain exactly one value and no trailing data.
func DecodeBytes(b []byte, val interface{}) error {
r := bytes.NewReader(b)
r := (*sliceReader)(&b)
stream := streamPool.Get().(*Stream)
defer streamPool.Put(stream)
@ -99,7 +99,7 @@ func DecodeBytes(b []byte, val interface{}) error {
if err := stream.Decode(val); err != nil {
return err
}
if r.Len() > 0 {
if len(b) > 0 {
return ErrMoreThanOneValue
}
return nil
@ -1182,3 +1182,23 @@ func (s *Stream) listLimit() (inList bool, limit uint64) {
}
return true, s.stack[len(s.stack)-1]
}
type sliceReader []byte
func (sr *sliceReader) Read(b []byte) (int, error) {
if len(*sr) == 0 {
return 0, io.EOF
}
n := copy(b, *sr)
*sr = (*sr)[n:]
return n, nil
}
func (sr *sliceReader) ReadByte() (byte, error) {
if len(*sr) == 0 {
return 0, io.EOF
}
b := (*sr)[0]
*sr = (*sr)[1:]
return b, nil
}