From 0fec70aeb15c286cb696420616e2aeb3bc0eb03a Mon Sep 17 00:00:00 2001 From: pthier Date: Fri, 25 Nov 2022 11:27:06 +0100 Subject: [PATCH] [regexp] Support properties of strings in unicode sets mode Add support for properties of strings in unicode sets mode (/v). Bug: v8:11935 Change-Id: Iae2f0182b1c42bb900c524ca406784b7b1b52842 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/4051247 Commit-Queue: Patrick Thier Reviewed-by: Mathias Bynens Cr-Commit-Position: refs/heads/main@{#84481} --- src/regexp/regexp-parser.cc | 162 ++++++++++++++++---- test/mjsunit/harmony/regexp-unicode-sets.js | 36 +++++ test/test262/test262.status | 153 ++++++++---------- 3 files changed, 227 insertions(+), 124 deletions(-) diff --git a/src/regexp/regexp-parser.cc b/src/regexp/regexp-parser.cc index b5ead7c0054..f420b2eec42 100644 --- a/v8/src/regexp/regexp-parser.cc +++ b/v8/src/regexp/regexp-parser.cc @@ -450,7 +450,8 @@ class RegExpParserImpl final { bool ParsePropertyClassName(ZoneVector* name_1, ZoneVector* name_2); - bool AddPropertyClassRange(ZoneList* add_to, bool negate, + bool AddPropertyClassRange(ZoneList* add_to_range, + CharacterClassStrings* add_to_strings, bool negate, const ZoneVector& name_1, const ZoneVector& name_2); @@ -465,7 +466,7 @@ class RegExpParserImpl final { bool TryParseCharacterClassEscape(base::uc32 next, InClassEscapeState in_class_escape_state, ZoneList* ranges, - Zone* zone, + CharacterClassStrings* strings, Zone* zone, bool add_unicode_case_equivalents); RegExpTree* ParseClassStringDisjunction(ZoneList* ranges, CharacterClassStrings* strings); @@ -1094,16 +1095,14 @@ RegExpTree* RegExpParserImpl::ParseDisjunction() { case 's': case 'S': case 'w': - case 'W': - case 'p': - case 'P': { + case 'W': { base::uc32 next = Next(); ZoneList* ranges = zone()->template New>(2, zone()); bool add_unicode_case_equivalents = IsUnicodeMode() && ignore_case(); bool parsed_character_class_escape = TryParseCharacterClassEscape( - next, InClassEscapeState::kNotInClass, ranges, zone(), + next, InClassEscapeState::kNotInClass, ranges, nullptr, zone(), add_unicode_case_equivalents CHECK_FAILED); if (parsed_character_class_escape) { @@ -1117,6 +1116,38 @@ RegExpTree* RegExpParserImpl::ParseDisjunction() { } break; } + case 'p': + case 'P': { + base::uc32 next = Next(); + ZoneList* ranges = + zone()->template New>(2, zone()); + CharacterClassStrings* strings = nullptr; + if (unicode_sets()) { + strings = zone()->template New(zone()); + } + bool add_unicode_case_equivalents = ignore_case(); + bool parsed_character_class_escape = TryParseCharacterClassEscape( + next, InClassEscapeState::kNotInClass, ranges, strings, zone(), + add_unicode_case_equivalents CHECK_FAILED); + + if (parsed_character_class_escape) { + if (unicode_sets()) { + RegExpClassSetOperand* op = + zone()->template New(ranges, + strings); + builder->AddTerm(op); + } else { + RegExpClassRanges* cc = + zone()->template New(zone(), ranges); + builder->AddClassRanges(cc); + } + } else { + CHECK(!IsUnicodeMode()); + Advance(2); + builder->AddCharacter(next); // IdentityEscape. + } + break; + } // AtomEscape :: // k GroupName case 'k': { @@ -1827,10 +1858,44 @@ bool IsExactPropertyValueAlias(const char* property_value_name, return false; } +void ExtractStringsFromUnicodeSet(const icu::UnicodeSet& set, + CharacterClassStrings* strings, + RegExpFlags flags, Zone* zone) { + DCHECK(set.hasStrings()); + DCHECK(IsUnicodeSets(flags)); + DCHECK_NOT_NULL(strings); + + RegExpTextBuilder::SmallRegExpTreeVector string_storage( + ZoneAllocator{zone}); + RegExpTextBuilder string_builder(zone, &string_storage, flags); + const bool needs_case_folding = IsIgnoreCase(flags); + icu::UnicodeSetIterator iter(set); + iter.skipToStrings(); + while (iter.next()) { + const icu::UnicodeString& s = iter.getString(); + const char16_t* p = s.getBuffer(); + int32_t length = s.length(); + ZoneList* string = + zone->template New>(length, zone); + for (int32_t i = 0; i < length;) { + UChar32 c; + U16_NEXT(p, i, length, c); + string_builder.AddUnicodeCharacter(c); + if (needs_case_folding) { + c = u_foldCase(c, U_FOLD_CASE_DEFAULT); + } + string->Add(c, zone); + } + strings->emplace(string->ToVector(), string_builder.ToRegExp()); + string_storage.clear(); + } +} + bool LookupPropertyValueName(UProperty property, const char* property_value_name, bool negate, - bool needs_case_folding, - ZoneList* result, Zone* zone) { + ZoneList* result_ranges, + CharacterClassStrings* result_strings, + RegExpFlags flags, Zone* zone) { UProperty property_for_lookup = property; if (property_for_lookup == UCHAR_SCRIPT_EXTENSIONS) { // For the property Script_Extensions, we have to do the property value @@ -1854,11 +1919,15 @@ bool LookupPropertyValueName(UProperty property, bool success = ec == U_ZERO_ERROR && !set.isEmpty(); if (success) { + if (set.hasStrings()) { + ExtractStringsFromUnicodeSet(set, result_strings, flags, zone); + } + const bool needs_case_folding = IsUnicodeSets(flags) && IsIgnoreCase(flags); if (needs_case_folding) CharacterRange::UnicodeSimpleCloseOver(set); set.removeAllStrings(); if (negate) set.complement(); for (int i = 0; i < set.getRangeCount(); i++) { - result->Add( + result_ranges->Add( CharacterRange::Range(set.getRangeStart(i), set.getRangeEnd(i)), zone); } @@ -1873,7 +1942,7 @@ inline bool NameEquals(const char* name, const char (&literal)[N]) { bool LookupSpecialPropertyValueName(const char* name, ZoneList* result, - bool negate, bool needs_case_folding, + bool negate, RegExpFlags flags, Zone* zone) { if (NameEquals(name, "Any")) { if (negate) { @@ -1888,7 +1957,7 @@ bool LookupSpecialPropertyValueName(const char* name, zone); } else if (NameEquals(name, "Assigned")) { return LookupPropertyValueName(UCHAR_GENERAL_CATEGORY, "Unassigned", - !negate, needs_case_folding, result, zone); + !negate, result, nullptr, flags, zone); } else { return false; } @@ -1897,7 +1966,7 @@ bool LookupSpecialPropertyValueName(const char* name, // Explicitly allowlist supported binary properties. The spec forbids supporting // properties outside of this set to ensure interoperability. -bool IsSupportedBinaryProperty(UProperty property) { +bool IsSupportedBinaryProperty(UProperty property, bool unicode_sets) { switch (property) { case UCHAR_ALPHABETIC: // 'Any' is not supported by ICU. See LookupSpecialPropertyValueName. @@ -1953,6 +2022,30 @@ bool IsSupportedBinaryProperty(UProperty property) { case UCHAR_XID_CONTINUE: case UCHAR_XID_START: return true; + case UCHAR_BASIC_EMOJI: + case UCHAR_EMOJI_KEYCAP_SEQUENCE: + case UCHAR_RGI_EMOJI_MODIFIER_SEQUENCE: + case UCHAR_RGI_EMOJI_FLAG_SEQUENCE: + case UCHAR_RGI_EMOJI_TAG_SEQUENCE: + case UCHAR_RGI_EMOJI_ZWJ_SEQUENCE: + case UCHAR_RGI_EMOJI: + return unicode_sets; + default: + break; + } + return false; +} + +bool IsBinaryPropertyOfStrings(UProperty property) { + switch (property) { + case UCHAR_BASIC_EMOJI: + case UCHAR_EMOJI_KEYCAP_SEQUENCE: + case UCHAR_RGI_EMOJI_MODIFIER_SEQUENCE: + case UCHAR_RGI_EMOJI_FLAG_SEQUENCE: + case UCHAR_RGI_EMOJI_TAG_SEQUENCE: + case UCHAR_RGI_EMOJI_ZWJ_SEQUENCE: + case UCHAR_RGI_EMOJI: + return true; default: break; } @@ -2015,31 +2108,34 @@ bool RegExpParserImpl::ParsePropertyClassName(ZoneVector* name_1, template bool RegExpParserImpl::AddPropertyClassRange( - ZoneList* add_to, bool negate, + ZoneList* add_to_ranges, + CharacterClassStrings* add_to_strings, bool negate, const ZoneVector& name_1, const ZoneVector& name_2) { - // With /vi, we need to apply case folding to property values. - // TODO(v8:11935): Change permalink once proposal is in stage 4. - // See - // https://arai-a.github.io/ecma262-compare/snapshot.html?pr=2418#prod-maybesimplecasefolding - const bool needs_case_folding = unicode_sets() && ignore_case(); if (name_2.empty()) { // First attempt to interpret as general category property value name. const char* name = name_1.data(); if (LookupPropertyValueName(UCHAR_GENERAL_CATEGORY_MASK, name, negate, - needs_case_folding, add_to, zone())) { + add_to_ranges, add_to_strings, flags(), + zone())) { return true; } // Interpret "Any", "ASCII", and "Assigned". - if (LookupSpecialPropertyValueName(name, add_to, negate, needs_case_folding, + if (LookupSpecialPropertyValueName(name, add_to_ranges, negate, flags(), zone())) { return true; } // Then attempt to interpret as binary property name with value name 'Y'. UProperty property = u_getPropertyEnum(name); - if (!IsSupportedBinaryProperty(property)) return false; + if (!IsSupportedBinaryProperty(property, unicode_sets())) return false; if (!IsExactPropertyAlias(name, property)) return false; + // Negation of properties with strings is not allowed. + // TODO(v8:11935): Change permalink once proposal is in stage 4. + // See + // https://arai-a.github.io/ecma262-compare/snapshot.html?pr=2418#sec-static-semantics-maycontainstrings + if (negate && IsBinaryPropertyOfStrings(property)) return false; return LookupPropertyValueName(property, negate ? "N" : "Y", false, - needs_case_folding, add_to, zone()); + add_to_ranges, add_to_strings, flags(), + zone()); } else { // Both property name and value name are specified. Attempt to interpret // the property name as enumerated property. @@ -2054,8 +2150,8 @@ bool RegExpParserImpl::AddPropertyClassRange( property != UCHAR_SCRIPT_EXTENSIONS) { return false; } - return LookupPropertyValueName(property, value_name, negate, - needs_case_folding, add_to, zone()); + return LookupPropertyValueName(property, value_name, negate, add_to_ranges, + add_to_strings, flags(), zone()); } } @@ -2069,7 +2165,8 @@ bool RegExpParserImpl::ParsePropertyClassName(ZoneVector* name_1, template bool RegExpParserImpl::AddPropertyClassRange( - ZoneList* add_to, bool negate, + ZoneList* add_to_ranges, + CharacterClassStrings* add_to_strings, bool negate, const ZoneVector& name_1, const ZoneVector& name_2) { return false; } @@ -2345,8 +2442,9 @@ void RegExpParserImpl::ParseClassEscape( static constexpr InClassEscapeState kInClassEscape = InClassEscapeState::kInClass; - *is_class_escape = TryParseCharacterClassEscape( - next, kInClassEscape, ranges, zone, add_unicode_case_equivalents); + *is_class_escape = + TryParseCharacterClassEscape(next, kInClassEscape, ranges, nullptr, zone, + add_unicode_case_equivalents); if (*is_class_escape) return; bool dummy = false; // Unused. @@ -2357,8 +2455,8 @@ void RegExpParserImpl::ParseClassEscape( template bool RegExpParserImpl::TryParseCharacterClassEscape( base::uc32 next, InClassEscapeState in_class_escape_state, - ZoneList* ranges, Zone* zone, - bool add_unicode_case_equivalents) { + ZoneList* ranges, CharacterClassStrings* strings, + Zone* zone, bool add_unicode_case_equivalents) { DCHECK_EQ(current(), '\\'); DCHECK_EQ(Next(), next); @@ -2382,7 +2480,7 @@ bool RegExpParserImpl::TryParseCharacterClassEscape( ZoneVector name_1(zone); ZoneVector name_2(zone); if (!ParsePropertyClassName(&name_1, &name_2) || - !AddPropertyClassRange(ranges, negate, name_1, name_2)) { + !AddPropertyClassRange(ranges, strings, negate, name_1, name_2)) { ReportError(in_class_escape_state == InClassEscapeState::kInClass ? RegExpError::kInvalidClassPropertyName : RegExpError::kInvalidPropertyName); @@ -2521,8 +2619,8 @@ RegExpTree* RegExpParserImpl::ParseClassSetOperand( static constexpr InClassEscapeState kInClassEscape = InClassEscapeState::kInClass; const bool add_unicode_case_equivalents = ignore_case(); - if (TryParseCharacterClassEscape(next, kInClassEscape, ranges, zone(), - add_unicode_case_equivalents)) { + if (TryParseCharacterClassEscape(next, kInClassEscape, ranges, strings, + zone(), add_unicode_case_equivalents)) { *type_out = ClassSetOperandType::kCharacterClassEscape; return nullptr; } diff --git a/test/test262/test262.status b/test/test262/test262.status index be60b2f8e46..48d24548df4 100644 --- a/v8/test/test262/test262.status +++ b/v8/test/test262/test262.status @@ -294,70 +294,6 @@ # See also https://github.com/tc39/test262/issues/3380 'built-ins/TypedArray/prototype/map/callbackfn-resize': [FAIL], - # https://bugs.chromium.org/p/v8/issues/detail?id=11935 - # regexp-v-flag not yet fully implemented. - 'built-ins/RegExp/property-escapes/generated/strings/Basic_Emoji': [SKIP], - 'built-ins/RegExp/property-escapes/generated/strings/Basic_Emoji-negative-CharacterClass': [SKIP], - 'built-ins/RegExp/property-escapes/generated/strings/Basic_Emoji-negative-P': [SKIP], - 'built-ins/RegExp/property-escapes/generated/strings/Basic_Emoji-negative-u': [SKIP], - 'built-ins/RegExp/property-escapes/generated/strings/Emoji_Keycap_Sequence': [SKIP], - 'built-ins/RegExp/property-escapes/generated/strings/Emoji_Keycap_Sequence-negative-CharacterClass': [SKIP], - 'built-ins/RegExp/property-escapes/generated/strings/Emoji_Keycap_Sequence-negative-P': [SKIP], - 'built-ins/RegExp/property-escapes/generated/strings/Emoji_Keycap_Sequence-negative-u': [SKIP], - 'built-ins/RegExp/property-escapes/generated/strings/RGI_Emoji': [SKIP], - 'built-ins/RegExp/property-escapes/generated/strings/RGI_Emoji-negative-CharacterClass': [SKIP], - 'built-ins/RegExp/property-escapes/generated/strings/RGI_Emoji-negative-P': [SKIP], - 'built-ins/RegExp/property-escapes/generated/strings/RGI_Emoji-negative-u': [SKIP], - 'built-ins/RegExp/property-escapes/generated/strings/RGI_Emoji_Flag_Sequence': [SKIP], - 'built-ins/RegExp/property-escapes/generated/strings/RGI_Emoji_Flag_Sequence-negative-CharacterClass': [SKIP], - 'built-ins/RegExp/property-escapes/generated/strings/RGI_Emoji_Flag_Sequence-negative-P': [SKIP], - 'built-ins/RegExp/property-escapes/generated/strings/RGI_Emoji_Flag_Sequence-negative-u': [SKIP], - 'built-ins/RegExp/property-escapes/generated/strings/RGI_Emoji_Modifier_Sequence': [SKIP], - 'built-ins/RegExp/property-escapes/generated/strings/RGI_Emoji_Modifier_Sequence-negative-CharacterClass': [SKIP], - 'built-ins/RegExp/property-escapes/generated/strings/RGI_Emoji_Modifier_Sequence-negative-P': [SKIP], - 'built-ins/RegExp/property-escapes/generated/strings/RGI_Emoji_Modifier_Sequence-negative-u': [SKIP], - 'built-ins/RegExp/property-escapes/generated/strings/RGI_Emoji_Tag_Sequence': [SKIP], - 'built-ins/RegExp/property-escapes/generated/strings/RGI_Emoji_Tag_Sequence-negative-CharacterClass': [SKIP], - 'built-ins/RegExp/property-escapes/generated/strings/RGI_Emoji_Tag_Sequence-negative-P': [SKIP], - 'built-ins/RegExp/property-escapes/generated/strings/RGI_Emoji_Tag_Sequence-negative-u': [SKIP], - 'built-ins/RegExp/property-escapes/generated/strings/RGI_Emoji_ZWJ_Sequence': [SKIP], - 'built-ins/RegExp/property-escapes/generated/strings/RGI_Emoji_ZWJ_Sequence-negative-CharacterClass': [SKIP], - 'built-ins/RegExp/property-escapes/generated/strings/RGI_Emoji_ZWJ_Sequence-negative-P': [SKIP], - 'built-ins/RegExp/property-escapes/generated/strings/RGI_Emoji_ZWJ_Sequence-negative-u': [SKIP], - 'built-ins/RegExp/unicodeSets/generated/character-class-difference-property-of-strings-escape': [SKIP], - 'built-ins/RegExp/unicodeSets/generated/character-class-escape-difference-property-of-strings-escape': [SKIP], - 'built-ins/RegExp/unicodeSets/generated/character-class-escape-intersection-property-of-strings-escape': [SKIP], - 'built-ins/RegExp/unicodeSets/generated/character-class-escape-union-property-of-strings-escape': [SKIP], - 'built-ins/RegExp/unicodeSets/generated/character-class-intersection-property-of-strings-escape': [SKIP], - 'built-ins/RegExp/unicodeSets/generated/character-class-union-property-of-strings-escape': [SKIP], - 'built-ins/RegExp/unicodeSets/generated/character-difference-property-of-strings-escape': [SKIP], - 'built-ins/RegExp/unicodeSets/generated/character-intersection-property-of-strings-escape': [SKIP], - 'built-ins/RegExp/unicodeSets/generated/character-property-escape-difference-property-of-strings-escape': [SKIP], - 'built-ins/RegExp/unicodeSets/generated/character-property-escape-intersection-property-of-strings-escape': [SKIP], - 'built-ins/RegExp/unicodeSets/generated/character-property-escape-union-property-of-strings-escape': [SKIP], - 'built-ins/RegExp/unicodeSets/generated/character-union-property-of-strings-escape': [SKIP], - 'built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-difference-character-class-escape': [SKIP], - 'built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-difference-character-class': [SKIP], - 'built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-difference-character': [SKIP], - 'built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-difference-character-property-escape': [SKIP], - 'built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-difference-property-of-strings-escape': [SKIP], - 'built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-difference-string-literal': [SKIP], - 'built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-intersection-character-class-escape': [SKIP], - 'built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-intersection-character-class': [SKIP], - 'built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-intersection-character': [SKIP], - 'built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-intersection-character-property-escape': [SKIP], - 'built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-intersection-property-of-strings-escape': [SKIP], - 'built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-intersection-string-literal': [SKIP], - 'built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-union-character-class-escape': [SKIP], - 'built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-union-character-class': [SKIP], - 'built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-union-character': [SKIP], - 'built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-union-character-property-escape': [SKIP], - 'built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-union-property-of-strings-escape': [SKIP], - 'built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-union-string-literal': [SKIP], - 'built-ins/RegExp/unicodeSets/generated/string-literal-difference-property-of-strings-escape': [SKIP], - 'built-ins/RegExp/unicodeSets/generated/string-literal-intersection-property-of-strings-escape': [SKIP], - 'built-ins/RegExp/unicodeSets/generated/string-literal-union-property-of-strings-escape': [SKIP], - # https://bugs.chromium.org/p/v8/issues/detail?id=13173 'built-ins/RegExp/duplicate-named-capturing-groups-syntax': [FAIL], 'built-ins/RegExp/named-groups/duplicate-names-group-property-enumeration-order': [FAIL], @@ -1011,35 +947,68 @@ 'built-ins/RegExp/property-escapes/*': [SKIP], 'built-ins/RegExp/named-groups/unicode-property-names': [SKIP], 'built-ins/RegExp/named-groups/unicode-property-names-valid': [SKIP], - 'built-ins/RegExp/named-groups/non-unicode-property-names-valid': [FAIL], + 'built-ins/RegExp/named-groups/non-unicode-property-names-valid': [SKIP], 'built-ins/RegExp/match-indices/indices-array-unicode-property-names': [SKIP], - 'built-ins/RegExp/unicodeSets/generated/character-class-difference-character-property-escape': [PASS,FAIL], - 'built-ins/RegExp/unicodeSets/generated/character-class-escape-difference-character-property-escape': [PASS,FAIL], - 'built-ins/RegExp/unicodeSets/generated/character-class-escape-union-character-property-escape': [PASS,FAIL], - 'built-ins/RegExp/unicodeSets/generated/character-class-escape-intersection-character-property-escape': [PASS,FAIL], - 'built-ins/RegExp/unicodeSets/generated/character-class-intersection-character-property-escape': [PASS,FAIL], - 'built-ins/RegExp/unicodeSets/generated/character-class-union-character-property-escape': [PASS,FAIL], - 'built-ins/RegExp/unicodeSets/generated/character-difference-character-property-escape': [PASS,FAIL], - 'built-ins/RegExp/unicodeSets/generated/character-intersection-character-property-escape': [PASS,FAIL], - 'built-ins/RegExp/unicodeSets/generated/character-property-escape-intersection-character-class-escape': [PASS,FAIL], - 'built-ins/RegExp/unicodeSets/generated/character-property-escape-intersection-character-class': [PASS,FAIL], - 'built-ins/RegExp/unicodeSets/generated/character-property-escape-intersection-character-property-escape': [PASS,FAIL], - 'built-ins/RegExp/unicodeSets/generated/character-property-escape-intersection-character': [PASS,FAIL], - 'built-ins/RegExp/unicodeSets/generated/character-property-escape-intersection-string-literal': [PASS,FAIL], - 'built-ins/RegExp/unicodeSets/generated/character-property-escape-difference-character-class-escape': [PASS,FAIL], - 'built-ins/RegExp/unicodeSets/generated/character-property-escape-difference-character-class': [PASS,FAIL], - 'built-ins/RegExp/unicodeSets/generated/character-property-escape-difference-character-property-escape': [PASS,FAIL], - 'built-ins/RegExp/unicodeSets/generated/character-property-escape-difference-character': [PASS,FAIL], - 'built-ins/RegExp/unicodeSets/generated/character-property-escape-difference-string-literal': [PASS,FAIL], - 'built-ins/RegExp/unicodeSets/generated/character-property-escape-union-character-class-escape': [PASS,FAIL], - 'built-ins/RegExp/unicodeSets/generated/character-property-escape-union-character-class': [PASS,FAIL], - 'built-ins/RegExp/unicodeSets/generated/character-property-escape-union-character-property-escape': [PASS,FAIL], - 'built-ins/RegExp/unicodeSets/generated/character-property-escape-union-character': [PASS,FAIL], - 'built-ins/RegExp/unicodeSets/generated/character-property-escape-union-string-literal': [PASS,FAIL], - 'built-ins/RegExp/unicodeSets/generated/character-union-character-property-escape': [PASS,FAIL], - 'built-ins/RegExp/unicodeSets/generated/string-literal-difference-character-property-escape': [PASS,FAIL], - 'built-ins/RegExp/unicodeSets/generated/string-literal-intersection-character-property-escape': [PASS,FAIL], - 'built-ins/RegExp/unicodeSets/generated/string-literal-union-character-property-escape': [PASS,FAIL], + 'built-ins/RegExp/unicodeSets/generated/character-class-difference-character-property-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/character-class-difference-property-of-strings-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/character-class-escape-difference-character-property-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/character-class-escape-difference-property-of-strings-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/character-class-escape-intersection-character-property-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/character-class-escape-intersection-property-of-strings-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/character-class-escape-union-character-property-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/character-class-escape-union-property-of-strings-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/character-class-intersection-character-property-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/character-class-intersection-property-of-strings-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/character-class-union-character-property-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/character-class-union-property-of-strings-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/character-difference-character-property-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/character-difference-property-of-strings-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/character-intersection-character-property-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/character-intersection-property-of-strings-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/character-property-escape-difference-character-class-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/character-property-escape-difference-character-class': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/character-property-escape-difference-character-property-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/character-property-escape-difference-character': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/character-property-escape-difference-property-of-strings-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/character-property-escape-difference-string-literal': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/character-property-escape-intersection-character-class-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/character-property-escape-intersection-character-class': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/character-property-escape-intersection-character-property-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/character-property-escape-intersection-character': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/character-property-escape-intersection-property-of-strings-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/character-property-escape-intersection-string-literal': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/character-property-escape-union-character-class-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/character-property-escape-union-character-class': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/character-property-escape-union-character-property-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/character-property-escape-union-character': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/character-property-escape-union-property-of-strings-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/character-property-escape-union-string-literal': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/character-union-character-property-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/character-union-property-of-strings-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-difference-character-class-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-difference-character-class': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-difference-character': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-difference-character-property-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-difference-property-of-strings-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-difference-string-literal': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-intersection-character-class-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-intersection-character-class': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-intersection-character': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-intersection-character-property-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-intersection-property-of-strings-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-intersection-string-literal': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-union-character-class-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-union-character-class': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-union-character': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-union-character-property-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-union-property-of-strings-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/property-of-strings-escape-union-string-literal': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/string-literal-difference-character-property-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/string-literal-difference-property-of-strings-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/string-literal-intersection-character-property-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/string-literal-intersection-property-of-strings-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/string-literal-union-character-property-escape': [SKIP], + 'built-ins/RegExp/unicodeSets/generated/string-literal-union-property-of-strings-escape': [SKIP], # Unicode in identifiers. 'language/identifiers/part-unicode-*': [FAIL],