Skip to content

Commit 5670be1

Browse files
authored
Merge pull request #799 from pziezio/fix-ibufferwriter-span-size
Fix IBufferWriterExtensions Write for unmanaged types
2 parents b7ad78e + 8de7190 commit 5670be1

File tree

2 files changed

+21
-4
lines changed

2 files changed

+21
-4
lines changed

src/CommunityToolkit.HighPerformance/Extensions/IBufferWriterExtensions.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,9 @@ public static Stream AsStream(this IBufferWriter<byte> writer)
4848
public static unsafe void Write<T>(this IBufferWriter<byte> writer, T value)
4949
where T : unmanaged
5050
{
51-
int length = sizeof(T);
52-
Span<byte> span = writer.GetSpan(1);
51+
Span<byte> span = writer.GetSpan(sizeof(T));
5352

54-
if (span.Length < length)
53+
if (span.Length < sizeof(T))
5554
{
5655
ThrowArgumentExceptionForEndOfBuffer();
5756
}
@@ -60,7 +59,7 @@ public static unsafe void Write<T>(this IBufferWriter<byte> writer, T value)
6059

6160
Unsafe.WriteUnaligned(ref r0, value);
6261

63-
writer.Advance(length);
62+
writer.Advance(sizeof(T));
6463
}
6564

6665
/// <summary>

tests/CommunityToolkit.HighPerformance.UnitTests/Extensions/Test_IBufferWriterExtensions.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,4 +118,22 @@ public void Test_IBufferWriterExtensions_WriteReadOverItems_ReadOnlySpan()
118118

119119
Assert.IsTrue(span.SequenceEqual(buffer.AsSpan()));
120120
}
121+
122+
// See https://github.com/CommunityToolkit/dotnet/issues/798
123+
[TestMethod]
124+
public void Test_IBufferWriterExtensions_WriteExceedingFreeCapacity()
125+
{
126+
ArrayPoolBufferWriter<byte> writer = new();
127+
128+
// Leave only one byte of free capacity
129+
int count = writer.Capacity - 1;
130+
131+
for (int i = 0; i < count; i++)
132+
{
133+
writer.Write<byte>(0);
134+
}
135+
136+
// Write 4 bytes
137+
writer.Write(1);
138+
}
121139
}

0 commit comments

Comments
 (0)