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

Function readExactVarintPrimitiveRun

go/fory/struct.go:2596–2676  ·  view source on GitHub ↗
(ctx *ReadContext, fields []FieldInfo, start int, ptr unsafe.Pointer)

Source from the content-addressed store, hash-verified

2594}
2595
2596func readExactVarintPrimitiveRun(ctx *ReadContext, fields []FieldInfo, start int, ptr unsafe.Pointer) int {
2597 end := start
2598 maxSize := 0
2599 plainVarint32Values := true
2600 for end < len(fields) {
2601 field := &fields[end]
2602 if !canReadVarintRun(field) {
2603 break
2604 }
2605 maxSize += getVarintMaxSizeByDispatchId(field.DispatchId)
2606 if field.DispatchId != PrimitiveVarint32DispatchId || field.Kind != FieldKindValue {
2607 plainVarint32Values = false
2608 }
2609 end++
2610 }
2611 buf := ctx.Buffer()
2612 err := ctx.Err()
2613 useUnsafe := buf.remaining() >= maxSize+8
2614 if plainVarint32Values {
2615 for i := start; i < end; i++ {
2616 field := &fields[i]
2617 if useUnsafe {
2618 *(*int32)(unsafe.Add(ptr, field.Offset)) = buf.UnsafeReadVarint32(err)
2619 } else {
2620 *(*int32)(unsafe.Add(ptr, field.Offset)) = buf.ReadVarint32(err)
2621 }
2622 }
2623 return end
2624 }
2625 for i := start; i < end; i++ {
2626 field := &fields[i]
2627 fieldPtr := unsafe.Add(ptr, field.Offset)
2628 optInfo := optionalInfo{}
2629 if field.Kind == FieldKindOptional {
2630 optInfo = field.Meta.OptionalInfo
2631 }
2632 switch field.DispatchId {
2633 case PrimitiveVarint32DispatchId:
2634 if useUnsafe {
2635 storeFieldValue(field.Kind, fieldPtr, optInfo, buf.UnsafeReadVarint32(err))
2636 } else {
2637 storeFieldValue(field.Kind, fieldPtr, optInfo, buf.ReadVarint32(err))
2638 }
2639 case PrimitiveVarint64DispatchId:
2640 if useUnsafe {
2641 storeFieldValue(field.Kind, fieldPtr, optInfo, buf.UnsafeReadVarint64())
2642 } else {
2643 storeFieldValue(field.Kind, fieldPtr, optInfo, buf.ReadVarint64(err))
2644 }
2645 case PrimitiveVarUint32DispatchId:
2646 if useUnsafe {
2647 storeFieldValue(field.Kind, fieldPtr, optInfo, buf.UnsafeReadVarUint32(err))
2648 } else {
2649 storeFieldValue(field.Kind, fieldPtr, optInfo, buf.ReadVarUint32(err))
2650 }
2651 case PrimitiveVarUint64DispatchId:
2652 if useUnsafe {
2653 storeFieldValue(field.Kind, fieldPtr, optInfo, buf.UnsafeReadVarUint64())

Callers 1

readFieldsInOrderMethod · 0.85

Calls 15

canReadVarintRunFunction · 0.85
storeFieldValueFunction · 0.85
UnsafeReadVarint32Method · 0.80
UnsafeReadVarint64Method · 0.80
UnsafeReadVarUint32Method · 0.80
UnsafeReadVarUint64Method · 0.80
ReadVarUint64Method · 0.80
ReadTaggedUint64Method · 0.80
BufferMethod · 0.45
ErrMethod · 0.45
remainingMethod · 0.45

Tested by

no test coverage detected