Commit 3576db13 authored by barraclough@apple.com's avatar barraclough@apple.com

2009-04-22 Gavin Barraclough <barraclough@apple.com>

        Reviewed by Sam "Blackbeard" Weinig.

        Improvements to YARR JIT.  This patch expands support in three key areas:
            * Add (temporary) support for falling back to PCRE for expressions not supported.
            * Add support for x86_64 and Windows.
            * Add support for singly quantified parentheses (? and ??), alternatives within
              parentheses, and parenthetical assertions.

        * runtime/RegExp.cpp:
        (JSC::RegExp::match):
        * yarr/RegexJIT.cpp:
        (JSC::Yarr::RegexGenerator::storeToFrame):
        (JSC::Yarr::RegexGenerator::storeToFrameWithPatch):
        (JSC::Yarr::RegexGenerator::loadFromFrameAndJump):
        (JSC::Yarr::RegexGenerator::AlternativeBacktrackRecord::AlternativeBacktrackRecord):
        (JSC::Yarr::RegexGenerator::TermGenerationState::resetAlternative):
        (JSC::Yarr::RegexGenerator::TermGenerationState::resetTerm):
        (JSC::Yarr::RegexGenerator::TermGenerationState::jumpToBacktrack):
        (JSC::Yarr::RegexGenerator::TermGenerationState::plantJumpToBacktrackIfExists):
        (JSC::Yarr::RegexGenerator::TermGenerationState::addBacktrackJump):
        (JSC::Yarr::RegexGenerator::TermGenerationState::linkAlternativeBacktracks):
        (JSC::Yarr::RegexGenerator::TermGenerationState::propagateBacktrackingFrom):
        (JSC::Yarr::RegexGenerator::genertateAssertionBOL):
        (JSC::Yarr::RegexGenerator::genertateAssertionEOL):
        (JSC::Yarr::RegexGenerator::matchAssertionWordchar):
        (JSC::Yarr::RegexGenerator::genertateAssertionWordBoundary):
        (JSC::Yarr::RegexGenerator::genertatePatternCharacterSingle):
        (JSC::Yarr::RegexGenerator::genertatePatternCharacterPair):
        (JSC::Yarr::RegexGenerator::genertatePatternCharacterFixed):
        (JSC::Yarr::RegexGenerator::genertatePatternCharacterGreedy):
        (JSC::Yarr::RegexGenerator::genertatePatternCharacterNonGreedy):
        (JSC::Yarr::RegexGenerator::genertateCharacterClassSingle):
        (JSC::Yarr::RegexGenerator::genertateCharacterClassFixed):
        (JSC::Yarr::RegexGenerator::genertateCharacterClassGreedy):
        (JSC::Yarr::RegexGenerator::genertateCharacterClassNonGreedy):
        (JSC::Yarr::RegexGenerator::generateParenthesesDisjunction):
        (JSC::Yarr::RegexGenerator::generateParenthesesSingle):
        (JSC::Yarr::RegexGenerator::generateParentheticalAssertion):
        (JSC::Yarr::RegexGenerator::generateTerm):
        (JSC::Yarr::RegexGenerator::generateDisjunction):
        (JSC::Yarr::RegexGenerator::generateEnter):
        (JSC::Yarr::RegexGenerator::generateReturn):
        (JSC::Yarr::RegexGenerator::RegexGenerator):
        (JSC::Yarr::RegexGenerator::generate):
        (JSC::Yarr::RegexGenerator::compile):
        (JSC::Yarr::RegexGenerator::generationFailed):
        (JSC::Yarr::jitCompileRegex):
        (JSC::Yarr::executeRegex):
        * yarr/RegexJIT.h:
        (JSC::Yarr::RegexCodeBlock::RegexCodeBlock):
        (JSC::Yarr::RegexCodeBlock::~RegexCodeBlock):



