From: Robert Griesemer Date: Tue, 17 Aug 2010 22:12:28 +0000 (-0700) Subject: reflect: allow PtrValue.PointTo(nil) X-Git-Tag: weekly.2010-08-25~41 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=a48b35e9617c6f40156c1ad02a3cf99063fd742f;p=gostls13.git reflect: allow PtrValue.PointTo(nil) (Argument: For any *PtrValue p, it should always be possible to do: p.PointTo(p.Elem()), even if p.Elem() is nil.) Fixes #1028. R=rsc CC=golang-dev, r https://golang.org/cl/1938044 --- diff --git a/src/pkg/reflect/all_test.go b/src/pkg/reflect/all_test.go index 16b5ef6e96..dc01890945 100644 --- a/src/pkg/reflect/all_test.go +++ b/src/pkg/reflect/all_test.go @@ -384,6 +384,13 @@ func TestPtrPointTo(t *testing.T) { if *ip != 1234 { t.Errorf("got %d, want 1234", *ip) } + + ip = nil + vp := NewValue(ip).(*PtrValue) + vp.PointTo(vp.Elem()) + if ip != nil { + t.Errorf("got non-nil (%p), want nil", ip) + } } func TestPtrSetNil(t *testing.T) { diff --git a/src/pkg/reflect/value.go b/src/pkg/reflect/value.go index 56a5d69d86..dd677b4ea8 100644 --- a/src/pkg/reflect/value.go +++ b/src/pkg/reflect/value.go @@ -1058,7 +1058,12 @@ func (v *PtrValue) SetValue(x Value) { } // PointTo changes v to point to x. +// If x is a nil Value, PointTo sets v to nil. func (v *PtrValue) PointTo(x Value) { + if x == nil { + *(**uintptr)(v.addr) = nil + return + } if !x.CanSet() { panic("cannot set x; cannot point to x") }