From 91d6ca057cf3dda948ca4947c4bee17453d007fb Mon Sep 17 00:00:00 2001 From: Damian Gryski Date: Tue, 14 Mar 2023 17:37:05 -0700 Subject: [PATCH] reflect: add SetBytes() --- src/reflect/value.go | 8 +++++++- src/reflect/value_test.go | 14 ++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/reflect/value.go b/src/reflect/value.go index 84d308f7..cc5f0913 100644 --- a/src/reflect/value.go +++ b/src/reflect/value.go @@ -982,7 +982,13 @@ func (v Value) SetString(x string) { } func (v Value) SetBytes(x []byte) { - panic("unimplemented: (reflect.Value).SetBytes()") + v.checkAddressable() + if v.typecode.Kind() != Slice || v.typecode.elem().Kind() != Uint8 { + panic("reflect.Value.SetBytes called on not []byte") + } + + // copy the header contents over + *(*sliceHeader)(v.value) = *(*sliceHeader)(unsafe.Pointer(&x)) } func (v Value) SetCap(n int) { diff --git a/src/reflect/value_test.go b/src/reflect/value_test.go index 692c9a57..ef1ee96a 100644 --- a/src/reflect/value_test.go +++ b/src/reflect/value_test.go @@ -321,6 +321,20 @@ func TestNilType(t *testing.T) { } } +func TestSetBytes(t *testing.T) { + var b []byte + refb := ValueOf(&b).Elem() + s := []byte("hello") + refb.SetBytes(s) + s[0] = 'b' + + refbSlice := refb.Interface().([]byte) + + if len(refbSlice) != len(s) || b[0] != s[0] || refbSlice[0] != s[0] { + t.Errorf("SetBytes(): reflection slice mismatch") + } +} + func equal[T comparable](a, b []T) bool { if len(a) != len(b) { return false