readChunk reads a chunk of entries, returns remaining size
(ctx *ReadContext, mapVal reflect.Value, header uint8, size int, keyType, valueType reflect.Type, resolver *TypeResolver)
| 474 | |
| 475 | // readChunk reads a chunk of entries, returns remaining size |
| 476 | func (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 |
no test coverage detected