diff options
author | Bill Holmes <bill.holmes@unity3d.com> | 2021-12-10 14:32:56 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-12-10 14:32:56 +0300 |
commit | 640225161b07d0053c8d973d90a638b2aae620f6 (patch) | |
tree | 30ea1a913f977b758072e150d72b5f853d1801cf | |
parent | 70481876a0d77a385d975a0f7d8f5a7d870cb8c3 (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.cs | 21 |
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 |