⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 245926 in webkit


Ignore:
Timestamp:
May 30, 2019, 5:30:17 PM (7 years ago)
Author:
Alan Coon
Message:

Cherry-pick r245586. rdar://problem/51264876

Cleanup Yarr regexp code around paren contexts.
https://bugs.webkit.org/show_bug.cgi?id=198063

Reviewed by Yusuke Suzuki.

JSTests:

  • stress/regexp-many-named-sequential-capture-groups.js: Added. (i.s):
  • stress/regexp-many-unnamed-sequential-capture-groups.js: Added.

Source/JavaScriptCore:

There are three refactoring changes around paren contexts:

  1. Make EncodedMatchResult the same type as MatchResult on X86_64 and arm64 and uint64_t elsewhere.
  2. All function pointer types for Yarr JIT generated code reserve space for paren contexts.
  3. initParenContextFreeList should bail based on VM::patternContextBufferSize as that's the buffer size anyway.
  • runtime/MatchResult.h: (JSC::MatchResult::MatchResult):
  • runtime/RegExpInlines.h: (JSC::PatternContextBufferHolder::PatternContextBufferHolder): (JSC::PatternContextBufferHolder::~PatternContextBufferHolder): (JSC::PatternContextBufferHolder::size): (JSC::RegExp::matchInline):
  • runtime/VM.h:
  • yarr/YarrJIT.cpp: (JSC::Yarr::YarrGenerator::initParenContextFreeList):
  • yarr/YarrJIT.h: (JSC::Yarr::YarrCodeBlock::execute):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@245586 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Location:
branches/safari-607-branch
Files:
2 added
7 edited

Legend:

