(ctx *ReadContext, fields []FieldInfo, start int, ptr unsafe.Pointer)
| 2594 | } |
| 2595 | |
| 2596 | func 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()) |
no test coverage detected