MCPcopy
hub / github.com/uptrace/uptrace / decodeStruct

Method decodeStruct

pkg/msgp/decoder.go:315–354  ·  view source on GitHub ↗
(b []byte, p unsafe.Pointer, st *structType)

Source from the content-addressed store, hash-verified

313 return b, nil
314}
315func (d decoder) decodeStruct(b []byte, p unsafe.Pointer, st *structType) ([]byte, error) {
316 n, isMap, b, err := parseStructLen(b)
317 if err != nil {
318 return b, err
319 }
320 if n == -1 {
321 return b, nil
322 }
323 if !isMap {
324 if n != len(st.fields) {
325 return b, fmt.Errorf("msgp: got %d fields decoding struct, wanted %d", n, len(st.fields))
326 }
327 for i := range st.fields {
328 f := &st.fields[i]
329 if b, err = f.codec.decode(d, b, unsafe.Pointer(uintptr(p)+f.offset)); err != nil {
330 return b, err
331 }
332 }
333 return b, nil
334 }
335 for i := 0; i < n; i++ {
336 var field *structField
337 field, b, err = d.decodeStructField(b, st)
338 if err != nil {
339 return b, err
340 }
341 if field == nil {
342 b, err = Skip(b)
343 if err != nil {
344 return b, err
345 }
346 continue
347 }
348 b, err = field.codec.decode(d, b, unsafe.Pointer(uintptr(p)+field.offset))
349 if err != nil {
350 return b, fmt.Errorf("msgp: decoding %q failed: %w", field.name, err)
351 }
352 }
353 return b, nil
354}
355func (d decoder) decodeStructField(b []byte, st *structType) (*structField, []byte, error) {
356 if fieldID, b, err := d.decodeStructFieldID(b); err == nil {
357 field := st.fieldByID(fieldID)

Callers 1

createStructDecodeFuncFunction · 0.80

Calls 4

decodeStructFieldMethod · 0.95
parseStructLenFunction · 0.85
SkipFunction · 0.85
PointerMethod · 0.80

Tested by

no test coverage detected