MCPcopy Create free account
hub / github.com/apache/fory / readEnumFieldUnsafe

Function readEnumFieldUnsafe

go/fory/struct.go:2779–2813  ·  view source on GitHub ↗

readEnumFieldUnsafe reads an enum field respecting the field's RefMode. RefMode determines whether null flag is read, regardless of whether the local type is a pointer. This is important for compatible mode where remote TypeDef's nullable flag controls the wire format. Uses context error state for d

(ctx *ReadContext, field *FieldInfo, fieldPtr unsafe.Pointer)

Source from the content-addressed store, hash-verified

2777// This is important for compatible mode where remote TypeDef's nullable flag controls the wire format.
2778// Uses context error state for deferred error checking.
2779func readEnumFieldUnsafe(ctx *ReadContext, field *FieldInfo, fieldPtr unsafe.Pointer) {
2780 buf := ctx.Buffer()
2781 isPointer := field.Kind == FieldKindPointer
2782
2783 // Read null flag based on RefMode only (not based on whether local type is pointer)
2784 if field.RefMode != RefModeNone {
2785 nullFlag := buf.ReadInt8(ctx.Err())
2786 if nullFlag == NullFlag {
2787 if isPointer {
2788 *(*unsafe.Pointer)(fieldPtr) = nil
2789 } else {
2790 setEnumValue(ctx, fieldPtr, field.Meta.Type.Kind(), 0)
2791 }
2792 return
2793 }
2794 }
2795
2796 ordinal := buf.ReadVarUint32Small7(ctx.Err())
2797 if ctx.HasError() {
2798 return
2799 }
2800
2801 if isPointer {
2802 elemType := field.Meta.Type.Elem()
2803 newVal := reflect.New(elemType)
2804 elemPtr := unsafe.Pointer(newVal.Pointer())
2805 if !setEnumValue(ctx, elemPtr, elemType.Kind(), ordinal) {
2806 return
2807 }
2808 *(*unsafe.Pointer)(fieldPtr) = elemPtr
2809 return
2810 }
2811
2812 setEnumValue(ctx, fieldPtr, field.Meta.Type.Kind(), ordinal)
2813}
2814
2815// skipStructSerializer is a serializer that skips unknown struct data
2816// It reads and discards field data based on fieldDefs from remote TypeDef

Callers 2

readRemainingFieldMethod · 0.85
readFieldsInOrderMethod · 0.85

Calls 7

setEnumValueFunction · 0.85
KindMethod · 0.80
ReadVarUint32Small7Method · 0.80
BufferMethod · 0.45
ReadInt8Method · 0.45
ErrMethod · 0.45
HasErrorMethod · 0.45

Tested by

no test coverage detected