Skip to content

Commit 0661de2

Browse files
Lance Parkermilseman
authored andcommitted
[stdlib]Un-revert string comparison (#14694)
Restore (un-revert) sting comparison, with fixes More exhaustive testing of opaque strings, which consistently reproduces prior sporadic failure. Shims fixups. Some test tweaking.
1 parent 76af5c5 commit 0661de2

18 files changed

+2001
-431
lines changed

stdlib/public/SwiftShims/UnicodeShims.h

Lines changed: 151 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -62,27 +62,6 @@ SWIFT_RUNTIME_STDLIB_INTERFACE
6262
const __swift_uint16_t *
6363
_swift_stdlib_ExtendedGraphemeClusterNoBoundaryRulesMatrix;
6464

65-
SWIFT_RUNTIME_STDLIB_INTERFACE
66-
SWIFT_READONLY __swift_int32_t
67-
_swift_stdlib_unicode_compare_utf16_utf16(const __swift_uint16_t *Left,
68-
__swift_int32_t LeftLength,
69-
const __swift_uint16_t *Right,
70-
__swift_int32_t RightLength);
71-
72-
SWIFT_RUNTIME_STDLIB_INTERFACE
73-
SWIFT_READONLY __swift_int32_t
74-
_swift_stdlib_unicode_compare_utf8_utf16(const unsigned char *Left,
75-
__swift_int32_t LeftLength,
76-
const __swift_uint16_t *Right,
77-
__swift_int32_t RightLength);
78-
79-
SWIFT_RUNTIME_STDLIB_INTERFACE
80-
SWIFT_READONLY __swift_int32_t
81-
_swift_stdlib_unicode_compare_utf8_utf8(const unsigned char *Left,
82-
__swift_int32_t LeftLength,
83-
const unsigned char *Right,
84-
__swift_int32_t RightLength);
85-
8665
SWIFT_RUNTIME_STDLIB_INTERFACE
8766
void *_swift_stdlib_unicodeCollationIterator_create(
8867
const __swift_uint16_t *Str,
@@ -109,6 +88,123 @@ __swift_int32_t _swift_stdlib_unicode_strToLower(
10988
__swift_uint16_t *Destination, __swift_int32_t DestinationCapacity,
11089
const __swift_uint16_t *Source, __swift_int32_t SourceLength);
11190

91+
typedef enum __swift_stdlib_UProperty {
92+
__swift_stdlib_UCHAR_ALPHABETIC = 0,
93+
__swift_stdlib_UCHAR_BINARY_START = __swift_stdlib_UCHAR_ALPHABETIC,
94+
__swift_stdlib_UCHAR_ASCII_HEX_DIGIT = 1,
95+
__swift_stdlib_UCHAR_BIDI_CONTROL = 2,
96+
__swift_stdlib_UCHAR_BIDI_MIRRORED = 3,
97+
__swift_stdlib_UCHAR_DASH = 4,
98+
__swift_stdlib_UCHAR_DEFAULT_IGNORABLE_CODE_POINT = 5,
99+
__swift_stdlib_UCHAR_DEPRECATED = 6,
100+
__swift_stdlib_UCHAR_DIACRITIC = 7,
101+
__swift_stdlib_UCHAR_EXTENDER = 8,
102+
__swift_stdlib_UCHAR_FULL_COMPOSITION_EXCLUSION = 9,
103+
__swift_stdlib_UCHAR_GRAPHEME_BASE = 10,
104+
__swift_stdlib_UCHAR_GRAPHEME_EXTEND = 11,
105+
__swift_stdlib_UCHAR_GRAPHEME_LINK = 12,
106+
__swift_stdlib_UCHAR_HEX_DIGIT = 13,
107+
__swift_stdlib_UCHAR_HYPHEN = 14,
108+
__swift_stdlib_UCHAR_ID_CONTINUE = 15,
109+
__swift_stdlib_UCHAR_ID_START = 16,
110+
__swift_stdlib_UCHAR_IDEOGRAPHIC = 17,
111+
__swift_stdlib_UCHAR_IDS_BINARY_OPERATOR = 18,
112+
__swift_stdlib_UCHAR_IDS_TRINARY_OPERATOR = 19,
113+
__swift_stdlib_UCHAR_JOIN_CONTROL = 20,
114+
__swift_stdlib_UCHAR_LOGICAL_ORDER_EXCEPTION = 21,
115+
__swift_stdlib_UCHAR_LOWERCASE = 22,
116+
__swift_stdlib_UCHAR_MATH = 23,
117+
__swift_stdlib_UCHAR_NONCHARACTER_CODE_POINT = 24,
118+
__swift_stdlib_UCHAR_QUOTATION_MARK = 25,
119+
__swift_stdlib_UCHAR_RADICAL = 26,
120+
__swift_stdlib_UCHAR_SOFT_DOTTED = 27,
121+
__swift_stdlib_UCHAR_TERMINAL_PUNCTUATION = 28,
122+
__swift_stdlib_UCHAR_UNIFIED_IDEOGRAPH = 29,
123+
__swift_stdlib_UCHAR_UPPERCASE = 30,
124+
__swift_stdlib_UCHAR_WHITE_SPACE = 31,
125+
__swift_stdlib_UCHAR_XID_CONTINUE = 32,
126+
__swift_stdlib_UCHAR_XID_START = 33,
127+
__swift_stdlib_UCHAR_CASE_SENSITIVE = 34,
128+
__swift_stdlib_UCHAR_S_TERM = 35,
129+
__swift_stdlib_UCHAR_VARIATION_SELECTOR = 36,
130+
__swift_stdlib_UCHAR_NFD_INERT = 37,
131+
__swift_stdlib_UCHAR_NFKD_INERT = 38,
132+
__swift_stdlib_UCHAR_NFC_INERT = 39,
133+
__swift_stdlib_UCHAR_NFKC_INERT = 40,
134+
__swift_stdlib_UCHAR_SEGMENT_STARTER = 41,
135+
__swift_stdlib_UCHAR_PATTERN_SYNTAX = 42,
136+
__swift_stdlib_UCHAR_PATTERN_WHITE_SPACE = 43,
137+
__swift_stdlib_UCHAR_POSIX_ALNUM = 44,
138+
__swift_stdlib_UCHAR_POSIX_BLANK = 45,
139+
__swift_stdlib_UCHAR_POSIX_GRAPH = 46,
140+
__swift_stdlib_UCHAR_POSIX_PRINT = 47,
141+
__swift_stdlib_UCHAR_POSIX_XDIGIT = 48,
142+
__swift_stdlib_UCHAR_CASED = 49,
143+
__swift_stdlib_UCHAR_CASE_IGNORABLE = 50,
144+
__swift_stdlib_UCHAR_CHANGES_WHEN_LOWERCASED = 51,
145+
__swift_stdlib_UCHAR_CHANGES_WHEN_UPPERCASED = 52,
146+
__swift_stdlib_UCHAR_CHANGES_WHEN_TITLECASED = 53,
147+
__swift_stdlib_UCHAR_CHANGES_WHEN_CASEFOLDED = 54,
148+
__swift_stdlib_UCHAR_CHANGES_WHEN_CASEMAPPED = 55,
149+
__swift_stdlib_UCHAR_CHANGES_WHEN_NFKC_CASEFOLDED = 56,
150+
__swift_stdlib_UCHAR_EMOJI = 57,
151+
__swift_stdlib_UCHAR_EMOJI_PRESENTATION = 58,
152+
__swift_stdlib_UCHAR_EMOJI_MODIFIER = 59,
153+
__swift_stdlib_UCHAR_EMOJI_MODIFIER_BASE = 60,
154+
155+
__swift_stdlib_UCHAR_BIDI_CLASS = 0x1000,
156+
__swift_stdlib_UCHAR_INT_START = __swift_stdlib_UCHAR_BIDI_CLASS,
157+
__swift_stdlib_UCHAR_BLOCK = 0x1001,
158+
__swift_stdlib_UCHAR_CANONICAL_COMBINING_CLASS = 0x1002,
159+
__swift_stdlib_UCHAR_DECOMPOSITION_TYPE = 0x1003,
160+
__swift_stdlib_UCHAR_EAST_ASIAN_WIDTH = 0x1004,
161+
__swift_stdlib_UCHAR_GENERAL_CATEGORY = 0x1005,
162+
__swift_stdlib_UCHAR_JOINING_GROUP = 0x1006,
163+
__swift_stdlib_UCHAR_JOINING_TYPE = 0x1007,
164+
__swift_stdlib_UCHAR_LINE_BREAK = 0x1008,
165+
__swift_stdlib_UCHAR_NUMERIC_TYPE = 0x1009,
166+
__swift_stdlib_UCHAR_SCRIPT = 0x100A,
167+
__swift_stdlib_UCHAR_HANGUL_SYLLABLE_TYPE = 0x100B,
168+
__swift_stdlib_UCHAR_NFD_QUICK_CHECK = 0x100C,
169+
__swift_stdlib_UCHAR_NFKD_QUICK_CHECK = 0x100D,
170+
__swift_stdlib_UCHAR_NFC_QUICK_CHECK = 0x100E,
171+
__swift_stdlib_UCHAR_NFKC_QUICK_CHECK = 0x100F,
172+
__swift_stdlib_UCHAR_LEAD_CANONICAL_COMBINING_CLASS = 0x1010,
173+
__swift_stdlib_UCHAR_TRAIL_CANONICAL_COMBINING_CLASS = 0x1011,
174+
__swift_stdlib_UCHAR_GRAPHEME_CLUSTER_BREAK = 0x1012,
175+
__swift_stdlib_UCHAR_SENTENCE_BREAK = 0x1013,
176+
__swift_stdlib_UCHAR_WORD_BREAK = 0x1014,
177+
__swift_stdlib_UCHAR_BIDI_PAIRED_BRACKET_TYPE = 0x1015,
178+
179+
__swift_stdlib_UCHAR_GENERAL_CATEGORY_MASK = 0x2000,
180+
__swift_stdlib_UCHAR_MASK_START = __swift_stdlib_UCHAR_GENERAL_CATEGORY_MASK,
181+
182+
__swift_stdlib_UCHAR_NUMERIC_VALUE = 0x3000,
183+
__swift_stdlib_UCHAR_DOUBLE_START = __swift_stdlib_UCHAR_NUMERIC_VALUE,
184+
185+
__swift_stdlib_UCHAR_AGE = 0x4000,
186+
__swift_stdlib_UCHAR_STRING_START = __swift_stdlib_UCHAR_AGE,
187+
__swift_stdlib_UCHAR_BIDI_MIRRORING_GLYPH = 0x4001,
188+
__swift_stdlib_UCHAR_CASE_FOLDING = 0x4002,
189+
190+
__swift_stdlib_UCHAR_LOWERCASE_MAPPING = 0x4004,
191+
__swift_stdlib_UCHAR_NAME = 0x4005,
192+
__swift_stdlib_UCHAR_SIMPLE_CASE_FOLDING = 0x4006,
193+
__swift_stdlib_UCHAR_SIMPLE_LOWERCASE_MAPPING = 0x4007,
194+
__swift_stdlib_UCHAR_SIMPLE_TITLECASE_MAPPING = 0x4008,
195+
__swift_stdlib_UCHAR_SIMPLE_UPPERCASE_MAPPING = 0x4009,
196+
__swift_stdlib_UCHAR_TITLECASE_MAPPING = 0x400A,
197+
198+
__swift_stdlib_UCHAR_UPPERCASE_MAPPING = 0x400C,
199+
__swift_stdlib_UCHAR_BIDI_PAIRED_BRACKET = 0x400D,
200+
201+
__swift_stdlib_UCHAR_SCRIPT_EXTENSIONS = 0x7000,
202+
__swift_stdlib_UCHAR_OTHER_PROPERTY_START =
203+
__swift_stdlib_UCHAR_SCRIPT_EXTENSIONS,
204+
205+
__swift_stdlib_UCHAR_INVALID_CODE = -1
206+
} __swift_stdlib_UProperty;
207+
112208
typedef enum __swift_stdlib_UErrorCode {
113209
__swift_stdlib_U_USING_FALLBACK_WARNING = -128,
114210
__swift_stdlib_U_ERROR_WARNING_START = -128,
@@ -294,6 +390,9 @@ typedef enum __swift_stdlib_UBreakIteratorType {
294390
} __swift_stdlib_UBreakIteratorType;
295391

296392
typedef struct __swift_stdlib_UBreakIterator __swift_stdlib_UBreakIterator;
393+
typedef struct __swift_stdlib_UNormalizer2 __swift_stdlib_UNormalizer2;
394+
typedef __swift_int8_t __swift_stdlib_UBool;
395+
typedef __swift_int32_t __swift_stdlib_UChar32;
297396
#if defined(__APPLE__)
298397
typedef __swift_uint16_t __swift_stdlib_UChar;
299398
#else
@@ -329,6 +428,37 @@ SWIFT_RUNTIME_STDLIB_INTERFACE
329428
__swift_int32_t __swift_stdlib_ubrk_following(__swift_stdlib_UBreakIterator *bi,
330429
__swift_int32_t offset);
331430

431+
SWIFT_RUNTIME_STDLIB_INTERFACE
432+
__swift_stdlib_UBool
433+
__swift_stdlib_unorm2_hasBoundaryBefore(const __swift_stdlib_UNormalizer2 *,
434+
__swift_stdlib_UChar32);
435+
436+
SWIFT_RUNTIME_STDLIB_INTERFACE
437+
const __swift_stdlib_UNormalizer2 *
438+
__swift_stdlib_unorm2_getNFCInstance(__swift_stdlib_UErrorCode *);
439+
440+
SWIFT_RUNTIME_STDLIB_INTERFACE
441+
__swift_int32_t
442+
__swift_stdlib_unorm2_normalize(const __swift_stdlib_UNormalizer2 *,
443+
const __swift_uint16_t *, __swift_int32_t,
444+
__swift_uint16_t *, __swift_int32_t,
445+
__swift_stdlib_UErrorCode *);
446+
447+
SWIFT_RUNTIME_STDLIB_INTERFACE
448+
__swift_int32_t __swift_stdlib_unorm2_spanQuickCheckYes(
449+
const __swift_stdlib_UNormalizer2 *, const __swift_stdlib_UChar *,
450+
__swift_int32_t, __swift_stdlib_UErrorCode *);
451+
452+
SWIFT_RUNTIME_STDLIB_INTERFACE
453+
__swift_stdlib_UBool
454+
__swift_stdlib_u_hasBinaryProperty(__swift_stdlib_UChar32,
455+
__swift_stdlib_UProperty);
456+
SWIFT_RUNTIME_STDLIB_INTERFACE
457+
__swift_stdlib_UBool
458+
__swift_stdlib_u_isdefined(__swift_stdlib_UChar32);
459+
460+
461+
332462
#ifdef __cplusplus
333463
}} // extern "C", namespace swift
334464
#endif

stdlib/public/core/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ set(SWIFTLIB_ESSENTIAL
8888
Misc.swift
8989
MutableCollection.swift
9090
NewtypeWrapper.swift.gyb
91+
NormalizedCodeUnitIterator.swift
9192
ObjCMirrors.swift
9293
ObjectIdentifier.swift
9394
Optional.swift
@@ -123,6 +124,7 @@ set(SWIFTLIB_ESSENTIAL
123124
String.swift
124125
StringBridge.swift
125126
StringComparable.swift
127+
StringComparison.swift
126128
StringGuts.swift
127129
StringObject.swift
128130
StringIndex.swift
@@ -132,6 +134,7 @@ set(SWIFTLIB_ESSENTIAL
132134
StringStorage.swift
133135
StringSwitch.swift
134136
StringIndexConversions.swift
137+
StringNormalization.swift
135138
StringUnicodeScalarView.swift
136139
StringUTF16.swift
137140
StringUTF8.swift

stdlib/public/core/FixedArray.swift.gyb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
%{
1818
# The sizes to generate code for.
19-
sizes = [16]
19+
sizes = [2, 8, 16]
2020
}%
2121

2222
% for N in sizes:
@@ -56,7 +56,7 @@ extension _FixedArray${N} {
5656

5757
@_inlineable // FIXME(sil-serialize-all)
5858
@_versioned // FIXME(sil-serialize-all)
59-
internal var count : Int {
59+
internal var count: Int {
6060
@inline(__always) get { return Int(truncatingIfNeeded: _count) }
6161
@inline(__always) set { _count = Int8(newValue) }
6262
}

stdlib/public/core/GroupInfo.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,13 @@
99
"Character.swift",
1010
"CharacterUnicodeScalars.swift",
1111
"ICU.swift",
12+
"NormalizedCodeUnitIterator.swift",
1213
"StaticString.swift",
1314
"String.swift",
1415
"StringBridge.swift",
1516
"StringCharacterView.swift",
1617
"StringComparable.swift",
18+
"StringComparison.swift",
1719
"StringObject.swift",
1820
"StringGuts.swift",
1921
"StringGraphemeBreaking.swift",
@@ -22,6 +24,7 @@
2224
"StringIndexConversions.swift",
2325
"StringInterpolation.swift",
2426
"StringLegacy.swift",
27+
"StringNormalization.swift",
2528
"StringRangeReplaceableCollection.swift",
2629
"StringStorage.swift",
2730
"StringSwitch.swift",

0 commit comments

Comments
 (0)