Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter

Unsafe.WriteUnaligned(ref dest, value.Length);
Unsafe.CopyBlockUnaligned(ref Unsafe.Add(ref dest, 4), ref src, (uint)byteCount);
writer.Advance(byteCount + 4);
writer.AdvanceUnsafe(byteCount + 4);
}
else
#endif
Expand Down Expand Up @@ -146,7 +146,7 @@ public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter

Unsafe.WriteUnaligned(ref dest, value.Length);
Unsafe.CopyBlockUnaligned(ref Unsafe.Add(ref dest, 4), ref src, (uint)byteCount);
writer.Advance(byteCount + 4);
writer.AdvanceUnsafe(byteCount + 4);
}
else
#endif
Expand Down Expand Up @@ -199,7 +199,7 @@ public override void Deserialize(ref MemoryPackReader reader, scoped ref T?[,,]?
ref var src = ref reader.GetSpanReference(byteCount);
Unsafe.CopyBlockUnaligned(ref dest, ref src, (uint)byteCount);

reader.Advance(byteCount);
reader.AdvanceUnsafe(byteCount);
}
else
#endif
Expand Down Expand Up @@ -265,7 +265,7 @@ public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter

Unsafe.WriteUnaligned(ref dest, value.Length);
Unsafe.CopyBlockUnaligned(ref Unsafe.Add(ref dest, 4), ref src, (uint)byteCount);
writer.Advance(byteCount + 4);
writer.AdvanceUnsafe(byteCount + 4);
}
else
#endif
Expand Down
4 changes: 2 additions & 2 deletions src/MemoryPack.Core/Formatters/StringBuilderFormatter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter
ref var src = ref Unsafe.As<char, byte>(ref MemoryMarshal.GetReference(chunk.Span));
Unsafe.CopyBlockUnaligned(ref p, ref src, (uint)chunk.Length * 2);

writer.Advance(chunk.Length * 2);
writer.AdvanceUnsafe(chunk.Length * 2);
}
return;
}
Expand Down Expand Up @@ -67,6 +67,6 @@ public override void Deserialize(ref MemoryPackReader reader, scoped ref StringB
var src = MemoryMarshal.CreateSpan(ref Unsafe.As<byte, char>(ref p), length);
value.Append(src);

reader.Advance(size);
reader.AdvanceUnsafe(size);
}
}
8 changes: 4 additions & 4 deletions src/MemoryPack.Core/Formatters/UnmanagedFormatter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,14 @@ public sealed class UnmanagedFormatter<T> : MemoryPackFormatter<T>
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref T value)
{
Unsafe.WriteUnaligned(ref writer.GetSpanReference(Unsafe.SizeOf<T>()), value);
writer.Advance(Unsafe.SizeOf<T>());
writer.AdvanceUnsafe(Unsafe.SizeOf<T>());
}

[Preserve]
public override void Deserialize(ref MemoryPackReader reader, scoped ref T value)
{
value = Unsafe.ReadUnaligned<T>(ref reader.GetSpanReference(Unsafe.SizeOf<T>()));
reader.Advance(Unsafe.SizeOf<T>());
reader.AdvanceUnsafe(Unsafe.SizeOf<T>());
}
}

Expand All @@ -35,13 +35,13 @@ public sealed class DangerousUnmanagedFormatter<T> : MemoryPackFormatter<T>
public override void Serialize<TBufferWriter>(ref MemoryPackWriter<TBufferWriter> writer, scoped ref T? value)
{
Unsafe.WriteUnaligned(ref writer.GetSpanReference(Unsafe.SizeOf<T>()), value);
writer.Advance(Unsafe.SizeOf<T>());
writer.AdvanceUnsafe(Unsafe.SizeOf<T>());
}

[Preserve]
public override void Deserialize(ref MemoryPackReader reader, scoped ref T? value)
{
value = Unsafe.ReadUnaligned<T>(ref reader.GetSpanReference(Unsafe.SizeOf<T>()));
reader.Advance(Unsafe.SizeOf<T>());
reader.AdvanceUnsafe(Unsafe.SizeOf<T>());
}
}
60 changes: 30 additions & 30 deletions src/MemoryPack.Core/MemoryPackReader.Unmanaged.cs

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion src/MemoryPack.Core/MemoryPackReader.Unmanaged.tt
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public ref partial struct MemoryPackReader
<# for(var j = 2; j <= i; j++) { #>
value<#= j #> = Unsafe.ReadUnaligned<T<#= j #>>(ref Unsafe.Add(ref spanRef, <#= MakeSize(j - 1) #>));
<# } #>
Advance(size);
AdvanceUnsafe(size);
}

<# } } #>
Expand Down
39 changes: 26 additions & 13 deletions src/MemoryPack.Core/MemoryPackReader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,19 @@ public void Advance(int count)
consumed += count;
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal void AdvanceUnsafe(int count)
{
bufferLength = bufferLength - count;
#if NET7_0_OR_GREATER
bufferReference = ref Unsafe.Add(ref bufferReference, count);
#else
bufferReference = bufferReference.Slice(count);
#endif
advancedCount += count;
consumed += count;
}

