From 5380dd3a576019bc74e263d18990f35e43f91c11 Mon Sep 17 00:00:00 2001 From: Andy Gocke Date: Wed, 19 Apr 2023 22:13:31 -0700 Subject: [PATCH] Eliminate some extra reader copies (#131) --- src/serde/json/JsonDeserializer.cs | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/src/serde/json/JsonDeserializer.cs b/src/serde/json/JsonDeserializer.cs index b6039ec5..24f56237 100644 --- a/src/serde/json/JsonDeserializer.cs +++ b/src/serde/json/JsonDeserializer.cs @@ -35,9 +35,9 @@ private void SaveState(in Utf8JsonReader reader) _state.Reader = reader; } - private Utf8JsonReader GetReader() + private ref Utf8JsonReader GetReader() { - return _state.Reader; + return ref _state.Reader; } public T DeserializeAny(V v) where V : IDeserializeVisitor @@ -76,16 +76,15 @@ private Utf8JsonReader GetReader() public T DeserializeBool(V v) where V : IDeserializeVisitor { - var reader = GetReader(); + ref var reader = ref GetReader(); reader.ReadOrThrow(); bool b = reader.GetBoolean(); - SaveState(reader); return v.VisitBool(b); } public T DeserializeDictionary(V v) where V : IDeserializeVisitor { - var reader = GetReader(); + ref var reader = ref GetReader(); reader.ReadOrThrow(); if (reader.TokenType != JsonTokenType.StartObject) @@ -93,7 +92,6 @@ private Utf8JsonReader GetReader() throw new InvalidDeserializeValueException("Expected object start"); } - SaveState(reader); var map = new DeDictionary(this); return v.VisitDictionary(ref map); } @@ -103,25 +101,23 @@ private Utf8JsonReader GetReader() public T DeserializeDouble(V v) where V : IDeserializeVisitor { - var reader = GetReader(); + ref var reader = ref GetReader(); reader.ReadOrThrow(); var d = reader.GetDouble(); - SaveState(reader); return v.VisitDouble(d); } public T DeserializeDecimal(V v) where V : IDeserializeVisitor { - var reader = GetReader(); + ref var reader = ref GetReader(); reader.ReadOrThrow(); var d = reader.GetDecimal(); - SaveState(reader); return v.VisitDecimal(d); } public T DeserializeEnumerable(V v) where V : IDeserializeVisitor { - var reader = GetReader(); + ref var reader = ref GetReader(); reader.ReadOrThrow(); if (reader.TokenType != JsonTokenType.StartArray) @@ -129,7 +125,6 @@ private Utf8JsonReader GetReader() throw new InvalidDeserializeValueException("Expected array start"); } - SaveState(reader); var enumerable = new DeEnumerable(this); return v.VisitEnumerable(ref enumerable); } @@ -232,27 +227,24 @@ public DeDictionary(JsonDeserializer de) public T DeserializeI64(V v) where V : IDeserializeVisitor { - var reader = GetReader(); + ref var reader = ref GetReader(); reader.ReadOrThrow(); var i64 = reader.GetInt64(); - SaveState(reader); return v.VisitI64(i64); } public T DeserializeString(V v) where V : IDeserializeVisitor { - var reader = GetReader(); + ref var reader = ref GetReader(); reader.ReadOrThrow(); if (reader.HasValueSequence || reader.ValueIsEscaped) { var s = reader.GetString()!; - SaveState(reader); return v.VisitString(s); } else { var result = v.VisitUtf8Span(reader.ValueSpan); - SaveState(reader); return result; } } @@ -277,10 +269,9 @@ public DeDictionary(JsonDeserializer de) public T DeserializeU64(V v) where V : IDeserializeVisitor { - var reader = GetReader(); + ref var reader = ref GetReader(); reader.ReadOrThrow(); var u64 = reader.GetUInt64(); - SaveState(reader); return v.VisitU64(u64); }