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

Method readChunk

go/fory/map.go:476–569  ·  view source on GitHub ↗

readChunk reads a chunk of entries, returns remaining size

(ctx *ReadContext, mapVal reflect.Value, header uint8, size int, keyType, valueType reflect.Type, resolver *TypeResolver)

Source from the content-addressed store, hash-verified

474
475// readChunk reads a chunk of entries, returns remaining size
476func (s mapSerializer) readChunk(ctx *ReadContext, mapVal reflect.Value, header uint8, size int, keyType, valueType reflect.Type, resolver *TypeResolver) int {
477 buf := ctx.Buffer()
478 ctxErr := ctx.Err()
479
480 // IMPORTANT: map readers must follow the key/value ref bits written on the
481 // wire, even when local field metadata would choose a different ref policy.
482 // Shared xlang tests depend on reading remote-written ref metadata first and
483 // only then writing a new local payload. DO NOT REMOVE this comment.
484 trackKeyRef := (header & TRACKING_KEY_REF) != 0
485 trackValRef := (header & TRACKING_VALUE_REF) != 0
486 keyDeclType := (header & KEY_DECL_TYPE) != 0
487 valDeclType := (header & VALUE_DECL_TYPE) != 0
488 declaredKeyType := keyType
489 declaredValueType := valueType
490
491 chunkSize := int(buf.ReadUint8(ctxErr))
492 if ctx.HasError() {
493 return 0
494 }
495 if chunkSize == 0 || chunkSize > size {
496 ctx.SetError(DeserializationErrorf("invalid map chunk size %d for remaining length %d", chunkSize, size))
497 return 0
498 }
499
500 // Read type info if not declared
501 var keyTypeInfo, valueTypeInfo *TypeInfo
502 var keySer, valSer Serializer
503
504 if !keyDeclType {
505 keyTypeInfo = resolver.ReadTypeInfo(buf, ctxErr)
506 if ctxErr.HasError() {
507 return 0
508 }
509 keySer = keyTypeInfo.Serializer
510 keyType = keyTypeInfo.Type
511 keyType, keySer = wrapMapSerializerIfNeeded(declaredKeyType, keyType, keySer)
512 } else {
513 keySer = s.keySerializer
514 if keySer == nil {
515 keySer, _ = resolver.getSerializerByType(keyType, false)
516 }
517 }
518
519 if !valDeclType {
520 valueTypeInfo = resolver.ReadTypeInfo(buf, ctxErr)
521 if ctxErr.HasError() {
522 return 0
523 }
524 valSer = valueTypeInfo.Serializer
525 valueType = valueTypeInfo.Type
526 valueType, valSer = wrapMapSerializerIfNeeded(declaredValueType, valueType, valSer)
527 } else {
528 valSer = s.valueSerializer
529 if valSer == nil {
530 valSer, _ = resolver.getSerializerByType(valueType, false)
531 }
532 }
533

Callers 1

ReadDataMethod · 0.95

Calls 13

ReadWithTypeInfoMethod · 0.95
ReadMethod · 0.95
DeserializationErrorfFunction · 0.85
setMapValueFunction · 0.85
unwrapInterfaceFunction · 0.85
ReadUint8Method · 0.80
getSerializerByTypeMethod · 0.80
BufferMethod · 0.45
ErrMethod · 0.45
HasErrorMethod · 0.45
SetErrorMethod · 0.45

Tested by

no test coverage detected