git-svn-id: svn://svn.chromium.org/blink/trunk@42754 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 3429aa03
2009-04-22 Gavin Barraclough <barraclough@apple.com>
Reviewed by Sam "Blackbeard" Weinig.
Improvements to YARR JIT. This patch expands support in three key areas:
* Add (temporary) support for falling back to PCRE for expressions not supported.
* Add support for x86_64 and Windows.
* Add support for singly quantified parentheses (? and ??), alternatives within
parentheses, and parenthetical assertions.
* runtime/RegExp.cpp:
(JSC::RegExp::match):
* yarr/RegexJIT.cpp:
(JSC::Yarr::RegexGenerator::storeToFrame):
(JSC::Yarr::RegexGenerator::storeToFrameWithPatch):
(JSC::Yarr::RegexGenerator::loadFromFrameAndJump):
(JSC::Yarr::RegexGenerator::AlternativeBacktrackRecord::AlternativeBacktrackRecord):
(JSC::Yarr::RegexGenerator::TermGenerationState::resetAlternative):
(JSC::Yarr::RegexGenerator::TermGenerationState::resetTerm):
(JSC::Yarr::RegexGenerator::TermGenerationState::jumpToBacktrack):
(JSC::Yarr::RegexGenerator::TermGenerationState::plantJumpToBacktrackIfExists):
(JSC::Yarr::RegexGenerator::TermGenerationState::addBacktrackJump):
(JSC::Yarr::RegexGenerator::TermGenerationState::linkAlternativeBacktracks):
(JSC::Yarr::RegexGenerator::TermGenerationState::propagateBacktrackingFrom):
(JSC::Yarr::RegexGenerator::genertateAssertionBOL):
(JSC::Yarr::RegexGenerator::genertateAssertionEOL):
(JSC::Yarr::RegexGenerator::matchAssertionWordchar):
(JSC::Yarr::RegexGenerator::genertateAssertionWordBoundary):
(JSC::Yarr::RegexGenerator::genertatePatternCharacterSingle):
(JSC::Yarr::RegexGenerator::genertatePatternCharacterPair):
(JSC::Yarr::RegexGenerator::genertatePatternCharacterFixed):
(JSC::Yarr::RegexGenerator::genertatePatternCharacterGreedy):
(JSC::Yarr::RegexGenerator::genertatePatternCharacterNonGreedy):
(JSC::Yarr::RegexGenerator::genertateCharacterClassSingle):
(JSC::Yarr::RegexGenerator::genertateCharacterClassFixed):
(JSC::Yarr::RegexGenerator::genertateCharacterClassGreedy):
(JSC::Yarr::RegexGenerator::genertateCharacterClassNonGreedy):
(JSC::Yarr::RegexGenerator::generateParenthesesDisjunction):
(JSC::Yarr::RegexGenerator::generateParenthesesSingle):
(JSC::Yarr::RegexGenerator::generateParentheticalAssertion):
(JSC::Yarr::RegexGenerator::generateTerm):
(JSC::Yarr::RegexGenerator::generateDisjunction):
(JSC::Yarr::RegexGenerator::generateEnter):
(JSC::Yarr::RegexGenerator::generateReturn):
(JSC::Yarr::RegexGenerator::RegexGenerator):
(JSC::Yarr::RegexGenerator::generate):
(JSC::Yarr::RegexGenerator::compile):
(JSC::Yarr::RegexGenerator::generationFailed):
(JSC::Yarr::jitCompileRegex):
(JSC::Yarr::executeRegex):
* yarr/RegexJIT.h:
(JSC::Yarr::RegexCodeBlock::RegexCodeBlock):
(JSC::Yarr::RegexCodeBlock::~RegexCodeBlock):
2009-04-22 Sam Weinig <sam@webkit.org>
Rubber-stamped by Darin Adler.
......@@ -125,7 +125,7 @@ int RegExp::match(const UString& s, int startOffset, OwnArrayPtr<int>* ovector)
#else
if (m_regExpBytecode) {
#endif
int offsetVectorSize = (m_numSubpatterns + 1) * 2;
int offsetVectorSize = (m_numSubpatterns + 1) * 3; // FIXME: should be 2 - but adding temporary fallback to pcre.
int* offsetVector = new int [offsetVectorSize];
ASSERT(offsetVector);
for (int j = 0; j < offsetVectorSize; ++j)
......@@ -138,7 +138,7 @@ int RegExp::match(const UString& s, int startOffset, OwnArrayPtr<int>* ovector)
ovector->set(offsetVector);
#if ENABLE(YARR_JIT)
int result = Yarr::executeRegex(m_regExpJITCode, s.data(), startOffset, s.size(), offsetVector);
int result = Yarr::executeRegex(m_regExpJITCode, s.data(), startOffset, s.size(), offsetVector, offsetVectorSize);
#else
int result = Yarr::interpretRegex(m_regExpBytecode.get(), s.data(), startOffset, s.size(), offsetVector);
#endif
......
......@@ -33,6 +33,9 @@
#include "RegexPattern.h"
#include <UString.h>
#include <pcre.h>
struct JSRegExp; // temporary, remove when fallback is removed.
namespace JSC {
class JSGlobalData;
......@@ -43,15 +46,23 @@ namespace Yarr {
struct RegexCodeBlock {
void* m_jitCode;
RefPtr<ExecutablePool> m_executablePool;
JSRegExp* m_pcreFallback;
RegexCodeBlock()
: m_jitCode(0)
, m_pcreFallback(0)
{
}
~RegexCodeBlock()
{
if (m_pcreFallback)
jsRegExpFree(m_pcreFallback);
}
};
void jitCompileRegex(JSGlobalData* globalData, RegexCodeBlock& jitObject, const UString& pattern, unsigned& numSubpatterns, const char*& error, bool ignoreCase = false, bool multiline = false);
int executeRegex(RegexCodeBlock& jitObject, const UChar* input, unsigned start, unsigned length, int* output);
int executeRegex(RegexCodeBlock& jitObject, const UChar* input, unsigned start, unsigned length, int* output, int outputArraySize);
} } // namespace JSC::Yarr
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment