diff options
-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 |