{
numBytes <<= 1;
}
+
+ // We do not want to read even a single byte more than necessary.
+ //
+ // Subtract pending bytes that the decoder may be holding onto. This assumes that each
+ // decoded char corresponds to one or more bytes. Note that custom encodings or encodings with
+ // a custom replacement sequence may violate this assumption.
+ if (numBytes > 1)
+ {
+ DecoderNLS? decoder = _decoder as DecoderNLS;
+ // For internal decoders, we can check whether the decoder has any pending state.
+ // For custom decoders, assume that the decoder has pending state.
+ if (decoder == null || decoder.HasState)
+ {
+ numBytes -= 1;
+
+ // The worst case is charsRemaining = 2 and UTF32Decoder holding onto 3 pending bytes. We need to read just
+ // one byte in this case.
+ if (_2BytesPerChar && numBytes > 2)
+ numBytes -= 2;
+ }
+ }
+
if (numBytes > MaxCharBytesSize)
{
numBytes = MaxCharBytesSize;
public bool MustFlush => _mustFlush;
// Anything left in our decoder?
- internal virtual bool HasState => false;
+ internal virtual bool HasState => _leftoverByteCount != 0;
// Allow encoding to clear our must flush instead of throwing (in ThrowCharsOverflow)
internal void ClearMustFlush()