(ctx *ReadContext, fields []FieldInfo, start int, ptr unsafe.Pointer)
| 2466 | } |
| 2467 | |
| 2468 | func readExactFixedPrimitiveRun(ctx *ReadContext, fields []FieldInfo, start int, ptr unsafe.Pointer) int { |
| 2469 | end := start |
| 2470 | size := 0 |
| 2471 | for end < len(fields) { |
| 2472 | field := &fields[end] |
| 2473 | if !canReadFixedRun(field) { |
| 2474 | break |
| 2475 | } |
| 2476 | size += getFixedSizeByDispatchId(field.DispatchId) |
| 2477 | end++ |
| 2478 | } |
| 2479 | buf := ctx.Buffer() |
| 2480 | var errOut Error |
| 2481 | if !buf.CheckReadable(size, &errOut) { |
| 2482 | ctx.SetError(errOut) |
| 2483 | return end |
| 2484 | } |
| 2485 | baseOffset := buf.ReaderIndex() |
| 2486 | data := buf.GetData() |
| 2487 | bufOffset := baseOffset |
| 2488 | for i := start; i < end; i++ { |
| 2489 | field := &fields[i] |
| 2490 | fieldPtr := unsafe.Add(ptr, field.Offset) |
| 2491 | optInfo := optionalInfo{} |
| 2492 | if field.Kind == FieldKindOptional { |
| 2493 | optInfo = field.Meta.OptionalInfo |
| 2494 | } |
| 2495 | switch field.DispatchId { |
| 2496 | case PrimitiveBoolDispatchId: |
| 2497 | storeFieldValue(field.Kind, fieldPtr, optInfo, data[bufOffset] != 0) |
| 2498 | bufOffset++ |
| 2499 | case PrimitiveInt8DispatchId: |
| 2500 | storeFieldValue(field.Kind, fieldPtr, optInfo, int8(data[bufOffset])) |
| 2501 | bufOffset++ |
| 2502 | case PrimitiveUint8DispatchId: |
| 2503 | storeFieldValue(field.Kind, fieldPtr, optInfo, data[bufOffset]) |
| 2504 | bufOffset++ |
| 2505 | case PrimitiveInt16DispatchId: |
| 2506 | var v int16 |
| 2507 | if isLittleEndian { |
| 2508 | v = *(*int16)(unsafe.Pointer(&data[bufOffset])) |
| 2509 | } else { |
| 2510 | v = int16(binary.LittleEndian.Uint16(data[bufOffset:])) |
| 2511 | } |
| 2512 | storeFieldValue(field.Kind, fieldPtr, optInfo, v) |
| 2513 | bufOffset += 2 |
| 2514 | case PrimitiveUint16DispatchId: |
| 2515 | var v uint16 |
| 2516 | if isLittleEndian { |
| 2517 | v = *(*uint16)(unsafe.Pointer(&data[bufOffset])) |
| 2518 | } else { |
| 2519 | v = binary.LittleEndian.Uint16(data[bufOffset:]) |
| 2520 | } |
| 2521 | storeFieldValue(field.Kind, fieldPtr, optInfo, v) |
| 2522 | bufOffset += 2 |
| 2523 | case PrimitiveInt32DispatchId: |
| 2524 | var v int32 |
| 2525 | if isLittleEndian { |
no test coverage detected