Changeset 245586 in webkit
- Timestamp:
- May 21, 2019 10:57:11 AM (5 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JSTests/ChangeLog
r245496 r245586 1 2019-05-20 Keith Miller <keith_miller@apple.com> 2 3 Cleanup Yarr regexp code around paren contexts. 4 https://bugs.webkit.org/show_bug.cgi?id=198063 5 6 Reviewed by Yusuke Suzuki. 7 8 * stress/regexp-many-named-sequential-capture-groups.js: Added. 9 (i.s): 10 * stress/regexp-many-unnamed-sequential-capture-groups.js: Added. 11 1 12 2019-05-17 Justin Michaud <justin_michaud@apple.com> 2 13 -
trunk/Source/JavaScriptCore/ChangeLog
r245564 r245586 1 2019-05-20 Keith Miller <keith_miller@apple.com> 2 3 Cleanup Yarr regexp code around paren contexts. 4 https://bugs.webkit.org/show_bug.cgi?id=198063 5 6 Reviewed by Yusuke Suzuki. 7 8 There are three refactoring changes around paren contexts: 9 1. Make EncodedMatchResult the same type as MatchResult on X86_64 and arm64 and uint64_t elsewhere. 10 2. All function pointer types for Yarr JIT generated code reserve space for paren contexts. 11 3. initParenContextFreeList should bail based on VM::patternContextBufferSize as that's the buffer size anyway. 12 13 * runtime/MatchResult.h: 14 (JSC::MatchResult::MatchResult): 15 * runtime/RegExpInlines.h: 16 (JSC::PatternContextBufferHolder::PatternContextBufferHolder): 17 (JSC::PatternContextBufferHolder::~PatternContextBufferHolder): 18 (JSC::PatternContextBufferHolder::size): 19 (JSC::RegExp::matchInline): 20 * runtime/VM.h: 21 * yarr/YarrJIT.cpp: 22 (JSC::Yarr::YarrGenerator::initParenContextFreeList): 23 * yarr/YarrJIT.h: 24 (JSC::Yarr::YarrCodeBlock::execute): 25 1 26 2019-05-20 Tadeu Zagallo <tzagallo@apple.com> 2 27 -
trunk/Source/JavaScriptCore/runtime/MatchResult.h
r218794 r245586 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 -
trunk/Source/JavaScriptCore/runtime/RegExpInlines.h
r243642 r245586 87 87 } 88 88 89 #if ENABLE(YARR_JIT_ALL_PARENS_EXPRESSIONS)90 89 class PatternContextBufferHolder { 90 WTF_FORBID_HEAP_ALLOCATION; 91 91 public: 92 92 PatternContextBufferHolder(VM& vm, bool needBuffer) 93 93 : m_vm(vm) 94 , m_needBuffer(needBuffer)95 94 { 96 if (m_needBuffer) { 95 #if ENABLE(YARR_JIT_ALL_PARENS_EXPRESSIONS) 96 if (needBuffer) 97 97 m_buffer = m_vm.acquireRegExpPatternContexBuffer(); 98 m_size = VM::patternContextBufferSize; 99 } else { 100 m_buffer = nullptr; 101 m_size = 0; 102 } 98 #endif 99 103 100 } 104 101 105 102 ~PatternContextBufferHolder() 106 103 { 107 if (m_needBuffer) 104 #if ENABLE(YARR_JIT_ALL_PARENS_EXPRESSIONS) 105 if (buffer()) 108 106 m_vm.releaseRegExpPatternContexBuffer(); 107 #else 108 UNUSED_PARAM(m_vm); 109 #endif 109 110 } 110 111 111 112 void* buffer() { return m_buffer; } 112 unsigned size() { return m_size; }113 unsigned size() { return buffer() ? VM::patternContextBufferSize : 0; } 113 114 114 115 private: 115 116 VM& m_vm; 116 bool m_needBuffer;117 117 void* m_buffer; 118 unsigned m_size;119 118 }; 120 #endif121 119 122 120 ALWAYS_INLINE void RegExp::compileIfNecessary(VM& vm, Yarr::YarrCharSize charSize) … … 159 157 { 160 158 ASSERT(m_regExpJITCode); 161 #if ENABLE(YARR_JIT_ALL_PARENS_EXPRESSIONS)162 159 PatternContextBufferHolder patternContextBufferHolder(vm, m_regExpJITCode->usesPatternContextBuffer()); 163 160 164 #define EXTRA_JIT_PARAMS , patternContextBufferHolder.buffer(), patternContextBufferHolder.size()165 #else166 #define EXTRA_JIT_PARAMS167 #endif168 169 161 if (s.is8Bit()) 170 result = m_regExpJITCode->execute(s.characters8(), startOffset, s.length(), offsetVector EXTRA_JIT_PARAMS).start;162 result = m_regExpJITCode->execute(s.characters8(), startOffset, s.length(), offsetVector, patternContextBufferHolder.buffer(), patternContextBufferHolder.size()).start; 171 163 else 172 result = m_regExpJITCode->execute(s.characters16(), startOffset, s.length(), offsetVector EXTRA_JIT_PARAMS).start; 173 174 #undef EXTRA_JIT_PARAMS 164 result = m_regExpJITCode->execute(s.characters16(), startOffset, s.length(), offsetVector, patternContextBufferHolder.buffer(), patternContextBufferHolder.size()).start; 175 165 } 176 166 … … 285 275 { 286 276 ASSERT(m_regExpJITCode); 287 #if ENABLE(YARR_JIT_ALL_PARENS_EXPRESSIONS)288 277 PatternContextBufferHolder patternContextBufferHolder(vm, m_regExpJITCode->usesPatternContextBuffer()); 289 290 #define EXTRA_JIT_PARAMS , patternContextBufferHolder.buffer(), patternContextBufferHolder.size()291 #else292 #define EXTRA_JIT_PARAMS293 #endif294 295 278 if (s.is8Bit()) 296 result = m_regExpJITCode->execute(s.characters8(), startOffset, s.length() EXTRA_JIT_PARAMS);279 result = m_regExpJITCode->execute(s.characters8(), startOffset, s.length(), patternContextBufferHolder.buffer(), patternContextBufferHolder.size()); 297 280 else 298 result = m_regExpJITCode->execute(s.characters16(), startOffset, s.length() EXTRA_JIT_PARAMS); 299 300 #undef EXTRA_JIT_PARAMS 281 result = m_regExpJITCode->execute(s.characters16(), startOffset, s.length(), patternContextBufferHolder.buffer(), patternContextBufferHolder.size()); 301 282 } 302 283 -
trunk/Source/JavaScriptCore/runtime/VM.h
r244505 r245586 800 800 char* acquireRegExpPatternContexBuffer(); 801 801 void releaseRegExpPatternContexBuffer(); 802 #else 803 static constexpr size_t patternContextBufferSize = 0; // Space allocated to save nested parenthesis context 802 804 #endif 803 805 -
trunk/Source/JavaScriptCore/yarr/YarrJIT.cpp
r244286 r245586 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 -
trunk/Source/JavaScriptCore/yarr/YarrJIT.h
r243237 r245586 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 … … 62 58 63 59 class YarrCodeBlock { 64 #if CPU(X86_64) || CPU(ARM64) 65 #if ENABLE(YARR_JIT_ALL_PARENS_EXPRESSIONS) 66 typedef MatchResult (*YarrJITCode8)(const LChar* input, unsigned start, unsigned length, int* output, void* freeParenContext, unsigned parenContextSize) YARR_CALL; 67 typedef MatchResult (*YarrJITCode16)(const UChar* input, unsigned start, unsigned length, int* output, void* freeParenContext, unsigned parenContextSize) YARR_CALL; 68 typedef MatchResult (*YarrJITCodeMatchOnly8)(const LChar* input, unsigned start, unsigned length, void*, void* freeParenContext, unsigned parenContextSize) YARR_CALL; 69 typedef MatchResult (*YarrJITCodeMatchOnly16)(const UChar* input, unsigned start, unsigned length, void*, void* freeParenContext, unsigned parenContextSize) YARR_CALL; 70 #else 71 typedef MatchResult (*YarrJITCode8)(const LChar* input, unsigned start, unsigned length, int* output) YARR_CALL; 72 typedef MatchResult (*YarrJITCode16)(const UChar* input, unsigned start, unsigned length, int* output) YARR_CALL; 73 typedef MatchResult (*YarrJITCodeMatchOnly8)(const LChar* input, unsigned start, unsigned length) YARR_CALL; 74 typedef MatchResult (*YarrJITCodeMatchOnly16)(const UChar* input, unsigned start, unsigned length) YARR_CALL; 75 #endif 76 #else 77 typedef EncodedMatchResult (*YarrJITCode8)(const LChar* input, unsigned start, unsigned length, int* output) YARR_CALL; 78 typedef EncodedMatchResult (*YarrJITCode16)(const UChar* input, unsigned start, unsigned length, int* output) YARR_CALL; 79 typedef EncodedMatchResult (*YarrJITCodeMatchOnly8)(const LChar* input, unsigned start, unsigned length) YARR_CALL; 80 typedef EncodedMatchResult (*YarrJITCodeMatchOnly16)(const UChar* input, unsigned start, unsigned length) YARR_CALL; 81 #endif 60 // 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. 61 using YarrJITCode8 = EncodedMatchResult (*)(const LChar* input, unsigned start, unsigned length, int* output, void* freeParenContext, unsigned parenContextSize) YARR_CALL; 62 using YarrJITCode16 = EncodedMatchResult (*)(const UChar* input, unsigned start, unsigned length, int* output, void* freeParenContext, unsigned parenContextSize) YARR_CALL; 63 using YarrJITCodeMatchOnly8 = EncodedMatchResult (*)(const LChar* input, unsigned start, unsigned length, void*, void* freeParenContext, unsigned parenContextSize) YARR_CALL; 64 using YarrJITCodeMatchOnly16 = EncodedMatchResult (*)(const UChar* input, unsigned start, unsigned length, void*, void* freeParenContext, unsigned parenContextSize) YARR_CALL; 82 65 83 66 public: … … 97 80 void set16BitCodeMatchOnly(MacroAssemblerCodeRef<YarrMatchOnly16BitPtrTag> matchOnly) { m_matchOnly16 = matchOnly; } 98 81 82 bool usesPatternContextBuffer() { return m_usesPatternContextBuffer; } 99 83 #if ENABLE(YARR_JIT_ALL_PARENS_EXPRESSIONS) 100 bool usesPatternContextBuffer() { return m_usesPatternContextBuffer; }101 84 void setUsesPatternContextBuffer() { m_usesPatternContextBuffer = true; } 85 #endif 102 86 103 87 MatchResult execute(const LChar* input, unsigned start, unsigned length, int* output, void* freeParenContext, unsigned parenContextSize) … … 124 108 return MatchResult(untagCFunctionPtr<YarrJITCodeMatchOnly16, YarrMatchOnly16BitPtrTag>(m_matchOnly16.code().executableAddress())(input, start, length, 0, freeParenContext, parenContextSize)); 125 109 } 126 #else127 MatchResult execute(const LChar* input, unsigned start, unsigned length, int* output)128 {129 ASSERT(has8BitCode());130 return MatchResult(reinterpret_cast<YarrJITCode8>(m_ref8.code().executableAddress())(input, start, length, output));131 }132 133 MatchResult execute(const UChar* input, unsigned start, unsigned length, int* output)134 {135 ASSERT(has16BitCode());136 return MatchResult(reinterpret_cast<YarrJITCode16>(m_ref16.code().executableAddress())(input, start, length, output));137 }138 139 MatchResult execute(const LChar* input, unsigned start, unsigned length)140 {141 ASSERT(has8BitCodeMatchOnly());142 return MatchResult(reinterpret_cast<YarrJITCodeMatchOnly8>(m_matchOnly8.code().executableAddress())(input, start, length));143 }144 145 MatchResult execute(const UChar* input, unsigned start, unsigned length)146 {147 ASSERT(has16BitCodeMatchOnly());148 return MatchResult(reinterpret_cast<YarrJITCodeMatchOnly16>(m_matchOnly16.code().executableAddress())(input, start, length));149 }150 #endif151 110 152 111 #if ENABLE(REGEXP_TRACING) … … 203 162 MacroAssemblerCodeRef<YarrMatchOnly8BitPtrTag> m_matchOnly8; 204 163 MacroAssemblerCodeRef<YarrMatchOnly16BitPtrTag> m_matchOnly16; 205 #if ENABLE(YARR_JIT_ALL_PARENS_EXPRESSIONS) 206 bool m_usesPatternContextBuffer; 207 #endif 164 bool m_usesPatternContextBuffer { false }; 208 165 Optional<JITFailureReason> m_failureReason; 209 166 };
Note: See TracChangeset
for help on using the changeset viewer.