@@ -1010,7 +1010,7 @@ public void CopyFrom(ArraySegment<byte> buffer)
1010
1010
1011
1011
public void CopyFrom ( byte [ ] data , int offset , int count )
1012
1012
{
1013
- if ( IsDefault )
1013
+ if ( count == 0 || IsDefault )
1014
1014
{
1015
1015
return ;
1016
1016
}
@@ -1019,6 +1019,19 @@ public void CopyFrom(byte[] data, int offset, int count)
1019
1019
Debug . Assert ( _block . Next == null ) ;
1020
1020
Debug . Assert ( _block . End == _index ) ;
1021
1021
1022
+ Debug . Assert ( count + offset <= data . Length ) ;
1023
+
1024
+ #if NET451
1025
+ BlockCopyFrom ( data , offset , count ) ;
1026
+ #else
1027
+ MemoryCopyFrom ( data , offset , count ) ;
1028
+ #endif
1029
+ }
1030
+
1031
+ #if NET451
1032
+ private void BlockCopyFrom ( byte [ ] data , int offset , int count )
1033
+ {
1034
+ // Note: Ensure for any changes in this function MemoryCopyFrom is changed to match
1022
1035
var pool = _block . Pool ;
1023
1036
var block = _block ;
1024
1037
var blockIndex = _index ;
@@ -1054,6 +1067,49 @@ public void CopyFrom(byte[] data, int offset, int count)
1054
1067
_block = block ;
1055
1068
_index = blockIndex ;
1056
1069
}
1070
+ #else
1071
+ private unsafe void MemoryCopyFrom ( byte [ ] data , int offset , int count )
1072
+ {
1073
+ // Note: Ensure for any changes in this function BlockCopyFrom is changed to match
1074
+ var pool = _block . Pool ;
1075
+ var block = _block ;
1076
+ var blockIndex = _index ;
1077
+
1078
+ var bufferIndex = offset ;
1079
+ var remaining = count ;
1080
+ var bytesLeftInBlock = block . Data . Offset + block . Data . Count - blockIndex ;
1081
+
1082
+ fixed ( byte * pData = & data [ 0 ] )
1083
+ {
1084
+ while ( remaining > 0 )
1085
+ {
1086
+ if ( bytesLeftInBlock == 0 )
1087
+ {
1088
+ var nextBlock = pool . Lease ( ) ;
1089
+ block . End = blockIndex ;
1090
+ Volatile . Write ( ref block . Next , nextBlock ) ;
1091
+ block = nextBlock ;
1092
+
1093
+ blockIndex = block . Data . Offset ;
1094
+ bytesLeftInBlock = block . Data . Count ;
1095
+ }
1096
+
1097
+ var bytesToCopy = remaining < bytesLeftInBlock ? remaining : bytesLeftInBlock ;
1098
+
1099
+ Buffer . MemoryCopy ( pData + bufferIndex , block . DataFixedPtr + blockIndex , bytesLeftInBlock , bytesToCopy ) ;
1100
+
1101
+ blockIndex += bytesToCopy ;
1102
+ bufferIndex += bytesToCopy ;
1103
+ remaining -= bytesToCopy ;
1104
+ bytesLeftInBlock -= bytesToCopy ;
1105
+ }
1106
+ }
1107
+
1108
+ block . End = blockIndex ;
1109
+ _block = block ;
1110
+ _index = blockIndex ;
1111
+ }
1112
+ #endif
1057
1113
1058
1114
public unsafe void CopyFromAscii ( string data )
1059
1115
{
0 commit comments