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)
| 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. |
| 2779 | func 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 |
no test coverage detected