@@ -137,7 +137,7 @@ internal struct _StringObject {
137
137
internal var _variant : Variant
138
138
139
139
@usableFromInline
140
- internal var _discriminator : Builtin . Int7
140
+ internal var _discriminator : Discriminator
141
141
142
142
@usableFromInline
143
143
internal var _flags : Flags
@@ -149,11 +149,9 @@ internal struct _StringObject {
149
149
discriminator: Discriminator ,
150
150
flags: Flags
151
151
) {
152
- _internalInvariant ( variant. isImmortal == discriminator. isImmortal)
153
152
self . _count = count
154
153
self . _variant = variant
155
- self . _discriminator =
156
- Builtin . truncOrBitCast_Int8_Int7 ( discriminator. _value. _value)
154
+ self . _discriminator = discriminator
157
155
self . _flags = flags
158
156
}
159
157
@@ -197,20 +195,11 @@ internal struct _StringObject {
197
195
}
198
196
199
197
extension _StringObject {
200
- #if arch(i386) || arch(arm)
201
- @inlinable @inline ( __always)
202
- internal func discriminator( isImmortal: Bool ) -> Discriminator {
203
- let lowBits = UInt8 ( Builtin . zextOrBitCast_Int7_Int8 ( _discriminator) )
204
- guard isImmortal else { return Discriminator ( lowBits) }
205
- return Discriminator ( lowBits | 0x80 )
206
- }
207
- #endif
208
-
209
198
@inlinable
210
199
internal var discriminator : Discriminator {
211
200
@inline ( __always) get {
212
201
#if arch(i386) || arch(arm)
213
- return self . discriminator ( isImmortal : _variant . isImmortal )
202
+ return _discriminator
214
203
#else
215
204
let d = objectRawBits &>> Nibbles . discriminatorShift
216
205
return Discriminator ( UInt8 ( truncatingIfNeeded: d) )
@@ -233,7 +222,7 @@ extension _StringObject {
233
222
let count = UInt64 ( truncatingIfNeeded: UInt ( bitPattern: _count) )
234
223
let payload = UInt64 ( truncatingIfNeeded: undiscriminatedObjectRawBits)
235
224
let flags = UInt64 ( truncatingIfNeeded: _flags. _value)
236
- let discr = UInt64 ( truncatingIfNeeded: discriminator . _value)
225
+ let discr = UInt64 ( truncatingIfNeeded: _discriminator . _value)
237
226
if isSmall {
238
227
// Rearrange small strings in a different way, compacting bytes into a
239
228
// contiguous sequence. See comment on small string layout below.
@@ -636,9 +625,7 @@ extension _StringObject {
636
625
internal var isSmall : Bool {
637
626
@inline ( __always) get {
638
627
#if arch(i386) || arch(arm)
639
- // Note: This assumes that the `isSmall` predicate doesn't look at the
640
- // immortal bit. We may or may not actually be immortal.
641
- return discriminator ( isImmortal: true ) . isSmall
628
+ return _discriminator. isSmall
642
629
#else
643
630
return ( objectRawBits & 0x2000_0000_0000_0000 ) != 0
644
631
#endif
@@ -658,9 +645,7 @@ extension _StringObject {
658
645
internal var providesFastUTF8 : Bool {
659
646
@inline ( __always) get {
660
647
#if arch(i386) || arch(arm)
661
- // Note: This assumes that the `providesFastUTF8` predicate doesn't look
662
- // at the immortal bit. We may or may not actually be immortal.
663
- return discriminator ( isImmortal: false ) . providesFastUTF8
648
+ return _discriminator. providesFastUTF8
664
649
#else
665
650
return ( objectRawBits & 0x1000_0000_0000_0000 ) == 0
666
651
#endif
@@ -677,7 +662,7 @@ extension _StringObject {
677
662
internal var hasNativeStorage : Bool {
678
663
@inline ( __always) get {
679
664
#if arch(i386) || arch(arm)
680
- return discriminator . hasNativeStorage
665
+ return _discriminator . hasNativeStorage
681
666
#else
682
667
return ( objectRawBits & 0xF800_0000_0000_0000 ) == 0
683
668
#endif
@@ -688,7 +673,7 @@ extension _StringObject {
688
673
internal var hasSharedStorage : Bool {
689
674
@inline ( __always) get {
690
675
#if arch(i386) || arch(arm)
691
- return discriminator . hasSharedStorage
676
+ return _discriminator . hasSharedStorage
692
677
#else
693
678
return ( objectRawBits & 0xF800_0000_0000_0000 )
694
679
== Nibbles . largeSharedMortal ( )
@@ -705,9 +690,7 @@ extension _StringObject {
705
690
@inline ( __always) get {
706
691
_internalInvariant ( isLarge && providesFastUTF8)
707
692
#if arch(i386) || arch(arm)
708
- // Note: This assumes that the `largeFastIsNative` predicate doesn't look
709
- // at the immortal bit. We may or may not actually be immortal.
710
- return discriminator ( isImmortal: false ) . largeFastIsNative
693
+ return _discriminator. largeFastIsNative
711
694
#else
712
695
return ( objectRawBits & 0x0800_0000_0000_0000 ) == 0
713
696
#endif
@@ -726,9 +709,7 @@ extension _StringObject {
726
709
@inline ( __always) get {
727
710
_internalInvariant ( isLarge)
728
711
#if arch(i386) || arch(arm)
729
- // Note: This assumes that the `largeIsCocoa` predicate doesn't look at
730
- // the immortal bit. We may or may not actually be immortal.
731
- return discriminator ( isImmortal: false ) . largeIsCocoa
712
+ return _discriminator. largeIsCocoa
732
713
#else
733
714
return ( objectRawBits & 0x4000_0000_0000_0000 ) != 0
734
715
#endif
@@ -770,12 +751,7 @@ extension _StringObject {
770
751
@inline ( __always)
771
752
get {
772
753
_internalInvariant ( isSmall)
773
- #if arch(i386) || arch(arm)
774
- // Note: This assumes that `isSmall` implies that we're immortal.
775
- return discriminator ( isImmortal: true ) . smallCount
776
- #else
777
754
return discriminator. smallCount
778
- #endif
779
755
}
780
756
}
781
757
@@ -785,8 +761,7 @@ extension _StringObject {
785
761
get {
786
762
_internalInvariant ( isSmall)
787
763
#if arch(i386) || arch(arm)
788
- // Note: This assumes that `isSmall` implies that we're immortal.
789
- return discriminator ( isImmortal: true ) . smallIsASCII
764
+ return _discriminator. smallIsASCII
790
765
#else
791
766
return objectRawBits & 0x4000_0000_0000_0000 != 0
792
767
#endif
@@ -1320,7 +1295,7 @@ extension _StringObject {
1320
1295
< \( word0) \( word1) > \
1321
1296
count: \( String ( _count, radix: 16 ) ) , \
1322
1297
variant: \( _variant) , \
1323
- discriminator: \( discriminator ) , \
1298
+ discriminator: \( _discriminator ) , \
1324
1299
flags: \( _flags) )
1325
1300
""" )
1326
1301
#else
0 commit comments