private bool RefillFromReadOnlySequence(ref ReadOnlySpan <byte> buffer, ref ParserInternalState state, bool mustSucceed) { CheckCurrentBufferIsEmpty(ref state); if (state.totalBytesRetired + state.bufferSize == state.currentLimit) { // Oops, we hit a limit. if (mustSucceed) { throw InvalidProtocolBufferException.TruncatedMessage(); } else { return(false); } } state.totalBytesRetired += state.bufferSize; state.bufferPos = 0; state.bufferSize = 0; while (readOnlySequenceEnumerator.MoveNext()) { buffer = readOnlySequenceEnumerator.Current.Span; state.bufferSize = buffer.Length; if (buffer.Length != 0) { break; } } if (state.bufferSize == 0) { if (mustSucceed) { throw InvalidProtocolBufferException.TruncatedMessage(); } else { return(false); } } else { RecomputeBufferSizeAfterLimit(ref state); int totalBytesRead = state.totalBytesRetired + state.bufferSize + state.bufferSizeAfterLimit; if (totalBytesRead < 0 || totalBytesRead > state.sizeLimit) { throw InvalidProtocolBufferException.SizeLimitExceeded(); } return(true); } }
private bool RefillFromCodedInputStream(ref ReadOnlySpan <byte> buffer, ref ParserInternalState state, bool mustSucceed) { CheckCurrentBufferIsEmpty(ref state); if (state.totalBytesRetired + state.bufferSize == state.currentLimit) { // Oops, we hit a limit. if (mustSucceed) { throw InvalidProtocolBufferException.TruncatedMessage(); } else { return(false); } } Stream input = codedInputStream.InternalInputStream; state.totalBytesRetired += state.bufferSize; state.bufferPos = 0; state.bufferSize = (input == null) ? 0 : input.Read(codedInputStream.InternalBuffer, 0, buffer.Length); if (state.bufferSize < 0) { throw new InvalidOperationException("Stream.Read returned a negative count"); } if (state.bufferSize == 0) { if (mustSucceed) { throw InvalidProtocolBufferException.TruncatedMessage(); } else { return(false); } } else { RecomputeBufferSizeAfterLimit(ref state); int totalBytesRead = state.totalBytesRetired + state.bufferSize + state.bufferSizeAfterLimit; if (totalBytesRead < 0 || totalBytesRead > state.sizeLimit) { throw InvalidProtocolBufferException.SizeLimitExceeded(); } return(true); } }