<PackageReference Include="System.Text.Json" Version="10.0.0-preview.7.25380.108" />

PipeReadBufferState

using System.Buffers; using System.IO.Pipelines; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Threading; using System.Threading.Tasks; namespace System.Text.Json.Serialization { [StructLayout(LayoutKind.Auto)] internal struct PipeReadBufferState : IReadBufferState<PipeReadBufferState, PipeReader>, IDisposable { private readonly PipeReader _utf8Json; private ReadOnlySequence<byte> _sequence; private bool _isFinalBlock; private bool _isFirstBlock; private int _unsuccessfulReadBytes; public bool IsFinalBlock { [IsReadOnly] get { return _isFinalBlock; } } public ReadOnlySequence<byte> Bytes { [IsReadOnly] get { return _sequence; } } public PipeReadBufferState(PipeReader utf8Json) { _isFinalBlock = false; _unsuccessfulReadBytes = 0; _sequence = ReadOnlySequence<byte>.Empty; _isFirstBlock = true; _utf8Json = utf8Json; } public void Advance(long bytesConsumed) { _unsuccessfulReadBytes = 0; if (bytesConsumed == 0) { long length = _sequence.Length; _unsuccessfulReadBytes = (int)Math.Min(2147483647, length * 2); } _utf8Json.AdvanceTo(_sequence.Slice(bytesConsumed).Start, _sequence.End); _sequence = ReadOnlySequence<byte>.Empty; } [AsyncStateMachine(typeof(<ReadAsync>d__11))] public ValueTask<PipeReadBufferState> ReadAsync(PipeReader utf8Json, CancellationToken cancellationToken, bool fillBuffer = true) { <ReadAsync>d__11 stateMachine; stateMachine.<>t__builder = AsyncValueTaskMethodBuilder<PipeReadBufferState>.Create(); stateMachine.<>4__this = this; stateMachine.cancellationToken = cancellationToken; stateMachine.<>1__state = -1; stateMachine.<>t__builder.Start(ref stateMachine); return stateMachine.<>t__builder.Task; } public void Read(PipeReader utf8Json) { throw new NotImplementedException(); } private void ProcessReadBytes() { if (_isFirstBlock) { _isFirstBlock = false; if (_sequence.Length > 0) { ReadOnlyMemory<byte> first = _sequence.First; int length = first.Length; ReadOnlySpan<byte> utf8Bom = JsonConstants.Utf8Bom; if (length >= utf8Bom.Length) { first = _sequence.First; if (first.Span.StartsWith(JsonConstants.Utf8Bom)) { ref ReadOnlySequence<byte> sequence = ref _sequence; utf8Bom = JsonConstants.Utf8Bom; _sequence = sequence.Slice((byte)utf8Bom.Length); } } else { SequencePosition position = _sequence.Start; int num = 0; while (true) { int num2 = num; utf8Bom = JsonConstants.Utf8Bom; if (num2 >= utf8Bom.Length || !_sequence.TryGet(ref position, out ReadOnlyMemory<byte> memory, true)) break; ReadOnlySpan<byte> span = memory.Span; int num3 = 0; while (num3 < span.Length) { int num4 = num; utf8Bom = JsonConstants.Utf8Bom; if (num4 >= utf8Bom.Length) break; byte num5 = span[num3]; utf8Bom = JsonConstants.Utf8Bom; if (num5 != utf8Bom[num]) { num = 0; break; } num3++; num++; } } int num6 = num; utf8Bom = JsonConstants.Utf8Bom; if (num6 == utf8Bom.Length) { ref ReadOnlySequence<byte> sequence2 = ref _sequence; utf8Bom = JsonConstants.Utf8Bom; _sequence = sequence2.Slice(utf8Bom.Length); } } } } } public void Dispose() { if (!_sequence.Equals(ReadOnlySequence<byte>.Empty)) { _utf8Json.AdvanceTo(_sequence.Start); _sequence = ReadOnlySequence<byte>.Empty; } } } }