From 7e3c386e33b816b2626fbc8fbe64e47e1ace245c Mon Sep 17 00:00:00 2001 From: Heejae Chang Date: Tue, 26 Jul 2016 12:10:05 -0700 Subject: [PATCH] support byte and char array natively in ObjectReader/Writer --- .../Portable/Serialization/ObjectReader.cs | 23 +++++++++++++++ .../Portable/Serialization/ObjectWriter.cs | 29 ++++++++++++++++++- 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/src/Compilers/Core/Portable/Serialization/ObjectReader.cs b/src/Compilers/Core/Portable/Serialization/ObjectReader.cs index eb524edab62..4d57ba02a2b 100644 --- a/src/Compilers/Core/Portable/Serialization/ObjectReader.cs +++ b/src/Compilers/Core/Portable/Serialization/ObjectReader.cs @@ -335,6 +335,18 @@ private Array ReadArray(DataKind kind) } Type elementType = this.ReadType(); + + // optimizations for supported array type by binary reader + if (elementType == typeof(byte)) + { + return _reader.ReadBytes(length); + } + + if (elementType == typeof(char)) + { + return _reader.ReadChars(length); + } + Array array = Array.CreateInstance(elementType, length); for (int i = 0; i < length; i++) { @@ -353,6 +365,17 @@ private Type ReadType() private Type ReadType(DataKind kind) { + // optimization for primitive types + if (kind == DataKind.UInt8) + { + return typeof(byte); + } + + if (kind == DataKind.Char) + { + return typeof(char); + } + switch (kind) { case DataKind.TypeRef_B: diff --git a/src/Compilers/Core/Portable/Serialization/ObjectWriter.cs b/src/Compilers/Core/Portable/Serialization/ObjectWriter.cs index 3c73fda39d4..afe5eb0199d 100644 --- a/src/Compilers/Core/Portable/Serialization/ObjectWriter.cs +++ b/src/Compilers/Core/Portable/Serialization/ObjectWriter.cs @@ -472,7 +472,21 @@ private void WriteArray(Array instance) break; } - this.WriteType(instance.GetType().GetElementType()); + var elementType = instance.GetType().GetElementType(); + this.WriteType(elementType); + + // optimizations for supported array type by binary writer + if (elementType == typeof(byte)) + { + _writer.Write((byte[])instance); + return; + } + + if (elementType == typeof(char)) + { + _writer.Write((char[])instance); + return; + } for (int i = 0; i < length; i++) { @@ -482,6 +496,19 @@ private void WriteArray(Array instance) private void WriteType(Type type) { + // optimization. primitive types + if (type == typeof(byte)) + { + _writer.Write((byte)DataKind.UInt8); + return; + } + + if (type == typeof(char)) + { + _writer.Write((byte)DataKind.Char); + return; + } + int id; if (_dataMap.TryGetId(type, out id)) { -- GitLab