|
|
|
@ -438,8 +438,6 @@ namespace Google.Protobuf |
|
|
|
|
throw InvalidProtocolBufferException.NegativeSize(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ValidateCurrentLimit(ref buffer, ref state, size); |
|
|
|
|
|
|
|
|
|
if (size <= state.bufferSize - state.bufferPos) |
|
|
|
|
{ |
|
|
|
|
// We have all the bytes we need already. |
|
|
|
@ -448,7 +446,16 @@ namespace Google.Protobuf |
|
|
|
|
state.bufferPos += size; |
|
|
|
|
return bytes; |
|
|
|
|
} |
|
|
|
|
else if (IsDataAvailableInSource(ref state, size)) |
|
|
|
|
|
|
|
|
|
return ReadRawBytesSlow(ref buffer, ref state, size); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private static byte[] ReadRawBytesSlow(ref ReadOnlySpan<byte> buffer, ref ParserInternalState state, int size) |
|
|
|
|
{ |
|
|
|
|
ValidateCurrentLimit(ref buffer, ref state, size); |
|
|
|
|
|
|
|
|
|
if ((!state.segmentedBufferHelper.TotalLength.HasValue && size < buffer.Length) || |
|
|
|
|
IsDataAvailableInSource(ref state, size)) |
|
|
|
|
{ |
|
|
|
|
// Reading more bytes than are in the buffer, but not an excessive number |
|
|
|
|
// of bytes. We can safely allocate the resulting array ahead of time. |
|
|
|
@ -490,7 +497,7 @@ namespace Google.Protobuf |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// OK, got everything. Now concatenate it all into one buffer. |
|
|
|
|
byte[] bytes = new byte[size]; |
|
|
|
|
byte[] bytes = new byte[size]; |
|
|
|
|
int newPos = 0; |
|
|
|
|
foreach (byte[] chunk in chunks) |
|
|
|
|
{ |
|
|
|
|