Unmodified
Added
Removed
  • branches/safari-607-branch/JSTests/ChangeLog

    r245919 r245926  
     12019-05-30  Kocsen Chung  <kocsen_chung@apple.com>
     2
     3        Cherry-pick r245586. rdar://problem/51264876
     4
     5    Cleanup Yarr regexp code around paren contexts.
     6    https://bugs.webkit.org/show_bug.cgi?id=198063
     7   
     8    Reviewed by Yusuke Suzuki.
     9   
     10    JSTests:
     11   
     12    * stress/regexp-many-named-sequential-capture-groups.js: Added.
     13    (i.s):
     14    * stress/regexp-many-unnamed-sequential-capture-groups.js: Added.
     15   
     16    Source/JavaScriptCore:
     17   
     18    There are three refactoring changes around paren contexts:
     19    1. Make EncodedMatchResult the same type as MatchResult on X86_64 and arm64 and uint64_t elsewhere.
     20    2. All function pointer types for Yarr JIT generated code reserve space for paren contexts.
     21    3. initParenContextFreeList should bail based on VM::patternContextBufferSize as that's the buffer size anyway.
     22   
     23    * runtime/MatchResult.h:
     24    (JSC::MatchResult::MatchResult):
     25    * runtime/RegExpInlines.h:
     26    (JSC::PatternContextBufferHolder::PatternContextBufferHolder):
     27    (JSC::PatternContextBufferHolder::~PatternContextBufferHolder):
     28    (JSC::PatternContextBufferHolder::size):
     29    (JSC::RegExp::matchInline):
     30    * runtime/VM.h:
     31    * yarr/YarrJIT.cpp:
     32    (JSC::Yarr::YarrGenerator::initParenContextFreeList):
     33    * yarr/YarrJIT.h:
     34    (JSC::Yarr::YarrCodeBlock::execute):
     35   
     36    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@245586 268f45cc-cd09-0410-ab3c-d52691b4dbfc
     37
     38    2019-05-20  Keith Miller  <keith_miller@apple.com>
     39
     40            Cleanup Yarr regexp code around paren contexts.
     41            https://bugs.webkit.org/show_bug.cgi?id=198063
     42
     43            Reviewed by Yusuke Suzuki.
     44
     45            * stress/regexp-many-named-sequential-capture-groups.js: Added.
     46            (i.s):
     47            * stress/regexp-many-unnamed-sequential-capture-groups.js: Added.
     48
    1492019-05-30  Kocsen Chung  <kocsen_chung@apple.com>
    250
  • branches/safari-607-branch/Source/JavaScriptCore/ChangeLog

    r245919 r245926  
     12019-05-30  Kocsen Chung  <kocsen_chung@apple.com>
     2
     3        Cherry-pick r245586. rdar://problem/51264876
     4
     5    Cleanup Yarr regexp code around paren contexts.
     6    https://bugs.webkit.org/show_bug.cgi?id=198063
     7   
     8    Reviewed by Yusuke Suzuki.
     9   
     10    JSTests:
     11   
     12    * stress/regexp-many-named-sequential-capture-groups.js: Added.
     13    (i.s):
     14    * stress/regexp-many-unnamed-sequential-capture-groups.js: Added.
     15   
     16    Source/JavaScriptCore:
     17   
     18    There are three refactoring changes around paren contexts:
     19    1. Make EncodedMatchResult the same type as MatchResult on X86_64 and arm64 and uint64_t elsewhere.
     20    2. All function pointer types for Yarr JIT generated code reserve space for paren contexts.
     21    3. initParenContextFreeList should bail based on VM::patternContextBufferSize as that's the buffer size anyway.
     22   
     23    * runtime/MatchResult.h:
     24    (JSC::MatchResult::MatchResult):
     25    * runtime/RegExpInlines.h:
     26    (JSC::PatternContextBufferHolder::PatternContextBufferHolder):
     27    (JSC::PatternContextBufferHolder::~PatternContextBufferHolder):
     28    (JSC::PatternContextBufferHolder::size):
     29    (JSC::RegExp::matchInline):
     30    * runtime/VM.h:
     31    * yarr/YarrJIT.cpp:
     32    (JSC::Yarr::YarrGenerator::initParenContextFreeList):
     33    * yarr/YarrJIT.h:
     34    (JSC::Yarr::YarrCodeBlock::execute):
     35   
     36    git-svn-id: https://svn.webkit.org/repository/webkit/trunk@245586 268f45cc-cd09-0410-ab3c-d52691b4dbfc
     37
     38    2019-05-20  Keith Miller  <keith_miller@apple.com>
     39
     40            Cleanup Yarr regexp code around paren contexts.
     41            https://bugs.webkit.org/show_bug.cgi?id=198063
     42
     43            Reviewed by Yusuke Suzuki.
     44
     45            There are three refactoring changes around paren contexts:
     46            1. Make EncodedMatchResult the same type as MatchResult on X86_64 and arm64 and uint64_t elsewhere.
     47            2. All function pointer types for Yarr JIT generated code reserve space for paren contexts.
     48            3. initParenContextFreeList should bail based on VM::patternContextBufferSize as that's the buffer size anyway.
     49
     50            * runtime/MatchResult.h:
     51            (JSC::MatchResult::MatchResult):
     52            * runtime/RegExpInlines.h:
     53            (JSC::PatternContextBufferHolder::PatternContextBufferHolder):
     54            (JSC::PatternContextBufferHolder::~PatternContextBufferHolder):
     55            (JSC::PatternContextBufferHolder::size):
     56            (JSC::RegExp::matchInline):
     57            * runtime/VM.h:
     58            * yarr/YarrJIT.cpp:
     59            (JSC::Yarr::YarrGenerator::initParenContextFreeList):
     60            * yarr/YarrJIT.h:
     61            (JSC::Yarr::YarrCodeBlock::execute):
     62
    1632019-05-30  Kocsen Chung  <kocsen_chung@apple.com>
    264
  • branches/safari-607-branch/Source/JavaScriptCore/runtime/MatchResult.h

    r218794 r245926  
    3131namespace JSC {
    3232
    33 typedef uint64_t EncodedMatchResult;
     33struct MatchResult;
     34#if CPU(ARM64) || CPU(X86_64)
     35using EncodedMatchResult = MatchResult;
     36#else
     37using EncodedMatchResult = uint64_t;
     38#endif
    3439
    3540struct MatchResult {
     
    4651    }
    4752
    48     explicit ALWAYS_INLINE MatchResult(EncodedMatchResult encoded)
     53#if !(CPU(ARM64) || CPU(X86_64))
     54    ALWAYS_INLINE MatchResult(EncodedMatchResult match)
     55        : start(bitwise_cast<MatchResult>(match).start)
     56        , end(bitwise_cast<MatchResult>(match).end)
    4957    {
    50         union u {
    51             uint64_t encoded;
    52             struct s {
    53                 size_t start;
    54                 size_t end;
    55             } split;
    56         } value;
    57         value.encoded = encoded;
    58         start = value.split.start;
    59         end = value.split.end;
    6058    }
     59#endif
    6160
    6261    ALWAYS_INLINE static MatchResult failed()
     
    8180};
    8281
     82static_assert(sizeof(MatchResult) == sizeof(EncodedMatchResult), "Match result and EncodedMatchResult should be the same size");
     83
    8384} // namespace JSC
  • branches/safari-607-branch/Source/JavaScriptCore/runtime/RegExpInlines.h

    r237763 r245926  
    8686}
    8787
    88 #if ENABLE(YARR_JIT_ALL_PARENS_EXPRESSIONS)
    8988class PatternContextBufferHolder {
     89    WTF_FORBID_HEAP_ALLOCATION;
    9090public:
    9191    PatternContextBufferHolder(VM& vm, bool needBuffer)
    9292        : m_vm(vm)
    93         , m_needBuffer(needBuffer)
    9493    {
    95         if (m_needBuffer) {
     94#if ENABLE(YARR_JIT_ALL_PARENS_EXPRESSIONS)
     95        if (needBuffer)
    9696            m_buffer = m_vm.acquireRegExpPatternContexBuffer();
    97             m_size = VM::patternContextBufferSize;
    98         } else {
    99             m_buffer = nullptr;
    100             m_size = 0;
    101         }
     97#endif
     98
    10299    }
    103100
    104101    ~PatternContextBufferHolder()
    105102    {
    106         if (m_needBuffer)
     103#if ENABLE(YARR_JIT_ALL_PARENS_EXPRESSIONS)
     104        if (buffer())
    107105            m_vm.releaseRegExpPatternContexBuffer();
     106#else
     107        UNUSED_PARAM(m_vm);
     108#endif
    108109    }
    109110
    110111    void* buffer() { return m_buffer; }
    111     unsigned size() { return m_size; }
     112    unsigned size() { return buffer() ? VM::patternContextBufferSize : 0; }
    112113
    113114private:
    114115    VM& m_vm;
    115     bool m_needBuffer;
    116116    void* m_buffer;
    117     unsigned m_size;
    118117};
    119 #endif
    120118
    121119ALWAYS_INLINE void RegExp::compileIfNecessary(VM& vm, Yarr::YarrCharSize charSize)
     
    157155    if (m_state == JITCode) {
    158156        {
    159 #if ENABLE(YARR_JIT_ALL_PARENS_EXPRESSIONS)
     157            ASSERT(m_regExpJITCode);
    160158            PatternContextBufferHolder patternContextBufferHolder(vm, m_regExpJITCode.usesPatternContextBuffer());
    161159
    162 #define EXTRA_JIT_PARAMS  , patternContextBufferHolder.buffer(), patternContextBufferHolder.size()
    163 #else
    164 #define EXTRA_JIT_PARAMS
    165 #endif
    166 
    167160            if (s.is8Bit())
    168                 result = m_regExpJITCode.execute(s.characters8(), startOffset, s.length(), offsetVector EXTRA_JIT_PARAMS).start;
     161                result = m_regExpJITCode.execute(s.characters8(), startOffset, s.length(), offsetVector, patternContextBufferHolder.buffer(), patternContextBufferHolder.size()).start;
    169162            else
    170                 result = m_regExpJITCode.execute(s.characters16(), startOffset, s.length(), offsetVector EXTRA_JIT_PARAMS).start;
    171 
    172 #undef EXTRA_JIT_PARAMS
     163                result = m_regExpJITCode.execute(s.characters16(), startOffset, s.length(), offsetVector, patternContextBufferHolder.buffer(), patternContextBufferHolder.size()).start;
    173164        }
    174165
     
    278269    if (m_state == JITCode) {
    279270        {
    280 #if ENABLE(YARR_JIT_ALL_PARENS_EXPRESSIONS)
     271            ASSERT(m_regExpJITCode);
    281272            PatternContextBufferHolder patternContextBufferHolder(vm, m_regExpJITCode.usesPatternContextBuffer());
    282 
    283 #define EXTRA_JIT_PARAMS  , patternContextBufferHolder.buffer(), patternContextBufferHolder.size()
    284 #else
    285 #define EXTRA_JIT_PARAMS
    286 #endif
    287 
    288273            if (s.is8Bit())
    289                 result = m_regExpJITCode.execute(s.characters8(), startOffset, s.length() EXTRA_JIT_PARAMS);
     274                result = m_regExpJITCode.execute(s.characters8(), startOffset, s.length(), patternContextBufferHolder.buffer(), patternContextBufferHolder.size());
    290275            else
    291                 result = m_regExpJITCode.execute(s.characters16(), startOffset, s.length() EXTRA_JIT_PARAMS);
    292 
    293 #undef EXTRA_JIT_PARAMS
     276                result = m_regExpJITCode.execute(s.characters16(), startOffset, s.length(), patternContextBufferHolder.buffer(), patternContextBufferHolder.size());
    294277        }
    295278
  • branches/safari-607-branch/Source/JavaScriptCore/runtime/VM.h

    r240375 r245926  
    793793    char* acquireRegExpPatternContexBuffer();
    794794    void releaseRegExpPatternContexBuffer();
     795#else
     796    static constexpr size_t patternContextBufferSize = 0; // Space allocated to save nested parenthesis context
    795797#endif
    796798
  • branches/safari-607-branch/Source/JavaScriptCore/yarr/YarrJIT.cpp

    r243571 r245926  
    230230
    231231        // Check that the paren context is a reasonable size.
    232         if (parenContextSize > INT16_MAX)
     232        if (parenContextSize > VM::patternContextBufferSize)
    233233            m_abortExecution.append(jump());
    234234
  • branches/safari-607-branch/Source/JavaScriptCore/yarr/YarrJIT.h

    r239427 r245926  
    3939#endif
    4040
    41 #if ENABLE(YARR_JIT_ALL_PARENS_EXPRESSIONS)
    42 constexpr size_t patternContextBufferSize = 8192; // Space caller allocates to save nested parenthesis context
    43 #endif
    44 
    4541namespace JSC {
    4642
     
    6157
    6258class YarrCodeBlock {
    63 #if CPU(X86_64) || CPU(ARM64)
    64 #if ENABLE(YARR_JIT_ALL_PARENS_EXPRESSIONS)
    65     typedef MatchResult (*YarrJITCode8)(const LChar* input, unsigned start, unsigned length, int* output, void* freeParenContext, unsigned parenContextSize) YARR_CALL;
    66     typedef MatchResult (*YarrJITCode16)(const UChar* input, unsigned start, unsigned length, int* output, void* freeParenContext, unsigned parenContextSize) YARR_CALL;
    67     typedef MatchResult (*YarrJITCodeMatchOnly8)(const LChar* input, unsigned start, unsigned length, void*, void* freeParenContext, unsigned parenContextSize) YARR_CALL;
    68     typedef MatchResult (*YarrJITCodeMatchOnly16)(const UChar* input, unsigned start, unsigned length, void*, void* freeParenContext, unsigned parenContextSize) YARR_CALL;
    69 #else
    70     typedef MatchResult (*YarrJITCode8)(const LChar* input, unsigned start, unsigned length, int* output) YARR_CALL;
    71     typedef MatchResult (*YarrJITCode16)(const UChar* input, unsigned start, unsigned length, int* output) YARR_CALL;
    72     typedef MatchResult (*YarrJITCodeMatchOnly8)(const LChar* input, unsigned start, unsigned length) YARR_CALL;
    73     typedef MatchResult (*YarrJITCodeMatchOnly16)(const UChar* input, unsigned start, unsigned length) YARR_CALL;
    74 #endif
    75 #else
    76     typedef EncodedMatchResult (*YarrJITCode8)(const LChar* input, unsigned start, unsigned length, int* output) YARR_CALL;
    77     typedef EncodedMatchResult (*YarrJITCode16)(const UChar* input, unsigned start, unsigned length, int* output) YARR_CALL;
    78     typedef EncodedMatchResult (*YarrJITCodeMatchOnly8)(const LChar* input, unsigned start, unsigned length) YARR_CALL;
    79     typedef EncodedMatchResult (*YarrJITCodeMatchOnly16)(const UChar* input, unsigned start, unsigned length) YARR_CALL;
    80 #endif
     59    // Technically freeParenContext and parenContextSize are only used if ENABLE(YARR_JIT_ALL_PARENS_EXPRESSIONS) is set. Fortunately, all the calling conventions we support have caller save argument registers.
     60    using YarrJITCode8 = EncodedMatchResult (*)(const LChar* input, unsigned start, unsigned length, int* output, void* freeParenContext, unsigned parenContextSize) YARR_CALL;
     61    using YarrJITCode16 = EncodedMatchResult (*)(const UChar* input, unsigned start, unsigned length, int* output, void* freeParenContext, unsigned parenContextSize) YARR_CALL;
     62    using YarrJITCodeMatchOnly8 = EncodedMatchResult (*)(const LChar* input, unsigned start, unsigned length, void*, void* freeParenContext, unsigned parenContextSize) YARR_CALL;
     63    using YarrJITCodeMatchOnly16 = EncodedMatchResult (*)(const UChar* input, unsigned start, unsigned length, void*, void* freeParenContext, unsigned parenContextSize) YARR_CALL;
    8164
    8265public:
     
    9679    void set16BitCodeMatchOnly(MacroAssemblerCodeRef<YarrMatchOnly16BitPtrTag> matchOnly) { m_matchOnly16 = matchOnly; }
    9780
     81    bool usesPatternContextBuffer() { return m_usesPatternContextBuffer; }
    9882#if ENABLE(YARR_JIT_ALL_PARENS_EXPRESSIONS)
    99     bool usesPatternContextBuffer() { return m_usesPatternContextBuffer; }
    10083    void setUsesPatternContextBuffer() { m_usesPatternContextBuffer = true; }
     84#endif
    10185
    10286    MatchResult execute(const LChar* input, unsigned start, unsigned length, int* output, void* freeParenContext, unsigned parenContextSize)
     
    123107        return MatchResult(untagCFunctionPtr<YarrJITCodeMatchOnly16, YarrMatchOnly16BitPtrTag>(m_matchOnly16.code().executableAddress())(input, start, length, 0, freeParenContext, parenContextSize));
    124108    }
    125 #else
    126     MatchResult execute(const LChar* input, unsigned start, unsigned length, int* output)
    127     {
    128         ASSERT(has8BitCode());
    129         return MatchResult(reinterpret_cast<YarrJITCode8>(m_ref8.code().executableAddress())(input, start, length, output));
    130     }
    131 
    132     MatchResult execute(const UChar* input, unsigned start, unsigned length, int* output)
    133     {
    134         ASSERT(has16BitCode());
    135         return MatchResult(reinterpret_cast<YarrJITCode16>(m_ref16.code().executableAddress())(input, start, length, output));
    136     }
    137 
    138     MatchResult execute(const LChar* input, unsigned start, unsigned length)
    139     {
    140         ASSERT(has8BitCodeMatchOnly());
    141         return MatchResult(reinterpret_cast<YarrJITCodeMatchOnly8>(m_matchOnly8.code().executableAddress())(input, start, length));
    142     }
    143 
    144     MatchResult execute(const UChar* input, unsigned start, unsigned length)
    145     {
    146         ASSERT(has16BitCodeMatchOnly());
    147         return MatchResult(reinterpret_cast<YarrJITCodeMatchOnly16>(m_matchOnly16.code().executableAddress())(input, start, length));
    148     }
    149 #endif
    150109
    151110#if ENABLE(REGEXP_TRACING)
     
    202161    MacroAssemblerCodeRef<YarrMatchOnly8BitPtrTag> m_matchOnly8;
    203162    MacroAssemblerCodeRef<YarrMatchOnly16BitPtrTag> m_matchOnly16;
    204 #if ENABLE(YARR_JIT_ALL_PARENS_EXPRESSIONS)
    205     bool m_usesPatternContextBuffer;
    206 #endif
     163    bool m_usesPatternContextBuffer { false };
    207164    Optional<JITFailureReason> m_failureReason;
    208165};
Note: See TracChangeset for help on using the changeset viewer.