@@ -351,11 +351,11 @@ public final class _DataStorage {
351
351
352
352
// fast-path for appending directly from another data storage
353
353
@inline ( __always)
354
- public func append( _ otherData: _DataStorage , startingAt start: Int ) {
354
+ public func append( _ otherData: _DataStorage , startingAt start: Int , endingAt end : Int ) {
355
355
let otherLength = otherData. length
356
356
if otherLength == 0 { return }
357
357
if let bytes = otherData. bytes {
358
- append ( bytes. advanced ( by: start) , length: otherLength )
358
+ append ( bytes. advanced ( by: start) , length: end - start )
359
359
}
360
360
}
361
361
@@ -1132,7 +1132,9 @@ public struct Data : ReferenceConvertible, Equatable, Hashable, RandomAccessColl
1132
1132
1133
1133
@_versioned
1134
1134
internal func _validateRange< R: RangeExpression > ( _ range: R ) where R. Bound == Int {
1135
- let r = range. relative ( to: 0 ..< R . Bound. max)
1135
+ let lower = R . Bound ( _sliceRange. lowerBound)
1136
+ let upper = R . Bound ( _sliceRange. upperBound)
1137
+ let r = range. relative ( to: lower..< upper)
1136
1138
precondition ( r. lowerBound >= _sliceRange. lowerBound && r. lowerBound <= _sliceRange. upperBound, " Range \( r) is out of bounds of range \( _sliceRange) " )
1137
1139
precondition ( r. upperBound >= _sliceRange. lowerBound && r. upperBound <= _sliceRange. upperBound, " Range \( r) is out of bounds of range \( _sliceRange) " )
1138
1140
}
@@ -1328,7 +1330,7 @@ public struct Data : ReferenceConvertible, Equatable, Hashable, RandomAccessColl
1328
1330
if !isKnownUniquelyReferenced( & _backing) {
1329
1331
_backing = _backing. mutableCopy ( _sliceRange)
1330
1332
}
1331
- _backing. append ( other. _backing, startingAt: other. _sliceRange. lowerBound)
1333
+ _backing. append ( other. _backing, startingAt: other. _sliceRange. lowerBound, endingAt : other . _sliceRange . upperBound )
1332
1334
_sliceRange = _sliceRange. lowerBound..< ( _sliceRange. upperBound + other. count)
1333
1335
}
1334
1336
@@ -1598,7 +1600,9 @@ public struct Data : ReferenceConvertible, Equatable, Hashable, RandomAccessColl
1598
1600
where R. Bound: FixedWidthInteger , R. Bound. Stride : SignedInteger {
1599
1601
@inline ( __always)
1600
1602
get {
1601
- let range = rangeExpression. relative ( to: 0 ..< R . Bound. max)
1603
+ let lower = R . Bound ( _sliceRange. lowerBound)
1604
+ let upper = R . Bound ( _sliceRange. upperBound)
1605
+ let range = rangeExpression. relative ( to: lower..< upper)
1602
1606
let start : Int = numericCast ( range. lowerBound)
1603
1607
let end : Int = numericCast ( range. upperBound)
1604
1608
let r : Range < Int > = start..< end
@@ -1607,7 +1611,9 @@ public struct Data : ReferenceConvertible, Equatable, Hashable, RandomAccessColl
1607
1611
}
1608
1612
@inline ( __always)
1609
1613
set {
1610
- let range = rangeExpression. relative ( to: 0 ..< R . Bound. max)
1614
+ let lower = R . Bound ( _sliceRange. lowerBound)
1615
+ let upper = R . Bound ( _sliceRange. upperBound)
1616
+ let range = rangeExpression. relative ( to: lower..< upper)
1611
1617
let start : Int = numericCast ( range. lowerBound)
1612
1618
let end : Int = numericCast ( range. upperBound)
1613
1619
let r : Range < Int > = start..< end
0 commit comments