@@ -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
@@ -196,28 +194,17 @@ internal struct _StringObject {
196
194
enum Nibbles { }
197
195
}
198
196
197
+ #if !(arch(i386) || arch(arm))
199
198
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
199
@inlinable
210
- internal var discriminator : Discriminator {
200
+ internal var _discriminator : Discriminator {
211
201
@inline ( __always) get {
212
- #if arch(i386) || arch(arm)
213
- return self . discriminator ( isImmortal: _variant. isImmortal)
214
- #else
215
202
let d = objectRawBits &>> Nibbles . discriminatorShift
216
203
return Discriminator ( UInt8 ( truncatingIfNeeded: d) )
217
- #endif
218
204
}
219
205
}
220
206
}
207
+ #endif
221
208
222
209
// Raw
223
210
extension _StringObject {
@@ -233,7 +220,7 @@ extension _StringObject {
233
220
let count = UInt64 ( truncatingIfNeeded: UInt ( bitPattern: _count) )
234
221
let payload = UInt64 ( truncatingIfNeeded: undiscriminatedObjectRawBits)
235
222
let flags = UInt64 ( truncatingIfNeeded: _flags. _value)
236
- let discr = UInt64 ( truncatingIfNeeded: discriminator . _value)
223
+ let discr = UInt64 ( truncatingIfNeeded: _discriminator . _value)
237
224
if isSmall {
238
225
// Rearrange small strings in a different way, compacting bytes into a
239
226
// contiguous sequence. See comment on small string layout below.
@@ -636,9 +623,7 @@ extension _StringObject {
636
623
internal var isSmall : Bool {
637
624
@inline ( __always) get {
638
625
#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
626
+ return _discriminator. isSmall
642
627
#else
643
628
return ( objectRawBits & 0x2000_0000_0000_0000 ) != 0
644
629
#endif
@@ -658,9 +643,7 @@ extension _StringObject {
658
643
internal var providesFastUTF8 : Bool {
659
644
@inline ( __always) get {
660
645
#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
646
+ return _discriminator. providesFastUTF8
664
647
#else
665
648
return ( objectRawBits & 0x1000_0000_0000_0000 ) == 0
666
649
#endif
@@ -677,7 +660,7 @@ extension _StringObject {
677
660
internal var hasNativeStorage : Bool {
678
661
@inline ( __always) get {
679
662
#if arch(i386) || arch(arm)
680
- return discriminator . hasNativeStorage
663
+ return _discriminator . hasNativeStorage
681
664
#else
682
665
return ( objectRawBits & 0xF800_0000_0000_0000 ) == 0
683
666
#endif
@@ -688,7 +671,7 @@ extension _StringObject {
688
671
internal var hasSharedStorage : Bool {
689
672
@inline ( __always) get {
690
673
#if arch(i386) || arch(arm)
691
- return discriminator . hasSharedStorage
674
+ return _discriminator . hasSharedStorage
692
675
#else
693
676
return ( objectRawBits & 0xF800_0000_0000_0000 )
694
677
== Nibbles . largeSharedMortal ( )
@@ -705,9 +688,7 @@ extension _StringObject {
705
688
@inline ( __always) get {
706
689
_internalInvariant ( isLarge && providesFastUTF8)
707
690
#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
691
+ return _discriminator. largeFastIsNative
711
692
#else
712
693
return ( objectRawBits & 0x0800_0000_0000_0000 ) == 0
713
694
#endif
@@ -726,9 +707,7 @@ extension _StringObject {
726
707
@inline ( __always) get {
727
708
_internalInvariant ( isLarge)
728
709
#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
710
+ return _discriminator. largeIsCocoa
732
711
#else
733
712
return ( objectRawBits & 0x4000_0000_0000_0000 ) != 0
734
713
#endif
@@ -770,12 +749,7 @@ extension _StringObject {
770
749
@inline ( __always)
771
750
get {
772
751
_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
- return discriminator. smallCount
778
- #endif
752
+ return _discriminator. smallCount
779
753
}
780
754
}
781
755
@@ -785,8 +759,7 @@ extension _StringObject {
785
759
get {
786
760
_internalInvariant ( isSmall)
787
761
#if arch(i386) || arch(arm)
788
- // Note: This assumes that `isSmall` implies that we're immortal.
789
- return discriminator ( isImmortal: true ) . smallIsASCII
762
+ return _discriminator. smallIsASCII
790
763
#else
791
764
return objectRawBits & 0x4000_0000_0000_0000 != 0
792
765
#endif
@@ -1320,7 +1293,7 @@ extension _StringObject {
1320
1293
< \( word0) \( word1) > \
1321
1294
count: \( String ( _count, radix: 16 ) ) , \
1322
1295
variant: \( _variant) , \
1323
- discriminator: \( discriminator ) , \
1296
+ discriminator: \( _discriminator ) , \
1324
1297
flags: \( _flags) )
1325
1298
""" )
1326
1299
#else
0 commit comments