dumpSlice handles formatting of arrays and slices. Byte (uint8 under reflection) arrays and slices are dumped in hexdump -C fashion.
(v reflect.Value)
| 159 | // dumpSlice handles formatting of arrays and slices. Byte (uint8 under |
| 160 | // reflection) arrays and slices are dumped in hexdump -C fashion. |
| 161 | func (d *dumpState) dumpSlice(v reflect.Value) { |
| 162 | // Determine whether this type should be hex dumped or not. Also, |
| 163 | // for types which should be hexdumped, try to use the underlying data |
| 164 | // first, then fall back to trying to convert them to a uint8 slice. |
| 165 | var buf []uint8 |
| 166 | doConvert := false |
| 167 | doHexDump := false |
| 168 | numEntries := v.Len() |
| 169 | if numEntries > 0 { |
| 170 | vt := v.Index(0).Type() |
| 171 | vts := vt.String() |
| 172 | switch { |
| 173 | // C types that need to be converted. |
| 174 | case cCharRE.MatchString(vts): |
| 175 | fallthrough |
| 176 | case cUnsignedCharRE.MatchString(vts): |
| 177 | fallthrough |
| 178 | case cUint8tCharRE.MatchString(vts): |
| 179 | doConvert = true |
| 180 | |
| 181 | // Try to use existing uint8 slices and fall back to converting |
| 182 | // and copying if that fails. |
| 183 | case vt.Kind() == reflect.Uint8: |
| 184 | // We need an addressable interface to convert the type |
| 185 | // to a byte slice. However, the reflect package won't |
| 186 | // give us an interface on certain things like |
| 187 | // unexported struct fields in order to enforce |
| 188 | // visibility rules. We use unsafe, when available, to |
| 189 | // bypass these restrictions since this package does not |
| 190 | // mutate the values. |
| 191 | vs := v |
| 192 | if !vs.CanInterface() || !vs.CanAddr() { |
| 193 | vs = unsafeReflectValue(vs) |
| 194 | } |
| 195 | if !UnsafeDisabled { |
| 196 | vs = vs.Slice(0, numEntries) |
| 197 | |
| 198 | // Use the existing uint8 slice if it can be |
| 199 | // type asserted. |
| 200 | iface := vs.Interface() |
| 201 | if slice, ok := iface.([]uint8); ok { |
| 202 | buf = slice |
| 203 | doHexDump = true |
| 204 | break |
| 205 | } |
| 206 | } |
| 207 | |
| 208 | // The underlying data needs to be converted if it can't |
| 209 | // be type asserted to a uint8 slice. |
| 210 | doConvert = true |
| 211 | } |
| 212 | |
| 213 | // Copy and convert the underlying type if needed. |
| 214 | if doConvert && vt.ConvertibleTo(uint8Type) { |
| 215 | // Convert and copy each element into a uint8 byte |
| 216 | // slice. |
| 217 | buf = make([]uint8, numEntries) |
| 218 | for i := 0; i < numEntries; i++ { |
no test coverage detected