From a48b35e9617c6f40156c1ad02a3cf99063fd742f Mon Sep 17 00:00:00 2001 From: Robert Griesemer Date: Tue, 17 Aug 2010 15:12:28 -0700 Subject: [PATCH] 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 --- src/pkg/reflect/all_test.go | 7 +++++++ src/pkg/reflect/value.go | 5 +++++ 2 files changed, 12 insertions(+) diff --git a/src/pkg/reflect/all_test.go b/src/pkg/reflect/all_test.go index 16b5ef6e96e..dc01890945c 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 56a5d69d867..dd677b4ea81 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") }