reflect: implement Set(nil), SetValue(nil) for PtrValue and MapValue

R=r
CC=golang-dev
https://golang.org/cl/823048
diff --git a/src/pkg/reflect/all_test.go b/src/pkg/reflect/all_test.go
index 67bfe9e..552b09d 100644
--- a/src/pkg/reflect/all_test.go
+++ b/src/pkg/reflect/all_test.go
@@ -350,6 +350,26 @@
 	}
 }
 
+func TestPtrSetNil(t *testing.T) {
+	var i int32 = 1234
+	ip := &i
+	vip := NewValue(&ip)
+	vip.(*PtrValue).Elem().(*PtrValue).Set(nil)
+	if ip != nil {
+		t.Errorf("got non-nil (%d), want nil", *ip)
+	}
+}
+
+func TestMapSetNil(t *testing.T) {
+	m := make(map[string]int)
+	vm := NewValue(&m)
+	vm.(*PtrValue).Elem().(*MapValue).Set(nil)
+	if m != nil {
+		t.Errorf("got non-nil (%p), want nil", m)
+	}
+}
+
+
 func TestAll(t *testing.T) {
 	testType(t, 1, Typeof((int8)(0)), "int8")
 	testType(t, 2, Typeof((*int8)(nil)).(*PtrType).Elem(), "int8")
@@ -838,6 +858,12 @@
 	if ok {
 		t.Errorf("newm[\"a\"] = %d after delete", v)
 	}
+
+	mv = NewValue(&m).(*PtrValue).Elem().(*MapValue)
+	mv.Set(nil)
+	if m != nil {
+		t.Errorf("mv.Set(nil) failed")
+	}
 }
 
 func TestChan(t *testing.T) {