@@ -137,7 +137,7 @@ internal struct _StringObject {
137137 internal var _variant : Variant
138138
139139 @usableFromInline
140- internal var _discriminator : Builtin . Int7
140+ internal var _discriminator : Discriminator
141141
142142 @usableFromInline
143143 internal var _flags : Flags
@@ -149,11 +149,9 @@ internal struct _StringObject {
149149 discriminator: Discriminator ,
150150 flags: Flags
151151 ) {
152- _internalInvariant ( variant. isImmortal == discriminator. isImmortal)
153152 self . _count = count
154153 self . _variant = variant
155- self . _discriminator =
156- Builtin . truncOrBitCast_Int8_Int7 ( discriminator. _value. _value)
154+ self . _discriminator = discriminator
157155 self . _flags = flags
158156 }
159157
@@ -196,28 +194,17 @@ internal struct _StringObject {
196194 enum Nibbles { }
197195}
198196
197+ #if !(arch(i386) || arch(arm))
199198extension _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-
209199 @inlinable
210- internal var discriminator : Discriminator {
200+ internal var _discriminator : Discriminator {
211201 @inline ( __always) get {
212- #if arch(i386) || arch(arm)
213- return self . discriminator ( isImmortal: _variant. isImmortal)
214- #else
215202 let d = objectRawBits &>> Nibbles . discriminatorShift
216203 return Discriminator ( UInt8 ( truncatingIfNeeded: d) )
217- #endif
218204 }
219205 }
220206}
207+ #endif
221208
222209// Raw
223210extension _StringObject {
@@ -233,7 +220,7 @@ extension _StringObject {
233220 let count = UInt64 ( truncatingIfNeeded: UInt ( bitPattern: _count) )
234221 let payload = UInt64 ( truncatingIfNeeded: undiscriminatedObjectRawBits)
235222 let flags = UInt64 ( truncatingIfNeeded: _flags. _value)
236- let discr = UInt64 ( truncatingIfNeeded: discriminator . _value)
223+ let discr = UInt64 ( truncatingIfNeeded: _discriminator . _value)
237224 if isSmall {
238225 // Rearrange small strings in a different way, compacting bytes into a
239226 // contiguous sequence. See comment on small string layout below.
@@ -636,9 +623,7 @@ extension _StringObject {
636623 internal var isSmall : Bool {
637624 @inline ( __always) get {
638625#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
642627#else
643628 return ( objectRawBits & 0x2000_0000_0000_0000 ) != 0
644629#endif
@@ -658,9 +643,7 @@ extension _StringObject {
658643 internal var providesFastUTF8 : Bool {
659644 @inline ( __always) get {
660645#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
664647#else
665648 return ( objectRawBits & 0x1000_0000_0000_0000 ) == 0
666649#endif
@@ -677,7 +660,7 @@ extension _StringObject {
677660 internal var hasNativeStorage : Bool {
678661 @inline ( __always) get {
679662#if arch(i386) || arch(arm)
680- return discriminator . hasNativeStorage
663+ return _discriminator . hasNativeStorage
681664#else
682665 return ( objectRawBits & 0xF800_0000_0000_0000 ) == 0
683666#endif
@@ -688,7 +671,7 @@ extension _StringObject {
688671 internal var hasSharedStorage : Bool {
689672 @inline ( __always) get {
690673#if arch(i386) || arch(arm)
691- return discriminator . hasSharedStorage
674+ return _discriminator . hasSharedStorage
692675#else
693676 return ( objectRawBits & 0xF800_0000_0000_0000 )
694677 == Nibbles . largeSharedMortal ( )
@@ -705,9 +688,7 @@ extension _StringObject {
705688 @inline ( __always) get {
706689 _internalInvariant ( isLarge && providesFastUTF8)
707690#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
711692#else
712693 return ( objectRawBits & 0x0800_0000_0000_0000 ) == 0
713694#endif
@@ -726,9 +707,7 @@ extension _StringObject {
726707 @inline ( __always) get {
727708 _internalInvariant ( isLarge)
728709#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
732711#else
733712 return ( objectRawBits & 0x4000_0000_0000_0000 ) != 0
734713#endif
@@ -770,12 +749,7 @@ extension _StringObject {
770749 @inline ( __always)
771750 get {
772751 _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
779753 }
780754 }
781755
@@ -785,8 +759,7 @@ extension _StringObject {
785759 get {
786760 _internalInvariant ( isSmall)
787761#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
790763#else
791764 return objectRawBits & 0x4000_0000_0000_0000 != 0
792765#endif
@@ -1320,7 +1293,7 @@ extension _StringObject {
13201293 < \( word0) \( word1) > \
13211294 count: \( String ( _count, radix: 16 ) ) , \
13221295 variant: \( _variant) , \
1323- discriminator: \( discriminator ) , \
1296+ discriminator: \( _discriminator ) , \
13241297 flags: \( _flags) )
13251298 """ )
13261299#else
0 commit comments