Changeset 57608 in webkit


Ignore:
Timestamp:
Apr 14, 2010 2:38:44 PM (14 years ago)
Author:
eric@webkit.org
Message:

2010-04-14 Peter Varga <pvarga@inf.u-szeged.hu>

Reviewed by Geoffrey Garen.

Move the YARR JIT fallback detection from RegexJIT.cpp to
RegexCompiler.cpp.

https://bugs.webkit.org/show_bug.cgi?id=37571

  • yarr/RegexCompiler.cpp: (JSC::Yarr::RegexPatternConstructor::atomBackReference): (JSC::Yarr::RegexPatternConstructor::quantifyAtom):
  • yarr/RegexJIT.cpp: (JSC::Yarr::RegexGenerator::generateTerm): (JSC::Yarr::RegexGenerator::RegexGenerator): (JSC::Yarr::jitCompileRegex):
  • yarr/RegexJIT.h: (JSC::Yarr::RegexCodeBlock::operator!):
  • yarr/RegexPattern.h: (JSC::Yarr::RegexPattern::RegexPattern): (JSC::Yarr::RegexPattern::reset):
Location:
trunk/JavaScriptCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/ChangeLog

    r57583 r57608  
     12010-04-14  Peter Varga  <pvarga@inf.u-szeged.hu>
     2
     3        Reviewed by Geoffrey Garen.
     4
     5        Move the YARR JIT fallback detection from RegexJIT.cpp to
     6        RegexCompiler.cpp.
     7
     8        https://bugs.webkit.org/show_bug.cgi?id=37571
     9
     10        * yarr/RegexCompiler.cpp:
     11        (JSC::Yarr::RegexPatternConstructor::atomBackReference):
     12        (JSC::Yarr::RegexPatternConstructor::quantifyAtom):
     13        * yarr/RegexJIT.cpp:
     14        (JSC::Yarr::RegexGenerator::generateTerm):
     15        (JSC::Yarr::RegexGenerator::RegexGenerator):
     16        (JSC::Yarr::jitCompileRegex):
     17        * yarr/RegexJIT.h:
     18        (JSC::Yarr::RegexCodeBlock::operator!):
     19        * yarr/RegexPattern.h:
     20        (JSC::Yarr::RegexPattern::RegexPattern):
     21        (JSC::Yarr::RegexPattern::reset):
     22
    1232010-04-14  Kent Hansen  <kent.hansen@nokia.com>
    224
  • trunk/JavaScriptCore/yarr/RegexCompiler.cpp

    r53151 r57608  
    470470    {
    471471        ASSERT(subpatternId);
     472        m_pattern.m_shouldFallBack = true;
    472473        m_pattern.m_maxBackReference = std::max(m_pattern.m_maxBackReference, subpatternId);
    473474
     
    544545            return;
    545546        }
     547
     548        if (max > 1 && term.type == PatternTerm::TypeParenthesesSubpattern)
     549            m_pattern.m_shouldFallBack = true;
    546550
    547551        if (min == 0)
  • trunk/JavaScriptCore/yarr/RegexJIT.cpp

    r55500 r57608  
    10891089
    10901090        case PatternTerm::TypeBackReference:
    1091             m_generationFailed = true;
     1091            ASSERT_NOT_REACHED();
    10921092            break;
    10931093
     
    10961096
    10971097        case PatternTerm::TypeParenthesesSubpattern:
    1098             if ((term.quantityCount == 1) && !term.parentheses.isCopy)
    1099                 generateParenthesesSingle(state);
    1100             else
    1101                 m_generationFailed = true;
     1098            ASSERT((term.quantityCount == 1) && !term.parentheses.isCopy); // must fallback to pcre before this point
     1099            generateParenthesesSingle(state);
    11021100            break;
    11031101
     
    13521350    RegexGenerator(RegexPattern& pattern)
    13531351        : m_pattern(pattern)
    1354         , m_generationFailed(false)
    13551352    {
    13561353    }
     
    13821379    }
    13831380
    1384     bool generationFailed()
    1385     {
    1386         return m_generationFailed;
    1387     }
    1388 
    13891381private:
    13901382    RegexPattern& m_pattern;
    13911383    Vector<AlternativeBacktrackRecord> m_backtrackRecords;
    1392     bool m_generationFailed;
    13931384};
    13941385
     
    14021393    numSubpatterns = pattern.m_numSubpatterns;
    14031394
    1404     RegexGenerator generator(pattern);
    1405     generator.compile(globalData, jitObject);
    1406 
    1407     if (generator.generationFailed()) {
     1395    if (pattern.m_shouldFallBack) {
    14081396        JSRegExpIgnoreCaseOption ignoreCaseOption = ignoreCase ? JSRegExpIgnoreCase : JSRegExpDoNotIgnoreCase;
    14091397        JSRegExpMultilineOption multilineOption = multiline ? JSRegExpMultiline : JSRegExpSingleLine;
    14101398        jitObject.setFallback(jsRegExpCompile(reinterpret_cast<const UChar*>(patternString.data()), patternString.size(), ignoreCaseOption, multilineOption, &numSubpatterns, &error));
     1399    } else {
     1400        RegexGenerator generator(pattern);
     1401        generator.compile(globalData, jitObject);
    14111402    }
    14121403}
  • trunk/JavaScriptCore/yarr/RegexJIT.h

    r55633 r57608  
    6767    void setFallback(JSRegExp* fallback) { m_fallback = fallback; }
    6868
    69     bool operator!() { return !m_ref.m_code.executableAddress(); }
     69    bool operator!() { return (!m_ref.m_code.executableAddress() && !m_fallback); }
    7070    void set(MacroAssembler::CodeRef ref) { m_ref = ref; }
    7171
  • trunk/JavaScriptCore/yarr/RegexPattern.h

    r55633 r57608  
    248248        , m_numSubpatterns(0)
    249249        , m_maxBackReference(0)
     250        , m_shouldFallBack(false)
    250251        , newlineCached(0)
    251252        , digitsCached(0)
     
    269270        m_maxBackReference = 0;
    270271
     272        m_shouldFallBack = false;
     273
    271274        newlineCached = 0;
    272275        digitsCached = 0;
     
    335338    unsigned m_numSubpatterns;
    336339    unsigned m_maxBackReference;
     340    bool m_shouldFallBack;
    337341    PatternDisjunction* m_body;
    338342    Vector<PatternDisjunction*, 4> m_disjunctions;
Note: See TracChangeset for help on using the changeset viewer.