Changeset 73124 in webkit for trunk/JavaScriptCore/runtime


Ignore:
Timestamp:
Dec 2, 2010, 5:36:45 AM (14 years ago)
Author:
[email protected]
Message:

2010-12-02 Peter Varga <[email protected]>

Reviewed by Gavin Barraclough.

Move regex parsing and fallback handling to runtime/RegExp.cpp
https://bugs.webkit.org/show_bug.cgi?id=50015

  • runtime/RegExp.cpp: (JSC::RegExp::RegExp): (JSC::RegExp::create): (JSC::RegExp::compile): (JSC::RegExp::match): (JSC::RegExp::printTraceData):
  • runtime/RegExp.h: (JSC::RegExp::pattern):
  • yarr/RegexInterpreter.cpp:
  • yarr/RegexInterpreter.h:
  • yarr/RegexJIT.cpp: (JSC::Yarr::RegexGenerator::compile): (JSC::Yarr::jitCompileRegex):
  • yarr/RegexJIT.h: (JSC::Yarr::RegexCodeBlock::RegexCodeBlock): (JSC::Yarr::RegexCodeBlock::setFallBack): (JSC::Yarr::RegexCodeBlock::isFallBack): (JSC::Yarr::executeRegex):
Location:
trunk/JavaScriptCore/runtime
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/runtime/RegExp.cpp

    r72489 r73124  
    33 *  Copyright (c) 2007, 2008 Apple Inc. All rights reserved.
    44 *  Copyright (C) 2009 Torch Mobile, Inc.
     5 *  Copyright (C) 2010 Peter Varga ([email protected]), University of Szeged
    56 *
    67 *  This library is free software; you can redistribute it and/or
     
    3031
    3132#include "yarr/RegexCompiler.h"
    32 #if ENABLE(YARR_JIT)
    3333#include "yarr/RegexJIT.h"
    34 #else
    3534#include "yarr/RegexInterpreter.h"
    36 #endif
     35#include "yarr/RegexPattern.h"
    3736
    3837namespace JSC {
     
    4140#if ENABLE(YARR_JIT)
    4241    Yarr::RegexCodeBlock m_regExpJITCode;
    43 #else
     42#endif
    4443    OwnPtr<Yarr::BytecodePattern> m_regExpBytecode;
    45 #endif
    4644};
    4745
    48 inline RegExp::RegExp(JSGlobalData* globalData, const UString& pattern, const UString& flags)
    49     : m_pattern(pattern)
     46inline RegExp::RegExp(JSGlobalData* globalData, const UString& patternString, const UString& flags)
     47    : m_patternString(patternString)
    5048    , m_flagBits(0)
    5149    , m_constructionError(0)
     
    6765            m_flagBits |= Multiline;
    6866    }
    69     compile(globalData);
     67
     68    m_state = compile(globalData);
    7069}
    7170
     
    7473}
    7574
    76 PassRefPtr<RegExp> RegExp::create(JSGlobalData* globalData, const UString& pattern, const UString& flags)
     75PassRefPtr<RegExp> RegExp::create(JSGlobalData* globalData, const UString& patternString, const UString& flags)
    7776{
    78     RefPtr<RegExp> res = adoptRef(new RegExp(globalData, pattern, flags));
     77    RefPtr<RegExp> res = adoptRef(new RegExp(globalData, patternString, flags));
    7978#if ENABLE(REGEXP_TRACING)
    8079    globalData->addRegExpToTrace(res);
     
    8382}
    8483
    85 void RegExp::compile(JSGlobalData* globalData)
     84RegExp::RegExpState RegExp::compile(JSGlobalData* globalData)
    8685{
     86    Yarr::RegexPattern pattern(ignoreCase(), multiline());
     87
     88    if ((m_constructionError = Yarr::compileRegex(m_patternString, pattern)))
     89        return ParseError;
     90
     91    m_numSubpatterns = pattern.m_numSubpatterns;
     92
    8793#if ENABLE(YARR_JIT)
    88     Yarr::jitCompileRegex(globalData, m_representation->m_regExpJITCode, m_pattern, m_numSubpatterns, m_constructionError, &globalData->m_regexAllocator, ignoreCase(), multiline());
    89 #else
    90     m_representation->m_regExpBytecode = Yarr::byteCompileRegex(m_pattern, m_numSubpatterns, m_constructionError, &globalData->m_regexAllocator, ignoreCase(), multiline());
     94    if (!pattern.m_containsBackreferences && globalData->canUseJIT()) {
     95        Yarr::jitCompileRegex(pattern, globalData, m_representation->m_regExpJITCode);
     96        if (!m_representation->m_regExpJITCode.isFallBack())
     97            return JITCode;
     98    }
    9199#endif
     100
     101    m_representation->m_regExpBytecode = Yarr::byteCompileRegex(pattern, &globalData->m_regexAllocator);
     102    return ByteCode;
    92103}
    93104
     
    104115        return -1;
    105116
    106 #if ENABLE(YARR_JIT)
    107     if (!!m_representation->m_regExpJITCode) {
    108 #else
    109     if (m_representation->m_regExpBytecode) {
    110 #endif
     117    if (m_state != ParseError) {
    111118        int offsetVectorSize = (m_numSubpatterns + 1) * 2;
    112119        int* offsetVector;
     
    127134            offsetVector[j] = -1;
    128135
     136        int result;
    129137#if ENABLE(YARR_JIT)
    130         int result = Yarr::executeRegex(m_representation->m_regExpJITCode, s.characters(), startOffset, s.length(), offsetVector);
    131 #else
    132         int result = Yarr::interpretRegex(m_representation->m_regExpBytecode.get(), s.characters(), startOffset, s.length(), offsetVector);
     138        if (m_state == JITCode)
     139            result = Yarr::executeRegex(m_representation->m_regExpJITCode, s.characters(), startOffset, s.length(), offsetVector);
     140        else
    133141#endif
     142            result = Yarr::interpretRegex(m_representation->m_regExpBytecode.get(), s.characters(), startOffset, s.length(), offsetVector);
    134143
    135144        ASSERT(result >= -1);;
     
    163172
    164173        char jitAddr[20];
    165         if (codeBlock.getFallback())
     174        if (m_state == JITCode)
    166175            sprintf(jitAddr, "fallback");
    167176        else
  • trunk/JavaScriptCore/runtime/RegExp.h

    r67146 r73124  
    4242        bool multiline() const { return m_flagBits & Multiline; }
    4343
    44         const UString& pattern() const { return m_pattern; }
     44        const UString& pattern() const { return m_patternString; }
    4545
    4646        bool isValid() const { return !m_constructionError; }
     
    5757        RegExp(JSGlobalData* globalData, const UString& pattern, const UString& flags);
    5858
    59         void compile(JSGlobalData*);
     59        enum RegExpState {
     60            ParseError,
     61            JITCode,
     62            ByteCode
     63        } m_state;
     64
     65        RegExpState compile(JSGlobalData*);
    6066
    6167        enum FlagBits { Global = 1, IgnoreCase = 2, Multiline = 4 };
    62 
    63         UString m_pattern; // FIXME: Just decompile m_regExp instead of storing this.
     68        UString m_patternString;
    6469        int m_flagBits;
    6570        const char* m_constructionError;
Note: See TracChangeset for help on using the changeset viewer.