Changeset 245926 in webkit
- Timestamp:
- May 30, 2019, 5:30:17 PM (7 years ago)
- Location:
- branches/safari-607-branch
- Files:
-
- 2 added
- 7 edited
-
JSTests/ChangeLog (modified) (1 diff)
-
JSTests/stress/regexp-many-named-sequential-capture-groups.js (added)
-
JSTests/stress/regexp-many-unnamed-sequential-capture-groups.js (added)
-
Source/JavaScriptCore/ChangeLog (modified) (1 diff)
-
Source/JavaScriptCore/runtime/MatchResult.h (modified) (3 diffs)
-
Source/JavaScriptCore/runtime/RegExpInlines.h (modified) (3 diffs)
-
Source/JavaScriptCore/runtime/VM.h (modified) (1 diff)
-
Source/JavaScriptCore/yarr/YarrJIT.cpp (modified) (1 diff)
-
Source/JavaScriptCore/yarr/YarrJIT.h (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/safari-607-branch/JSTests/ChangeLog
r245919 r245926 1 2019-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 1 49 2019-05-30 Kocsen Chung <kocsen_chung@apple.com> 2 50 -
branches/safari-607-branch/Source/JavaScriptCore/ChangeLog
r245919 r245926 1 2019-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 1 63 2019-05-30 Kocsen Chung <kocsen_chung@apple.com> 2 64 -
branches/safari-607-branch/Source/JavaScriptCore/runtime/MatchResult.h
r218794 r245926 31 31 namespace JSC { 32 32 33 typedef uint64_t EncodedMatchResult; 33 struct MatchResult; 34 #if CPU(ARM64) || CPU(X86_64) 35 using EncodedMatchResult = MatchResult; 36 #else 37 using EncodedMatchResult = uint64_t; 38 #endif 34 39 35 40 struct MatchResult { … … 46 51 } 47 52 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) 49 57 { 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;60 58 } 59 #endif 61 60 62 61 ALWAYS_INLINE static MatchResult failed() … … 81 80 }; 82 81 82 static_assert(sizeof(MatchResult) == sizeof(EncodedMatchResult), "Match result and EncodedMatchResult should be the same size"); 83 83 84 } // namespace JSC -
branches/safari-607-branch/Source/JavaScriptCore/runtime/RegExpInlines.h
r237763 r245926 86 86 } 87 87 88 #if ENABLE(YARR_JIT_ALL_PARENS_EXPRESSIONS)89 88 class PatternContextBufferHolder { 89 WTF_FORBID_HEAP_ALLOCATION; 90 90 public: 91 91 PatternContextBufferHolder(VM& vm, bool needBuffer) 92 92 : m_vm(vm) 93 , m_needBuffer(needBuffer)94 93 { 95 if (m_needBuffer) { 94 #if ENABLE(YARR_JIT_ALL_PARENS_EXPRESSIONS) 95 if (needBuffer) 96 96 m_buffer = m_vm.acquireRegExpPatternContexBuffer(); 97 m_size = VM::patternContextBufferSize; 98 } else { 99 m_buffer = nullptr; 100 m_size = 0; 101 } 97 #endif 98 102 99 } 103 100 104 101 ~PatternContextBufferHolder() 105 102 { 106 if (m_needBuffer) 103 #if ENABLE(YARR_JIT_ALL_PARENS_EXPRESSIONS) 104 if (buffer()) 107 105 m_vm.releaseRegExpPatternContexBuffer(); 106 #else 107 UNUSED_PARAM(m_vm); 108 #endif 108 109 } 109 110 110 111 void* buffer() { return m_buffer; } 111 unsigned size() { return m_size; }112 unsigned size() { return buffer() ? VM::patternContextBufferSize : 0; } 112 113 113 114 private: 114 115 VM& m_vm; 115 bool m_needBuffer;116 116 void* m_buffer; 117 unsigned m_size;118 117 }; 119 #endif120 118 121 119 ALWAYS_INLINE void RegExp::compileIfNecessary(VM& vm, Yarr::YarrCharSize charSize) … … 157 155 if (m_state == JITCode) { 158 156 { 159 #if ENABLE(YARR_JIT_ALL_PARENS_EXPRESSIONS) 157 ASSERT(m_regExpJITCode); 160 158 PatternContextBufferHolder patternContextBufferHolder(vm, m_regExpJITCode.usesPatternContextBuffer()); 161 159 162 #define EXTRA_JIT_PARAMS , patternContextBufferHolder.buffer(), patternContextBufferHolder.size()163 #else164 #define EXTRA_JIT_PARAMS165 #endif166 167 160 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; 169 162 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; 173 164 } 174 165 … … 278 269 if (m_state == JITCode) { 279 270 { 280 #if ENABLE(YARR_JIT_ALL_PARENS_EXPRESSIONS) 271 ASSERT(m_regExpJITCode); 281 272 PatternContextBufferHolder patternContextBufferHolder(vm, m_regExpJITCode.usesPatternContextBuffer()); 282 283 #define EXTRA_JIT_PARAMS , patternContextBufferHolder.buffer(), patternContextBufferHolder.size()284 #else285 #define EXTRA_JIT_PARAMS286 #endif287 288 273 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()); 290 275 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()); 294 277 } 295 278 -
branches/safari-607-branch/Source/JavaScriptCore/runtime/VM.h
r240375 r245926 793 793 char* acquireRegExpPatternContexBuffer(); 794 794 void releaseRegExpPatternContexBuffer(); 795 #else 796 static constexpr size_t patternContextBufferSize = 0; // Space allocated to save nested parenthesis context 795 797 #endif 796 798 -
branches/safari-607-branch/Source/JavaScriptCore/yarr/YarrJIT.cpp
r243571 r245926 230 230 231 231 // Check that the paren context is a reasonable size. 232 if (parenContextSize > INT16_MAX)232 if (parenContextSize > VM::patternContextBufferSize) 233 233 m_abortExecution.append(jump()); 234 234 -
branches/safari-607-branch/Source/JavaScriptCore/yarr/YarrJIT.h
r239427 r245926 39 39 #endif 40 40 41 #if ENABLE(YARR_JIT_ALL_PARENS_EXPRESSIONS)42 constexpr size_t patternContextBufferSize = 8192; // Space caller allocates to save nested parenthesis context43 #endif44 45 41 namespace JSC { 46 42 … … 61 57 62 58 class 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; 81 64 82 65 public: … … 96 79 void set16BitCodeMatchOnly(MacroAssemblerCodeRef<YarrMatchOnly16BitPtrTag> matchOnly) { m_matchOnly16 = matchOnly; } 97 80 81 bool usesPatternContextBuffer() { return m_usesPatternContextBuffer; } 98 82 #if ENABLE(YARR_JIT_ALL_PARENS_EXPRESSIONS) 99 bool usesPatternContextBuffer() { return m_usesPatternContextBuffer; }100 83 void setUsesPatternContextBuffer() { m_usesPatternContextBuffer = true; } 84 #endif 101 85 102 86 MatchResult execute(const LChar* input, unsigned start, unsigned length, int* output, void* freeParenContext, unsigned parenContextSize) … … 123 107 return MatchResult(untagCFunctionPtr<YarrJITCodeMatchOnly16, YarrMatchOnly16BitPtrTag>(m_matchOnly16.code().executableAddress())(input, start, length, 0, freeParenContext, parenContextSize)); 124 108 } 125 #else126 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 #endif150 109 151 110 #if ENABLE(REGEXP_TRACING) … … 202 161 MacroAssemblerCodeRef<YarrMatchOnly8BitPtrTag> m_matchOnly8; 203 162 MacroAssemblerCodeRef<YarrMatchOnly16BitPtrTag> m_matchOnly16; 204 #if ENABLE(YARR_JIT_ALL_PARENS_EXPRESSIONS) 205 bool m_usesPatternContextBuffer; 206 #endif 163 bool m_usesPatternContextBuffer { false }; 207 164 Optional<JITFailureReason> m_failureReason; 208 165 };
Note:
See TracChangeset
for help on using the changeset viewer.