haikuwebkit/LayoutTests/js/regexp-dotall-expected.txt

80 lines
3.5 KiB
Plaintext
Raw Permalink Normal View History

Add support for RegExp "dotAll" flag https://bugs.webkit.org/show_bug.cgi?id=175924 Reviewed by Keith Miller. JSTests: Updated tests for new dotAll ('s' flag) changes. * es6/Proxy_internal_get_calls_RegExp.prototype.flags.js: * stress/static-getter-in-names.js: Source/JavaScriptCore: The dotAll RegExp flag, 's', changes . to match any character including line terminators. Added a the "dotAll" identifier as well as RegExp.prototype.dotAll getter. Added a new any character CharacterClass that is used to match . terms in a dotAll flags RegExp. In the YARR pattern and parsing code, changed the NewlineClassID, which was only used for '.' processing, to DotClassID. The selection of which builtin character class that DotClassID resolves to when generating the pattern is conditional on the dotAll flag. This NewlineClassID to DotClassID refactoring includes the atomBuiltInCharacterClass() in the WebCore content extensions code in the PatternParser class. As an optimization, the Yarr JIT actually doesn't perform match checks against the builtin any character CharacterClass, it merely reads the character. There is another optimization in our DotStart enclosure processing where a non-capturing regular expression in the form of .*<expression.*, with options beginning ^ and/or trailing $, match the contained expression and then look for the extents of the surrounding .*'s. When used with the dotAll flag, that processing alwys results with the beinning of the string and the end of the string. Therefore we short circuit the finding the beginning and end of the line or string with dotAll patterns. * bytecode/BytecodeDumper.cpp: (JSC::regexpToSourceString): * runtime/CommonIdentifiers.h: * runtime/RegExp.cpp: (JSC::regExpFlags): (JSC::RegExpFunctionalTestCollector::outputOneTest): * runtime/RegExp.h: * runtime/RegExpKey.h: * runtime/RegExpPrototype.cpp: (JSC::RegExpPrototype::finishCreation): (JSC::flagsString): (JSC::regExpProtoGetterDotAll): * yarr/YarrInterpreter.cpp: (JSC::Yarr::Interpreter::matchDotStarEnclosure): * yarr/YarrInterpreter.h: (JSC::Yarr::BytecodePattern::dotAll const): * yarr/YarrJIT.cpp: (JSC::Yarr::YarrGenerator::optimizeAlternative): (JSC::Yarr::YarrGenerator::generateCharacterClassOnce): (JSC::Yarr::YarrGenerator::generateCharacterClassFixed): (JSC::Yarr::YarrGenerator::generateCharacterClassGreedy): (JSC::Yarr::YarrGenerator::backtrackCharacterClassNonGreedy): (JSC::Yarr::YarrGenerator::generateDotStarEnclosure): * yarr/YarrParser.h: (JSC::Yarr::Parser::parseTokens): * yarr/YarrPattern.cpp: (JSC::Yarr::YarrPatternConstructor::atomBuiltInCharacterClass): (JSC::Yarr::YarrPatternConstructor::atomCharacterClassBuiltIn): (JSC::Yarr::YarrPatternConstructor::optimizeDotStarWrappedExpressions): (JSC::Yarr::YarrPattern::YarrPattern): (JSC::Yarr::PatternTerm::dump): (JSC::Yarr::anycharCreate): * yarr/YarrPattern.h: (JSC::Yarr::YarrPattern::reset): (JSC::Yarr::YarrPattern::anyCharacterClass): (JSC::Yarr::YarrPattern::dotAll const): Source/WebCore: Changed due to refactoring NewlineClassID to DotClassID. No new tests. No change in behavior. * contentextensions/URLFilterParser.cpp: (WebCore::ContentExtensions::PatternParser::atomBuiltInCharacterClass): LayoutTests: * js/regexp-dotall-expected.txt: Added. * js/regexp-dotall.html: Added. * js/script-tests/Object-getOwnPropertyNames.js: * js/script-tests/regexp-dotall.js: Added. New tests. * js/Object-getOwnPropertyNames-expected.txt: Updated tests for new dotAll ('s' flag) changes. Canonical link: https://commits.webkit.org/192608@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@221160 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2017-08-24 21:14:43 +00:00
Test for processing of RegExp dotAll flag
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
PASS "aaXcc".match(/.X./)[0].length is 3
PASS "aaXcc".match(/.X./s)[0].length is 3
PASS "aa\nXcc".match(/.X./) is null
PASS "aa\nXcc".match(/.X./m) is null
PASS "aa\nX\ncc".match(/.X./s)[0] is "\nX\n"
PASS "aa\nX\ncc".match(/.X./ms)[0] is "\nX\n"
PASS "aa\nXcc".match(/.*X/)[0] is "X"
PASS "aa\nXcc".match(/.*X/m)[0] is "X"
PASS "aa\nXcc".match(/.*X/s)[0] is "aa\nX"
PASS "aa\nXcc".match(/.*X/sm)[0] is "aa\nX"
PASS "aaX\ncc".match(/X.*/)[0] is "X"
PASS "aaX\ncc".match(/X.*/m)[0] is "X"
PASS "aaX\ncc".match(/X.*/s)[0] is "X\ncc"
PASS "aaX\ncc".match(/X.*/sm)[0] is "X\ncc"
PASS "aa\nX\ncc".match(/.*X.*/)[0] is "X"
PASS "aa\nX\ncc".match(/.*X.*/m)[0] is "X"
PASS "aa\nX\ncc".match(/.*X.*/s)[0] is "aa\nX\ncc"
PASS "aa\nX\ncc".match(/.*X.*/sm)[0] is "aa\nX\ncc"
PASS "aa\nXcc".match(/.*^X/) is null
PASS "aa\nXcc".match(/.*^X/m)[0] is "X"
PASS "aa\nXcc".match(/.*^X/s) is null
PASS "aa\nXcc".match(/.*^X/sm)[0] is "aa\nX"
PASS "aaX\ncc".match(/X$.*/) is null
PASS "aaX\ncc".match(/X$.*/m)[0] is "X"
PASS "aaX\ncc".match(/X$.*/s) is null
PASS "aaX\ncc".match(/X$.*/sm)[0] is "X\ncc"
PASS "aa\nX\ncc".match(/.*^X$.*/) is null
PASS "aa\nX\ncc".match(/.*^X$.*/m)[0] is "X"
PASS "aa\nX\ncc".match(/.*^X$.*/s) is null
PASS "aa\nX\ncc".match(/.*^X$.*/sm)[0] is "aa\nX\ncc"
PASS "aa\nXcc".match(/^.*X/) is null
PASS "aa\nXcc".match(/^.*X/m)[0] is "X"
PASS "aa\nXcc".match(/^.*X/s)[0] is "aa\nX"
PASS "aa\nXcc".match(/^.*X/sm)[0] is "aa\nX"
PASS "aaX\ncc".match(/X.*$/) is null
PASS "aaX\ncc".match(/X.*$/m)[0] is "X"
PASS "aaX\ncc".match(/X.*$/s)[0] is "X\ncc"
PASS "aaX\ncc".match(/X.*$/sm)[0] is "X\ncc"
PASS "aa\nX\ncc".match(/^.*X.*$/) is null
PASS "aa\nX\ncc".match(/^.*X.*$/m)[0] is "X"
PASS "aa\nX\ncc".match(/^.*X.*$/s)[0] is "aa\nX\ncc"
PASS "aa\nX\ncc".match(/^.*X.*$/sm)[0] is "aa\nX\ncc"
PASS "a\na\nX\nc\nc\n".match(/^.*X.*$/) is null
PASS "a\na\nX\nc\nc\n".match(/^.*X.*$/m)[0] is "X"
PASS "a\na\nX\nc\nc\n".match(/^.*X.*$/s)[0] is "a\na\nX\nc\nc\n"
PASS "a\na\nX\nc\nc\n".match(/^.*X.*$/sm)[0] is "a\na\nX\nc\nc\n"
PASS "a\na\nX\nc\nc\n".match(/^.*X.*$/) is null
PASS "a\na\nX\nc\nc\n".match(/^.*X.*$/m)[0] is "X"
PASS "a\na\nX\nc\nc\n".match(/^.*X.*$/s)[0] is "a\na\nX\nc\nc\n"
PASS "a\na\nX\nc\nc\n".match(/^.*X.*$/sm)[0] is "a\na\nX\nc\nc\n"
PASS "\n\n\nX".match(/.{1}X/sm)[0] is "\nX"
PASS "\n\n\nX".match(/.{1,2}X/sm)[0] is "\n\nX"
PASS "\n\n\nX".match(/.{1,3}X/sm)[0] is "\n\n\nX"
PASS "\n\n\nX".match(/.{1,4}X/sm)[0] is "\n\n\nX"
PASS "\n\n\nX".match(/.{1,2}?X/sm)[0] is "\n\nX"
PASS "\n\n\nX".match(/.{1,3}?X/sm)[0] is "\n\n\nX"
PASS "\n\n\nX".match(/.{1,4}?X/sm)[0] is "\n\n\nX"
PASS "X\n\n\nY".match(/X.{1}/sm)[0] is "X\n"
PASS "X\n\n\nY".match(/X.{1,2}/sm)[0] is "X\n\n"
PASS "X\n\n\nY".match(/X.{1,3}/sm)[0] is "X\n\n\n"
PASS "X\n\n\nY".match(/X.{1,4}/sm)[0] is "X\n\n\nY"
PASS "X\n\n\nY".match(/X.{1,2}?/sm)[0] is "X\n"
PASS "X\n\n\nY".match(/X.{1,3}?/sm)[0] is "X\n"
PASS "X\n\n\nY".match(/X.{1,4}?/sm)[0] is "X\n"
PASS "The\nquick\nbrown\nfox\njumped.".match(/.*brown.*/)[0] is "brown"
PASS "The\nquick\nbrown\nfox\njumped.".match(/.*brown.*/s)[0] is "The\nquick\nbrown\nfox\njumped."
PASS "The\nquick\nbrown\nfox\njumped.".match(/The.quick.brown.fox.jumped./) is null
PASS "The\nquick\nbrown\nfox\njumped.".match(/The.quick.brown.fox.jumped./s)[0] is "The\nquick\nbrown\nfox\njumped."
PASS /a/.dotAll is false
PASS /a/s.dotAll is true
PASS successfullyParsed is true
TEST COMPLETE