From 1513b11d733149ad328e44017dde2069302fe2c5 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Sun, 15 Jan 2017 09:45:24 +1300 Subject: [PATCH] -JsonTextReader new line async performance (#1172) --- Src/Newtonsoft.Json/JsonTextReader.Async.cs | 19 +++++++++++++++---- Src/Newtonsoft.Json/JsonTextReader.cs | 17 +++++++++++------ 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/Src/Newtonsoft.Json/JsonTextReader.Async.cs b/Src/Newtonsoft.Json/JsonTextReader.Async.cs index 4eb340b0..8bae6915 100644 --- a/Src/Newtonsoft.Json/JsonTextReader.Async.cs +++ b/Src/Newtonsoft.Json/JsonTextReader.Async.cs @@ -490,16 +490,27 @@ namespace Newtonsoft.Json } } - private async Task ProcessCarriageReturnAsync(bool append, CancellationToken cancellationToken) + private Task ProcessCarriageReturnAsync(bool append, CancellationToken cancellationToken) { _charPos++; - if (await EnsureCharsAsync(1, append, cancellationToken).ConfigureAwait(false) && _chars[_charPos] == StringUtils.LineFeed) + Task task = EnsureCharsAsync(1, append, cancellationToken); + switch (task.Status) { - _charPos++; + case TaskStatus.RanToCompletion: + SetNewLine(task.Result); + return AsyncUtils.CompletedTask; + case TaskStatus.Canceled: + case TaskStatus.Faulted: + return task; } - OnNewLine(_charPos); + return ProcessCarriageReturnAsync(task); + } + + private async Task ProcessCarriageReturnAsync(Task task) + { + SetNewLine(await task.ConfigureAwait(false)); } private async Task ParseUnicodeAsync(CancellationToken cancellationToken) diff --git a/Src/Newtonsoft.Json/JsonTextReader.cs b/Src/Newtonsoft.Json/JsonTextReader.cs index 69041c7c..f33ce6d9 100644 --- a/Src/Newtonsoft.Json/JsonTextReader.cs +++ b/Src/Newtonsoft.Json/JsonTextReader.cs @@ -120,6 +120,16 @@ namespace Newtonsoft.Json } } + private void SetNewLine(bool hasNextChar) + { + if (hasNextChar && _chars[_charPos] == StringUtils.LineFeed) + { + _charPos++; + } + + OnNewLine(_charPos); + } + private void OnNewLine(int pos) { _lineNumber++; @@ -1719,12 +1729,7 @@ namespace Newtonsoft.Json { _charPos++; - if (EnsureChars(1, append) && _chars[_charPos] == StringUtils.LineFeed) - { - _charPos++; - } - - OnNewLine(_charPos); + SetNewLine(EnsureChars(1, append)); } private void EatWhitespace()