[MethodImpl(MethodImplOptions.NoInlining)]
bool TryAdvanceSequence(int count)
{
Expand Down Expand Up @@ -253,15 +266,15 @@ public IMemoryPackFormatter<T> GetFormatter<T>()
public bool TryReadObjectHeader(out byte memberCount)
{
memberCount = GetSpanReference(1);
Advance(1);
AdvanceUnsafe(1);
return memberCount != MemoryPackCode.NullObject;
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool TryReadUnionHeader(out ushort tag)
{
var firstTag = GetSpanReference(1);
Advance(1);
AdvanceUnsafe(1);
if (firstTag < MemoryPackCode.WideTag)
{
tag = firstTag;
Expand All @@ -283,7 +296,7 @@ public bool TryReadUnionHeader(out ushort tag)
public bool TryReadCollectionHeader(out int length)
{
length = Unsafe.ReadUnaligned<int>(ref GetSpanReference(4));
Advance(4);
AdvanceUnsafe(4);

// If collection-length is larger than buffer-length, it is invalid data.
if (Remaining < length)
Expand Down Expand Up @@ -351,7 +364,7 @@ public bool TryPeekCollectionHeader(out int length)
public bool DangerousTryReadCollectionHeader(out int length)
{
length = Unsafe.ReadUnaligned<int>(ref GetSpanReference(4));
Advance(4);
AdvanceUnsafe(4);

return length != MemoryPackCode.NullCollection;
}
Expand Down Expand Up @@ -386,7 +399,7 @@ string ReadUtf16(int length)

var str = new string(MemoryMarshal.CreateReadOnlySpan(ref Unsafe.As<byte, char>(ref src), length));

Advance(byteCount);
AdvanceUnsafe(byteCount);

return str;
}
Expand Down Expand Up @@ -443,7 +456,7 @@ string ReadUtf8(int utf8Length)
#endif
}

Advance(utf8Length + 4);
AdvanceUnsafe(utf8Length + 4);

return str;
}
Expand All @@ -456,7 +469,7 @@ public T1 ReadUnmanaged<T1>()
var size = Unsafe.SizeOf<T1>();
ref var spanRef = ref GetSpanReference(size);
var value1 = Unsafe.ReadUnaligned<T1>(ref spanRef);
Advance(size);
AdvanceUnsafe(size);
return value1;
}

Expand Down Expand Up @@ -744,7 +757,7 @@ public void ReadUnmanagedSpan<T>(scoped ref Span<T> value)
ref var src = ref GetSpanReference(byteCount);
var dest = AllocateUninitializedArray<T>(length);
Unsafe.CopyBlockUnaligned(ref Unsafe.As<T, byte>(ref GetArrayDataReference(dest)), ref src, (uint)byteCount);
Advance(byteCount);
AdvanceUnsafe(byteCount);

return dest;
}
Expand Down Expand Up @@ -775,7 +788,7 @@ public unsafe void DangerousReadUnmanagedArray<T>(scoped ref T[]? value)
ref var dest = ref Unsafe.As<T, byte>(ref GetArrayDataReference(value));
Unsafe.CopyBlockUnaligned(ref dest, ref src, (uint)byteCount);

Advance(byteCount);
AdvanceUnsafe(byteCount);
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
Expand Down Expand Up @@ -804,7 +817,7 @@ public unsafe void DangerousReadUnmanagedSpan<T>(scoped ref Span<T> value)
ref var dest = ref Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(value));
Unsafe.CopyBlockUnaligned(ref dest, ref src, (uint)byteCount);

Advance(byteCount);
AdvanceUnsafe(byteCount);
}

#endregion
Expand All @@ -830,7 +843,7 @@ public void ReadSpanWithoutReadLengthHeader<T>(int length, scoped ref Span<T?> v
ref var dest = ref Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(value)!);
Unsafe.CopyBlockUnaligned(ref dest, ref src, (uint)byteCount);

Advance(byteCount);
AdvanceUnsafe(byteCount);
}
else
{
Expand Down Expand Up @@ -873,7 +886,7 @@ public void ReadPackableSpanWithoutReadLengthHeader<T>(int length, scoped ref Sp
ref var dest = ref Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(value)!);
Unsafe.CopyBlockUnaligned(ref dest, ref src, (uint)byteCount);

Advance(byteCount);
AdvanceUnsafe(byteCount);
}
else
{
Expand Down Expand Up @@ -913,7 +926,7 @@ public unsafe void DangerousReadUnmanagedSpanView<T>(out bool isNull, out ReadOn

var span = MemoryMarshal.CreateReadOnlySpan(ref src, byteCount);

Advance(byteCount);
AdvanceUnsafe(byteCount);
view = span; // safe until call next GetSpanReference
}
}
Loading