Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBill Holmes <bill.holmes@unity3d.com>2021-12-10 14:32:56 +0300
committerGitHub <noreply@github.com>2021-12-10 14:32:56 +0300
commit640225161b07d0053c8d973d90a638b2aae620f6 (patch)
tree30ea1a913f977b758072e150d72b5f853d1801cf
parent70481876a0d77a385d975a0f7d8f5a7d870cb8c3 (diff)
Fix BinaryReader Read to Span of byte and char (#21357)
The previous implementation created a temporary array and threw the result away before copying back to the Span. This commit brings a similar implementation to what is in dotnet/runtime repo.
-rw-r--r--mcs/class/referencesource/mscorlib/system/io/binaryreader.cs21
1 files changed, 17 insertions, 4 deletions
diff --git a/mcs/class/referencesource/mscorlib/system/io/binaryreader.cs b/mcs/class/referencesource/mscorlib/system/io/binaryreader.cs
index 9f1b89de5d5..ecaac6e7e78 100644
--- a/mcs/class/referencesource/mscorlib/system/io/binaryreader.cs
+++ b/mcs/class/referencesource/mscorlib/system/io/binaryreader.cs
@@ -521,14 +521,27 @@ namespace System.IO {
#if MONO
public virtual int Read(Span<char> buffer)
{
- char[] bufferBytes = buffer.ToArray();
- return Read(bufferBytes, 0, bufferBytes.Length);
+ char[] bufferBytes = System.Buffers.ArrayPool<char>.Shared.Rent(buffer.Length);
+ try
+ {
+ int num = InternalReadChars(bufferBytes, 0, buffer.Length);
+ if ((uint)num > (uint)buffer.Length)
+ {
+ throw new IOException(SR.IO_StreamTooLong);
+ }
+ new ReadOnlySpan<char>(bufferBytes, 0, num).CopyTo(buffer);
+ return num;
+ }
+ finally
+ {
+ System.Buffers.ArrayPool<char>.Shared.Return(bufferBytes);
+ }
}
public virtual int Read(Span<byte> buffer)
{
- byte[] bufferBytes = buffer.ToArray();
- return Read(bufferBytes, 0, bufferBytes.Length);
+ if (m_stream==null) __Error.FileNotOpen();
+ return m_stream.Read(buffer);
}
#endif