reflect: fix off-by-one in Zero sizing

Without this, pointers wouldn't be set to nil.  Add some tests.
Этот коммит содержится в:
Damian Gryski 2023-03-06 13:14:33 -08:00 коммит произвёл Damian Gryski
родитель e0aee1f23c
коммит 069c397975
2 изменённых файлов: 23 добавлений и 1 удалений

Просмотреть файл

@ -1083,7 +1083,7 @@ func init() {
} }
func Zero(typ Type) Value { func Zero(typ Type) Value {
if typ.Size() < unsafe.Sizeof(uintptr(0)) { if typ.Size() <= unsafe.Sizeof(uintptr(0)) {
return Value{ return Value{
typecode: typ.(*rawType), typecode: typ.(*rawType),
value: nil, value: nil,

Просмотреть файл

@ -266,6 +266,28 @@ func TestNamedTypes(t *testing.T) {
} }
} }
func TestZero(t *testing.T) {
s := "hello, world"
var sptr *string = &s
v := ValueOf(&sptr).Elem()
v.Set(Zero(v.Type()))
sptr = v.Interface().(*string)
if sptr != nil {
t.Errorf("failed to set a nil string pointer")
}
sl := []int{1, 2, 3}
v = ValueOf(&sl).Elem()
v.Set(Zero(v.Type()))
sl = v.Interface().([]int)
if sl != nil {
t.Errorf("failed to set a nil slice")
}
}
func addrDecode(body interface{}) { func addrDecode(body interface{}) {
vbody := ValueOf(body) vbody := ValueOf(body)
ptr := vbody.Elem() ptr := vbody.Elem()