rlp: fix pointer reuse

This commit is contained in:
Felix Lange 2014-11-17 12:02:08 +01:00
parent 74266d5bbd
commit bd0a50fdc3
2 changed files with 10 additions and 2 deletions

View File

@ -309,6 +309,7 @@ func makePtrDecoder(typ reflect.Type) (decoder, error) {
dec := func(s *Stream, val reflect.Value) (err error) { dec := func(s *Stream, val reflect.Value) (err error) {
_, size, err := s.Kind() _, size, err := s.Kind()
if err != nil || size == 0 && s.byteval == 0 { if err != nil || size == 0 && s.byteval == 0 {
val.Set(reflect.Zero(typ)) // set to nil
return err return err
} }
newval := val newval := val

View File

@ -176,8 +176,6 @@ type recstruct struct {
Child *recstruct Child *recstruct
} }
var sharedByteArray [5]byte
var ( var (
veryBigInt = big.NewInt(0).Add( veryBigInt = big.NewInt(0).Add(
big.NewInt(0).Lsh(big.NewInt(0xFFFFFFFFFFFFFF), 16), big.NewInt(0).Lsh(big.NewInt(0xFFFFFFFFFFFFFF), 16),
@ -185,6 +183,11 @@ var (
) )
) )
var (
sharedByteArray [5]byte
sharedPtr = new(*int)
)
var decodeTests = []decodeTest{ var decodeTests = []decodeTest{
// integers // integers
{input: "05", ptr: new(uint32), value: uint32(5)}, {input: "05", ptr: new(uint32), value: uint32(5)},
@ -268,6 +271,10 @@ var decodeTests = []decodeTest{
{input: "C109", ptr: new(*[]int), value: &[]int{9}}, {input: "C109", ptr: new(*[]int), value: &[]int{9}},
{input: "C58403030303", ptr: new(*[][]byte), value: &[][]byte{{3, 3, 3, 3}}}, {input: "C58403030303", ptr: new(*[][]byte), value: &[][]byte{{3, 3, 3, 3}}},
// pointer should be reset to nil
{input: "05", ptr: sharedPtr, value: intp(5)},
{input: "80", ptr: sharedPtr, value: (*int)(nil)},
// interface{} // interface{}
{input: "00", ptr: new(interface{}), value: []byte{0}}, {input: "00", ptr: new(interface{}), value: []byte{0}},
{input: "01", ptr: new(interface{}), value: []byte{1}}, {input: "01", ptr: new(interface{}), value: []byte{1}},