Changeset 112454 in webkit for trunk/Source/JavaScriptCore
- Timestamp:
- Mar 28, 2012, 3:18:20 PM (13 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 1 added
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r112320 r112454 1 2012-03-28 Gavin Barraclough <[email protected]> 2 3 Yarr: if we're not using the output array, don't populate it! 4 https://bugs.webkit.org/show_bug.cgi?id=82519 5 6 Reviewed by Sam Weinig. 7 8 Add a new variant of the match method to RegExp that returns a MatchResult, 9 and modify YarrJIT to be able to compile code that doesn't use an output vector. 10 11 This is a 3% progression on v8-regexp. 12 13 * JavaScriptCore.xcodeproj/project.pbxproj: 14 - Moved MatchResult into its own header. 15 * assembler/AbstractMacroAssembler.h: 16 - Added missing include. 17 * runtime/MatchResult.h: Added. 18 (MatchResult::MatchResult): 19 (MatchResult): 20 (MatchResult::failed): 21 (MatchResult::operator bool): 22 (MatchResult::empty): 23 - Moved MatchResult into its own header. 24 * runtime/RegExp.cpp: 25 (JSC::RegExp::compile): 26 (JSC::RegExp::compileIfNecessary): 27 (JSC::RegExp::match): 28 - Changed due to execute & representation changes. 29 (JSC::RegExp::compileMatchOnly): 30 (JSC::RegExp::compileIfNecessaryMatchOnly): 31 - Added helper to compile MatchOnly code. 32 (JSC::RegExp::invalidateCode): 33 (JSC::RegExp::matchCompareWithInterpreter): 34 (JSC::RegExp::printTraceData): 35 - Changed due representation changes. 36 * runtime/RegExp.h: 37 (RegExp): 38 (JSC::RegExp::hasCode): 39 - Made YarrCodeBlock a member. 40 * runtime/RegExpConstructor.h: 41 (RegExpConstructor): 42 (JSC::RegExpConstructor::performMatch): 43 - Added no-ovector form. 44 * runtime/RegExpMatchesArray.cpp: 45 (JSC::RegExpMatchesArray::reifyAllProperties): 46 - Match now takes a reference to ovector, not a pointer. 47 * runtime/RegExpObject.h: 48 (JSC): 49 - Moved MatchResult into its own header. 50 * runtime/StringPrototype.cpp: 51 (JSC::stringProtoFuncSplit): 52 - Match now takes a reference to ovector, not a pointer. 53 * testRegExp.cpp: 54 (testOneRegExp): 55 - Match now takes a reference to ovector, not a pointer. 56 * yarr/YarrJIT.cpp: 57 (Yarr): 58 (YarrGenerator): 59 (JSC::Yarr::YarrGenerator::initCallFrame): 60 (JSC::Yarr::YarrGenerator::removeCallFrame): 61 (JSC::Yarr::YarrGenerator::setSubpatternStart): 62 (JSC::Yarr::YarrGenerator::setSubpatternEnd): 63 (JSC::Yarr::YarrGenerator::clearSubpatternStart): 64 (JSC::Yarr::YarrGenerator::setMatchStart): 65 (JSC::Yarr::YarrGenerator::getMatchStart): 66 - Added helper functions to intermediate access to output. 67 (JSC::Yarr::YarrGenerator::generateDotStarEnclosure): 68 (JSC::Yarr::YarrGenerator::generate): 69 (JSC::Yarr::YarrGenerator::backtrack): 70 (JSC::Yarr::YarrGenerator::generateEnter): 71 (JSC::Yarr::YarrGenerator::compile): 72 - Changed to use the new helpers, only generate subpatterns if IncludeSubpatterns. 73 (JSC::Yarr::jitCompile): 74 - Needs to template of MatchOnly or IncludeSubpatterns. 75 * yarr/YarrJIT.h: 76 (YarrCodeBlock): 77 (JSC::Yarr::YarrCodeBlock::set8BitCode): 78 (JSC::Yarr::YarrCodeBlock::set16BitCode): 79 (JSC::Yarr::YarrCodeBlock::has8BitCodeMatchOnly): 80 (JSC::Yarr::YarrCodeBlock::has16BitCodeMatchOnly): 81 (JSC::Yarr::YarrCodeBlock::set8BitCodeMatchOnly): 82 (JSC::Yarr::YarrCodeBlock::set16BitCodeMatchOnly): 83 (JSC::Yarr::YarrCodeBlock::execute): 84 (JSC::Yarr::YarrCodeBlock::clear): 85 - Added a second set of CodeRefs, so that we can compile RexExps with/without subpattern matching. 86 1 87 2012-03-27 Filip Pizlo <[email protected]> 2 88 -
trunk/Source/JavaScriptCore/JavaScriptCore.vcproj/JavaScriptCore/JavaScriptCore.def
r112177 r112454 250 250 ?lockAtomicallyInitializedStaticMutex@WTF@@YAXXZ 251 251 ?lockCount@JSLock@JSC@@SAHXZ 252 ?match@RegExp@JSC@@QAEHAAVJSGlobalData@2@ABVUString@2@I PAV?$Vector@H$0CA@@WTF@@@Z252 ?match@RegExp@JSC@@QAEHAAVJSGlobalData@2@ABVUString@2@IAAV?$Vector@H$0CA@@WTF@@@Z 253 253 ?materializePropertyMap@Structure@JSC@@AAEXAAVJSGlobalData@2@@Z 254 254 ?monotonicallyIncreasingTime@WTF@@YANXZ -
trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
r112313 r112454 338 338 8604F505143CE1C200B295F5 /* JSGlobalThis.h in Headers */ = {isa = PBXBuildFile; fileRef = 8604F503143CE1C100B295F5 /* JSGlobalThis.h */; settings = {ATTRIBUTES = (Private, ); }; }; 339 339 860BD801148EA6F200112B2F /* Intrinsic.h in Headers */ = {isa = PBXBuildFile; fileRef = 86BF642A148DB2B5004DE36A /* Intrinsic.h */; settings = {ATTRIBUTES = (Private, ); }; }; 340 8612E4CD152389EC00C836BE /* MatchResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 8612E4CB1522918400C836BE /* MatchResult.h */; settings = {ATTRIBUTES = (Private, ); }; }; 340 341 863B23E00FC6118900703AA4 /* MacroAssemblerCodeRef.h in Headers */ = {isa = PBXBuildFile; fileRef = 863B23DF0FC60E6200703AA4 /* MacroAssemblerCodeRef.h */; settings = {ATTRIBUTES = (Private, ); }; }; 341 342 863C6D9C1521111A00585E4E /* YarrCanonicalizeUCS2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 863C6D981521111200585E4E /* YarrCanonicalizeUCS2.cpp */; }; … … 351 352 86704B8512DBA33700A9FE7B /* YarrInterpreter.h in Headers */ = {isa = PBXBuildFile; fileRef = 86704B7E12DBA33700A9FE7B /* YarrInterpreter.h */; settings = {ATTRIBUTES = (Private, ); }; }; 352 353 86704B8612DBA33700A9FE7B /* YarrJIT.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 86704B7F12DBA33700A9FE7B /* YarrJIT.cpp */; }; 353 86704B8712DBA33700A9FE7B /* YarrJIT.h in Headers */ = {isa = PBXBuildFile; fileRef = 86704B8012DBA33700A9FE7B /* YarrJIT.h */; settings = {ATTRIBUTES = ( ); }; };354 86704B8712DBA33700A9FE7B /* YarrJIT.h in Headers */ = {isa = PBXBuildFile; fileRef = 86704B8012DBA33700A9FE7B /* YarrJIT.h */; settings = {ATTRIBUTES = (Private, ); }; }; 354 355 86704B8812DBA33700A9FE7B /* YarrParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 86704B8112DBA33700A9FE7B /* YarrParser.h */; settings = {ATTRIBUTES = (); }; }; 355 356 86704B8912DBA33700A9FE7B /* YarrPattern.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 86704B8212DBA33700A9FE7B /* YarrPattern.cpp */; }; … … 464 465 A75706DE118A2BCF0057F88F /* JITArithmetic32_64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A75706DD118A2BCF0057F88F /* JITArithmetic32_64.cpp */; }; 465 466 A766B44F0EE8DCD1009518CA /* ExecutableAllocator.h in Headers */ = {isa = PBXBuildFile; fileRef = A7B48DB50EE74CFC00DCBDB6 /* ExecutableAllocator.h */; settings = {ATTRIBUTES = (Private, ); }; }; 466 A76C51761182748D00715B05 /* JSInterfaceJIT.h in Headers */ = {isa = PBXBuildFile; fileRef = A76C51741182748D00715B05 /* JSInterfaceJIT.h */; };467 A76C51761182748D00715B05 /* JSInterfaceJIT.h in Headers */ = {isa = PBXBuildFile; fileRef = A76C51741182748D00715B05 /* JSInterfaceJIT.h */; settings = {ATTRIBUTES = (Private, ); }; }; 467 468 A76F54A313B28AAB00EF2BCE /* JITWriteBarrier.h in Headers */ = {isa = PBXBuildFile; fileRef = A76F54A213B28AAB00EF2BCE /* JITWriteBarrier.h */; }; 468 469 A781E359141970C700094D90 /* StorageBarrier.h in Headers */ = {isa = PBXBuildFile; fileRef = A781E358141970C700094D90 /* StorageBarrier.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 977 978 8604F4F2143A6C4400B295F5 /* ChangeLog */ = {isa = PBXFileReference; lastKnownFileType = text; path = ChangeLog; sourceTree = "<group>"; }; 978 979 8604F503143CE1C100B295F5 /* JSGlobalThis.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSGlobalThis.h; sourceTree = "<group>"; }; 980 8612E4CB1522918400C836BE /* MatchResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MatchResult.h; sourceTree = "<group>"; }; 979 981 863B23DF0FC60E6200703AA4 /* MacroAssemblerCodeRef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MacroAssemblerCodeRef.h; sourceTree = "<group>"; }; 980 982 863C6D981521111200585E4E /* YarrCanonicalizeUCS2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = YarrCanonicalizeUCS2.cpp; path = yarr/YarrCanonicalizeUCS2.cpp; sourceTree = "<group>"; }; … … 1486 1488 isa = PBXGroup; 1487 1489 children = ( 1488 0F0776BD14FF002800102332 /* JITCompilationEffort.h */,1489 0F4680D014BBC5F800BFE272 /* HostCallReturnValue.cpp */,1490 0F4680D114BBC5F800BFE272 /* HostCallReturnValue.h */,1491 0F46807F14BA572700BFE272 /* JITExceptions.cpp */,1492 0F46808014BA572700BFE272 /* JITExceptions.h */,1493 1490 0FD82E37141AB14200179C94 /* CompactJITCodeMap.h */, 1494 1491 A7B48DB60EE74CFC00DCBDB6 /* ExecutableAllocator.cpp */, 1495 1492 A7B48DB50EE74CFC00DCBDB6 /* ExecutableAllocator.h */, 1496 1493 86DB64630F95C6FC00D7D921 /* ExecutableAllocatorFixedVMPool.cpp */, 1494 0F4680D014BBC5F800BFE272 /* HostCallReturnValue.cpp */, 1495 0F4680D114BBC5F800BFE272 /* HostCallReturnValue.h */, 1497 1496 1429D92D0ED22D7000B89619 /* JIT.cpp */, 1498 1497 1429D92E0ED22D7000B89619 /* JIT.h */, … … 1502 1501 146FE51111A710430087AE66 /* JITCall32_64.cpp */, 1503 1502 86CCEFDD0F413F8900FD7F9E /* JITCode.h */, 1503 0F0776BD14FF002800102332 /* JITCompilationEffort.h */, 1504 1504 0F21C26614BE5F5E00ADC64B /* JITDriver.h */, 1505 0F46807F14BA572700BFE272 /* JITExceptions.cpp */, 1506 0F46808014BA572700BFE272 /* JITExceptions.h */, 1505 1507 86CC85A00EE79A4700288682 /* JITInlineMethods.h */, 1506 1508 BCDD51E90FB8DF74004A8BDC /* JITOpcodes.cpp */, … … 1852 1854 F692A8680255597D01FF60F7 /* Lookup.cpp */, 1853 1855 F692A8690255597D01FF60F7 /* Lookup.h */, 1856 8612E4CB1522918400C836BE /* MatchResult.h */, 1854 1857 F692A86A0255597D01FF60F7 /* MathObject.cpp */, 1855 1858 F692A86B0255597D01FF60F7 /* MathObject.h */, … … 2513 2516 0F2BDC21151E803B00CD8910 /* DFGInsertionSet.h in Headers */, 2514 2517 0F2BDC2C151FDE9100CD8910 /* Operands.h in Headers */, 2518 8612E4CD152389EC00C836BE /* MatchResult.h in Headers */, 2515 2519 ); 2516 2520 runOnlyForDeploymentPostprocessing = 0; -
trunk/Source/JavaScriptCore/assembler/AbstractMacroAssembler.h
r112192 r112454 27 27 #define AbstractMacroAssembler_h 28 28 29 #include "AssemblerBuffer.h" 29 30 #include "CodeLocation.h" 30 31 #include "MacroAssemblerCodeRef.h" -
trunk/Source/JavaScriptCore/runtime/RegExp.cpp
r111889 r112454 219 219 220 220 struct RegExpRepresentation { 221 #if ENABLE(YARR_JIT)222 Yarr::YarrCodeBlock m_regExpJITCode;223 #endif224 OwnPtr<Yarr::BytecodePattern> m_regExpBytecode;225 221 }; 226 222 … … 280 276 ASSERT(m_numSubpatterns == pattern.m_numSubpatterns); 281 277 282 if (! m_representation) {278 if (!hasCode()) { 283 279 ASSERT(m_state == NotCompiled); 284 m_representation = adoptPtr(new RegExpRepresentation);285 280 globalData->regExpCache()->addToStrongCache(this); 286 281 m_state = ByteCode; … … 289 284 #if ENABLE(YARR_JIT) 290 285 if (!pattern.m_containsBackreferences && globalData->canUseJIT()) { 291 Yarr::jitCompile(pattern, charSize, globalData, m_re presentation->m_regExpJITCode);286 Yarr::jitCompile(pattern, charSize, globalData, m_regExpJITCode); 292 287 #if ENABLE(YARR_JIT_DEBUG) 293 if (!m_re presentation->m_regExpJITCode.isFallBack())288 if (!m_regExpJITCode.isFallBack()) 294 289 m_state = JITCode; 295 290 else 296 291 m_state = ByteCode; 297 292 #else 298 if (!m_re presentation->m_regExpJITCode.isFallBack()) {293 if (!m_regExpJITCode.isFallBack()) { 299 294 m_state = JITCode; 300 295 return; … … 306 301 #endif 307 302 308 m_re presentation->m_regExpBytecode = Yarr::byteCompile(pattern, &globalData->m_regExpAllocator);303 m_regExpBytecode = Yarr::byteCompile(pattern, &globalData->m_regExpAllocator); 309 304 } 310 305 311 306 void RegExp::compileIfNecessary(JSGlobalData& globalData, Yarr::YarrCharSize charSize) 312 307 { 313 // If the state is NotCompiled or ParseError, then there is no representation. 314 // If there is a representation, and the state must be either JITCode or ByteCode. 315 ASSERT(!!m_representation == (m_state == JITCode || m_state == ByteCode)); 316 317 if (m_representation) { 308 if (hasCode()) { 318 309 #if ENABLE(YARR_JIT) 319 310 if (m_state != JITCode) 320 311 return; 321 if ((charSize == Yarr::Char8) && (m_re presentation->m_regExpJITCode.has8BitCode()))322 return; 323 if ((charSize == Yarr::Char16) && (m_re presentation->m_regExpJITCode.has16BitCode()))312 if ((charSize == Yarr::Char8) && (m_regExpJITCode.has8BitCode())) 313 return; 314 if ((charSize == Yarr::Char16) && (m_regExpJITCode.has16BitCode())) 324 315 return; 325 316 #else … … 331 322 } 332 323 333 int RegExp::match(JSGlobalData& globalData, const UString& s, unsigned startOffset, Vector<int, 32> *ovector)324 int RegExp::match(JSGlobalData& globalData, const UString& s, unsigned startOffset, Vector<int, 32>& ovector) 334 325 { 335 326 #if ENABLE(REGEXP_TRACING) … … 341 332 342 333 int offsetVectorSize = (m_numSubpatterns + 1) * 2; 343 int* offsetVector; 344 Vector<int, 32> nonReturnedOvector; 345 if (ovector) { 346 ovector->resize(offsetVectorSize); 347 offsetVector = ovector->data(); 348 } else { 349 nonReturnedOvector.resize(offsetVectorSize); 350 offsetVector = nonReturnedOvector.data(); 351 } 352 ASSERT(offsetVector); 334 ovector.resize(offsetVectorSize); 335 int* offsetVector = ovector.data(); 353 336 354 337 int result; … … 356 339 if (m_state == JITCode) { 357 340 if (s.is8Bit()) 358 result = Yarr::execute(m_representation->m_regExpJITCode, s.characters8(), startOffset, s.length(), offsetVector);341 result = m_regExpJITCode.execute(s.characters8(), startOffset, s.length(), offsetVector).start; 359 342 else 360 result = Yarr::execute(m_representation->m_regExpJITCode, s.characters16(), startOffset, s.length(), offsetVector);343 result = m_regExpJITCode.execute(s.characters16(), startOffset, s.length(), offsetVector).start; 361 344 #if ENABLE(YARR_JIT_DEBUG) 362 345 matchCompareWithInterpreter(s, startOffset, offsetVector, result); … … 364 347 } else 365 348 #endif 366 result = Yarr::interpret(m_re presentation->m_regExpBytecode.get(), s, startOffset, s.length(), reinterpret_cast<unsigned*>(offsetVector));349 result = Yarr::interpret(m_regExpBytecode.get(), s, startOffset, s.length(), reinterpret_cast<unsigned*>(offsetVector)); 367 350 368 351 // FIXME: The YARR engine should handle unsigned or size_t length matches. … … 405 388 } 406 389 390 void RegExp::compileMatchOnly(JSGlobalData* globalData, Yarr::YarrCharSize charSize) 391 { 392 Yarr::YarrPattern pattern(m_patternString, ignoreCase(), multiline(), &m_constructionError); 393 if (m_constructionError) { 394 ASSERT_NOT_REACHED(); 395 m_state = ParseError; 396 return; 397 } 398 ASSERT(m_numSubpatterns == pattern.m_numSubpatterns); 399 400 if (!hasCode()) { 401 ASSERT(m_state == NotCompiled); 402 globalData->regExpCache()->addToStrongCache(this); 403 m_state = ByteCode; 404 } 405 406 #if ENABLE(YARR_JIT) 407 if (!pattern.m_containsBackreferences && globalData->canUseJIT()) { 408 Yarr::jitCompile(pattern, charSize, globalData, m_regExpJITCode, Yarr::MatchOnly); 409 #if ENABLE(YARR_JIT_DEBUG) 410 if (!m_regExpJITCode.isFallBack()) 411 m_state = JITCode; 412 else 413 m_state = ByteCode; 414 #else 415 if (!m_regExpJITCode.isFallBack()) { 416 m_state = JITCode; 417 return; 418 } 419 #endif 420 } 421 #else 422 UNUSED_PARAM(charSize); 423 #endif 424 425 m_regExpBytecode = Yarr::byteCompile(pattern, &globalData->m_regExpAllocator); 426 } 427 428 void RegExp::compileIfNecessaryMatchOnly(JSGlobalData& globalData, Yarr::YarrCharSize charSize) 429 { 430 if (hasCode()) { 431 #if ENABLE(YARR_JIT) 432 if (m_state != JITCode) 433 return; 434 if ((charSize == Yarr::Char8) && (m_regExpJITCode.has8BitCodeMatchOnly())) 435 return; 436 if ((charSize == Yarr::Char16) && (m_regExpJITCode.has16BitCodeMatchOnly())) 437 return; 438 #else 439 return; 440 #endif 441 } 442 443 compileMatchOnly(&globalData, charSize); 444 } 445 446 MatchResult RegExp::match(JSGlobalData& globalData, const UString& s, unsigned startOffset) 447 { 448 #if ENABLE(REGEXP_TRACING) 449 m_rtMatchCallCount++; 450 #endif 451 452 ASSERT(m_state != ParseError); 453 compileIfNecessaryMatchOnly(globalData, s.is8Bit() ? Yarr::Char8 : Yarr::Char16); 454 455 #if ENABLE(YARR_JIT) 456 if (m_state == JITCode) { 457 MatchResult result = s.is8Bit() ? 458 m_regExpJITCode.execute(s.characters8(), startOffset, s.length()) : 459 m_regExpJITCode.execute(s.characters16(), startOffset, s.length()); 460 #if ENABLE(REGEXP_TRACING) 461 if (!result) 462 m_rtMatchFoundCount++; 463 #endif 464 return result; 465 } 466 #endif 467 468 int offsetVectorSize = (m_numSubpatterns + 1) * 2; 469 int* offsetVector; 470 Vector<int, 32> nonReturnedOvector; 471 nonReturnedOvector.resize(offsetVectorSize); 472 offsetVector = nonReturnedOvector.data(); 473 int r = Yarr::interpret(m_regExpBytecode.get(), s, startOffset, s.length(), reinterpret_cast<unsigned*>(offsetVector)); 474 #if REGEXP_FUNC_TEST_DATA_GEN 475 RegExpFunctionalTestCollector::get()->outputOneTest(this, s, startOffset, offsetVector, result); 476 #endif 477 478 if (r >= 0) { 479 #if ENABLE(REGEXP_TRACING) 480 m_rtMatchFoundCount++; 481 #endif 482 return MatchResult(r, reinterpret_cast<unsigned*>(offsetVector)[1]); 483 } 484 485 return MatchResult::failed(); 486 } 487 407 488 void RegExp::invalidateCode() 408 489 { 409 if (! m_representation)490 if (!hasCode()) 410 491 return; 411 492 m_state = NotCompiled; 412 m_representation.clear(); 493 m_regExpJITCode.clear(); 494 m_regExpBytecode.clear(); 413 495 } 414 496 … … 429 511 interpreterOffsetVector[j] = -1; 430 512 431 interpreterResult = Yarr::interpret(m_re presentation->m_regExpBytecode.get(), s, startOffset, s.length(), interpreterOffsetVector);513 interpreterResult = Yarr::interpret(m_regExpBytecode.get(), s, startOffset, s.length(), interpreterOffsetVector); 432 514 433 515 if (jitResult != interpreterResult) … … 478 560 479 561 #if ENABLE(YARR_JIT) 480 Yarr::YarrCodeBlock& codeBlock = m_re presentation->m_regExpJITCode;562 Yarr::YarrCodeBlock& codeBlock = m_regExpJITCode; 481 563 482 564 const size_t jitAddrSize = 20; -
trunk/Source/JavaScriptCore/runtime/RegExp.h
r106189 r112454 23 23 #define RegExp_h 24 24 25 #include "ExecutableAllocator.h" 26 #include "MatchResult.h" 27 #include "RegExpKey.h" 28 #include "Structure.h" 25 29 #include "UString.h" 26 #include "ExecutableAllocator.h"27 #include "Structure.h"28 #include "RegExpKey.h"29 30 #include "yarr/Yarr.h" 30 31 #include <wtf/Forward.h> 31 32 #include <wtf/RefCounted.h> 33 34 #if ENABLE(YARR_JIT) 35 #include "yarr/YarrJIT.h" 36 #endif 32 37 33 38 namespace JSC { … … 54 59 const char* errorMessage() const { return m_constructionError; } 55 60 56 JS_EXPORT_PRIVATE int match(JSGlobalData&, const UString&, unsigned startOffset, Vector<int, 32>* ovector = 0); 61 JS_EXPORT_PRIVATE int match(JSGlobalData&, const UString&, unsigned startOffset, Vector<int, 32>& ovector); 62 MatchResult match(JSGlobalData&, const UString&, unsigned startOffset); 57 63 unsigned numSubpatterns() const { return m_numSubpatterns; } 58 64 59 65 bool hasCode() 60 66 { 61 return m_ representation;67 return m_state != NotCompiled; 62 68 } 63 69 … … 96 102 void compileIfNecessary(JSGlobalData&, Yarr::YarrCharSize); 97 103 104 void compileMatchOnly(JSGlobalData*, Yarr::YarrCharSize); 105 void compileIfNecessaryMatchOnly(JSGlobalData&, Yarr::YarrCharSize); 106 98 107 #if ENABLE(YARR_JIT_DEBUG) 99 108 void matchCompareWithInterpreter(const UString&, int startOffset, int* offsetVector, int jitResult); … … 109 118 #endif 110 119 111 OwnPtr<RegExpRepresentation> m_representation; 120 #if ENABLE(YARR_JIT) 121 Yarr::YarrCodeBlock m_regExpJITCode; 122 #endif 123 OwnPtr<Yarr::BytecodePattern> m_regExpBytecode; 112 124 }; 113 125 -
trunk/Source/JavaScriptCore/runtime/RegExpConstructor.h
r111889 r112454 56 56 static const ClassInfo s_info; 57 57 58 MatchResult performMatch(JSGlobalData&, RegExp*, JSString*, const UString&, int startOffset, int** ovector = 0); 58 MatchResult performMatch(JSGlobalData&, RegExp*, JSString*, const UString&, int startOffset, int** ovector); 59 MatchResult performMatch(JSGlobalData&, RegExp*, JSString*, const UString&, int startOffset); 59 60 60 61 void setMultiline(bool multiline) { m_multiline = multiline; } … … 103 104 ALWAYS_INLINE MatchResult RegExpConstructor::performMatch(JSGlobalData& globalData, RegExp* regExp, JSString* string, const UString& input, int startOffset, int** ovector) 104 105 { 105 int position = regExp->match(globalData, input, startOffset, &m_ovector);106 int position = regExp->match(globalData, input, startOffset, m_ovector); 106 107 107 108 if (ovector) … … 120 121 return MatchResult(position, end); 121 122 } 123 ALWAYS_INLINE MatchResult RegExpConstructor::performMatch(JSGlobalData& globalData, RegExp* regExp, JSString* string, const UString& input, int startOffset) 124 { 125 MatchResult result = regExp->match(globalData, input, startOffset); 126 if (result) 127 m_cachedResult.record(globalData, this, regExp, string, result); 128 return result; 129 } 122 130 123 131 } // namespace JSC -
trunk/Source/JavaScriptCore/runtime/RegExpMatchesArray.cpp
r111889 r112454 59 59 if (unsigned numSubpatterns = m_regExp->numSubpatterns()) { 60 60 Vector<int, 32> subpatternResults; 61 int position = m_regExp->match(exec->globalData(), m_input->value(exec), m_result.start, &subpatternResults);61 int position = m_regExp->match(exec->globalData(), m_input->value(exec), m_result.start, subpatternResults); 62 62 ASSERT_UNUSED(position, position >= 0 && static_cast<size_t>(position) == m_result.start); 63 63 ASSERT(m_result.start == static_cast<size_t>(subpatternResults[0])); -
trunk/Source/JavaScriptCore/runtime/RegExpObject.h
r111603 r112454 26 26 27 27 namespace JSC { 28 29 struct MatchResult {30 ALWAYS_INLINE MatchResult(size_t start, size_t end)31 : start(start)32 , end(end)33 {34 }35 ALWAYS_INLINE static MatchResult failed()36 {37 return MatchResult(WTF::notFound, 0);38 }39 ALWAYS_INLINE operator bool()40 {41 return start != WTF::notFound;42 }43 ALWAYS_INLINE bool empty()44 {45 return start == end;46 }47 size_t start;48 size_t end;49 };50 28 51 29 class RegExpObject : public JSNonFinalObject { -
trunk/Source/JavaScriptCore/runtime/StringPrototype.cpp
r111889 r112454 964 964 // Property Descriptor {[[Value]]: S, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true}, and false. 965 965 // d. Return A. 966 if ( reg->match(*globalData, input, 0) < 0)966 if (!reg->match(*globalData, input, 0)) 967 967 result->putDirectIndex(exec, 0, jsStringWithReuse(exec, thisValue, input), false); 968 968 return JSValue::encode(result); … … 975 975 // a. Call SplitMatch(S, q, R) and let z be its MatchResult result. 976 976 Vector<int, 32> ovector; 977 int mpos = reg->match(*globalData, input, matchPosition, &ovector);977 int mpos = reg->match(*globalData, input, matchPosition, ovector); 978 978 // b. If z is failure, then let q = q + 1. 979 979 if (mpos < 0) -
trunk/Source/JavaScriptCore/testRegExp.cpp
r111618 r112454 216 216 Vector<int, 32> outVector; 217 217 outVector.resize(regExpTest->expectVector.size()); 218 int matchResult = regexp->match(globalData, regExpTest->subject, regExpTest->offset, &outVector);218 int matchResult = regexp->match(globalData, regExpTest->subject, regExpTest->offset, outVector); 219 219 220 220 if (matchResult != regExpTest->result) { -
trunk/Source/JavaScriptCore/yarr/YarrJIT.cpp
r112192 r112454 38 38 namespace JSC { namespace Yarr { 39 39 40 template<YarrJITCompileMode compileMode> 40 41 class YarrGenerator : private MacroAssembler { 41 42 friend void jitCompile(JSGlobalData*, YarrCodeBlock& jitObject, const UString& pattern, unsigned& numSubpatterns, const char*& error, bool ignoreCase, bool multiline); … … 51 52 52 53 static const RegisterID returnRegister = ARMRegisters::r0; 54 static const RegisterID returnRegister2 = ARMRegisters::r1; 53 55 #elif CPU(MIPS) 54 56 static const RegisterID input = MIPSRegisters::a0; … … 61 63 62 64 static const RegisterID returnRegister = MIPSRegisters::v0; 65 static const RegisterID returnRegister2 = MIPSRegisters::v1; 63 66 #elif CPU(SH4) 64 67 static const RegisterID input = SH4Registers::r4; … … 71 74 72 75 static const RegisterID returnRegister = SH4Registers::r0; 76 static const RegisterID returnRegister2 = SH4Registers::r1; 73 77 #elif CPU(X86) 74 78 static const RegisterID input = X86Registers::eax; … … 81 85 82 86 static const RegisterID returnRegister = X86Registers::eax; 87 static const RegisterID returnRegister2 = X86Registers::edx; 83 88 #elif CPU(X86_64) 84 89 static const RegisterID input = X86Registers::edi; … … 91 96 92 97 static const RegisterID returnRegister = X86Registers::eax; 98 static const RegisterID returnRegister2 = X86Registers::edx; 93 99 #endif 94 100 … … 304 310 { 305 311 jump(Address(stackPointerRegister, frameLocation * sizeof(void*))); 312 } 313 314 void initCallFrame() 315 { 316 unsigned callFrameSize = m_pattern.m_body->m_callFrameSize; 317 if (callFrameSize) 318 subPtr(Imm32(callFrameSize * sizeof(void*)), stackPointerRegister); 319 } 320 void removeCallFrame() 321 { 322 unsigned callFrameSize = m_pattern.m_body->m_callFrameSize; 323 if (callFrameSize) 324 addPtr(Imm32(callFrameSize * sizeof(void*)), stackPointerRegister); 325 } 326 327 // Used to record subpatters, should only be called if compileMode is IncludeSubpatterns. 328 void setSubpatternStart(RegisterID reg, unsigned subpattern) 329 { 330 ASSERT(subpattern); 331 ASSERT(compileMode == IncludeSubpatterns); 332 store32(reg, Address(output, (subpattern << 1) * sizeof(int))); 333 } 334 void setSubpatternEnd(RegisterID reg, unsigned subpattern) 335 { 336 ASSERT(subpattern); 337 ASSERT(compileMode == IncludeSubpatterns); 338 store32(reg, Address(output, ((subpattern << 1) + 1) * sizeof(int))); 339 } 340 void clearSubpatternStart(unsigned subpattern) 341 { 342 ASSERT(subpattern); 343 ASSERT(compileMode == IncludeSubpatterns); 344 store32(TrustedImm32(-1), Address(output, (subpattern << 1) * sizeof(int))); 345 } 346 347 // We use one of three different strategies to track the start of the current match, 348 // while matching. 349 // 1) If the pattern has a fixed size, do nothing! - we calculate the value lazily 350 // at the end of matching. This is irrespective of compileMode, and in this case 351 // these methods should never be called. 352 // 2) If we're compiling IncludeSubpatterns, 'output' contains a pointer to an output 353 // vector, store the match start in the output vector. 354 // 3) If we're compiling MatchOnly, 'output' is unused, store the match start directly 355 // in this register. 356 void setMatchStart(RegisterID reg) 357 { 358 ASSERT(!m_pattern.m_body->m_hasFixedSize); 359 if (compileMode == IncludeSubpatterns) 360 store32(reg, output); 361 else 362 move(reg, output); 363 } 364 void getMatchStart(RegisterID reg) 365 { 366 ASSERT(!m_pattern.m_body->m_hasFixedSize); 367 if (compileMode == IncludeSubpatterns) 368 load32(output, reg); 369 else 370 move(output, reg); 306 371 } 307 372 … … 1070 1135 JumpList foundEndingNewLine; 1071 1136 1072 if (m_pattern.m_body->m_hasFixedSize) { 1073 move(index, matchPos); 1074 sub32(Imm32(m_checked), matchPos); 1075 } else 1076 load32(Address(output), matchPos); 1137 ASSERT(!m_pattern.m_body->m_hasFixedSize); 1138 getMatchStart(matchPos); 1077 1139 1078 1140 saveStartIndex.append(branchTest32(Zero, matchPos)); … … 1094 1156 op.m_jumps.append(branchTest32(NonZero, matchPos)); 1095 1157 1096 store32(matchPos, Address(output)); 1158 ASSERT(!m_pattern.m_body->m_hasFixedSize); 1159 setMatchStart(matchPos); 1097 1160 1098 1161 move(index, matchPos); … … 1316 1379 1317 1380 // Adjust the stack pointer to remove the pattern's frame. 1318 if (m_pattern.m_body->m_callFrameSize) 1319 addPtr(Imm32(m_pattern.m_body->m_callFrameSize * sizeof(void*)), stackPointerRegister); 1381 removeCallFrame(); 1320 1382 1321 1383 // Load appropriate values into the return register and the first output … … 1327 1389 if (priorAlternative->m_minimumSize) 1328 1390 sub32(Imm32(priorAlternative->m_minimumSize), returnRegister); 1329 store32(returnRegister, output); 1391 if (compileMode == IncludeSubpatterns) 1392 store32(returnRegister, output); 1330 1393 } else 1331 load32(Address(output), returnRegister); 1332 store32(index, Address(output, 4)); 1394 getMatchStart(returnRegister); 1395 if (compileMode == IncludeSubpatterns) 1396 store32(index, Address(output, 4)); 1397 move(index, returnRegister2); 1398 1333 1399 generateReturn(); 1334 1400 … … 1513 1579 // offsets only afterwards, at the point the results array is 1514 1580 // being accessed. 1515 if (term->capture()) { 1516 int offsetId = term->parentheses.subpatternId << 1; 1581 if (term->capture() && compileMode == IncludeSubpatterns) { 1517 1582 int inputOffset = term->inputPosition - m_checked; 1518 1583 if (term->quantityType == QuantifierFixedCount) … … 1521 1586 move(index, indexTemporary); 1522 1587 add32(Imm32(inputOffset), indexTemporary); 1523 s tore32(indexTemporary, Address(output, offsetId * sizeof(int)));1588 setSubpatternStart(indexTemporary, term->parentheses.subpatternId); 1524 1589 } else 1525 s tore32(index, Address(output, offsetId * sizeof(int)));1590 setSubpatternStart(index, term->parentheses.subpatternId); 1526 1591 } 1527 1592 break; … … 1549 1614 // offsets only afterwards, at the point the results array is 1550 1615 // being accessed. 1551 if (term->capture()) { 1552 int offsetId = (term->parentheses.subpatternId << 1) + 1; 1616 if (term->capture() && compileMode == IncludeSubpatterns) { 1553 1617 int inputOffset = term->inputPosition - m_checked; 1554 1618 if (inputOffset) { 1555 1619 move(index, indexTemporary); 1556 1620 add32(Imm32(inputOffset), indexTemporary); 1557 s tore32(indexTemporary, Address(output, offsetId * sizeof(int)));1621 setSubpatternEnd(indexTemporary, term->parentheses.subpatternId); 1558 1622 } else 1559 s tore32(index, Address(output, offsetId * sizeof(int)));1623 setSubpatternEnd(index, term->parentheses.subpatternId); 1560 1624 } 1561 1625 … … 1647 1711 1648 1712 case OpMatchFailed: 1649 if (m_pattern.m_body->m_callFrameSize)1650 addPtr(Imm32(m_pattern.m_body->m_callFrameSize * sizeof(void*)), stackPointerRegister);1651 move(TrustedImm32( -1), returnRegister);1713 removeCallFrame(); 1714 move(TrustedImmPtr((void*)WTF::notFound), returnRegister); 1715 move(TrustedImm32(0), returnRegister2); 1652 1716 generateReturn(); 1653 1717 break; … … 1744 1808 if (!m_pattern.m_body->m_hasFixedSize) { 1745 1809 if (alternative->m_minimumSize == 1) 1746 s tore32(index, Address(output));1810 setMatchStart(index); 1747 1811 else { 1748 1812 move(index, regT0); … … 1751 1815 else 1752 1816 add32(TrustedImm32(1), regT0); 1753 s tore32(regT0, Address(output));1817 setMatchStart(regT0); 1754 1818 } 1755 1819 } … … 1837 1901 if (needsToUpdateMatchStart && alternative->m_minimumSize == 1) { 1838 1902 // index is already incremented by 1, so just store it now! 1839 s tore32(index, Address(output));1903 setMatchStart(index); 1840 1904 needsToUpdateMatchStart = false; 1841 1905 } … … 1861 1925 if (needsToUpdateMatchStart) { 1862 1926 if (!m_pattern.m_body->m_minimumSize) 1863 s tore32(index, Address(output));1927 setMatchStart(index); 1864 1928 else { 1865 1929 move(index, regT0); 1866 1930 sub32(Imm32(m_pattern.m_body->m_minimumSize), regT0); 1867 s tore32(regT0, Address(output));1931 setMatchStart(regT0); 1868 1932 } 1869 1933 } … … 1887 1951 matchFailed.link(this); 1888 1952 1889 if (m_pattern.m_body->m_callFrameSize)1890 addPtr(Imm32(m_pattern.m_body->m_callFrameSize * sizeof(void*)), stackPointerRegister);1891 move(TrustedImm32( -1), returnRegister);1953 removeCallFrame(); 1954 move(TrustedImmPtr((void*)WTF::notFound), returnRegister); 1955 move(TrustedImm32(0), returnRegister2); 1892 1956 generateReturn(); 1893 1957 break; … … 2056 2120 2057 2121 // We only need to backtrack to thispoint if capturing or greedy. 2058 if ( term->capture() || term->quantityType == QuantifierGreedy) {2122 if ((term->capture() && compileMode == IncludeSubpatterns) || term->quantityType == QuantifierGreedy) { 2059 2123 m_backtrackingState.link(this); 2060 2124 2061 2125 // If capturing, clear the capture (we only need to reset start). 2062 if (term->capture() )2063 store32(TrustedImm32(-1), Address(output, (term->parentheses.subpatternId << 1) * sizeof(int)));2126 if (term->capture() && compileMode == IncludeSubpatterns) 2127 clearSubpatternStart(term->parentheses.subpatternId); 2064 2128 2065 2129 // If Greedy, jump to the end. … … 2451 2515 loadPtr(Address(X86Registers::ebp, 3 * sizeof(void*)), index); 2452 2516 loadPtr(Address(X86Registers::ebp, 4 * sizeof(void*)), length); 2453 loadPtr(Address(X86Registers::ebp, 5 * sizeof(void*)), output); 2517 if (compileMode == IncludeSubpatterns) 2518 loadPtr(Address(X86Registers::ebp, 5 * sizeof(void*)), output); 2454 2519 #else 2455 loadPtr(Address(X86Registers::ebp, 2 * sizeof(void*)), output); 2520 if (compileMode == IncludeSubpatterns) 2521 loadPtr(Address(X86Registers::ebp, 2 * sizeof(void*)), output); 2456 2522 #endif 2457 2523 #elif CPU(ARM) … … 2462 2528 push(ARMRegisters::r8); // scratch register 2463 2529 #endif 2464 move(ARMRegisters::r3, output); 2530 if (compileMode == IncludeSubpatterns) 2531 move(ARMRegisters::r3, output); 2465 2532 #elif CPU(SH4) 2466 2533 push(SH4Registers::r11); … … 2512 2579 2513 2580 Jump hasInput = checkInput(); 2514 move(TrustedImm32(-1), returnRegister); 2581 move(TrustedImmPtr((void*)WTF::notFound), returnRegister); 2582 move(TrustedImm32(0), returnRegister2); 2515 2583 generateReturn(); 2516 2584 hasInput.link(this); 2517 2585 2518 for (unsigned i = 0; i < m_pattern.m_numSubpatterns + 1; ++i) 2519 store32(TrustedImm32(-1), Address(output, (i << 1) * sizeof(int))); 2586 if (compileMode == IncludeSubpatterns) { 2587 for (unsigned i = 0; i < m_pattern.m_numSubpatterns + 1; ++i) 2588 store32(TrustedImm32(-1), Address(output, (i << 1) * sizeof(int))); 2589 } 2520 2590 2521 2591 if (!m_pattern.m_body->m_hasFixedSize) 2522 store32(index, Address(output)); 2523 2524 if (m_pattern.m_body->m_callFrameSize) 2525 subPtr(Imm32(m_pattern.m_body->m_callFrameSize * sizeof(void*)), stackPointerRegister); 2592 setMatchStart(index); 2593 2594 initCallFrame(); 2526 2595 2527 2596 // Compile the pattern to the internal 'YarrOp' representation. … … 2541 2610 LinkBuffer linkBuffer(*globalData, this, REGEXP_CODE_ID); 2542 2611 m_backtrackingState.linkDataLabels(linkBuffer); 2543 if (m_charSize == Char8) 2544 jitObject.set8BitCode(linkBuffer.finalizeCode()); 2545 else 2546 jitObject.set16BitCode(linkBuffer.finalizeCode()); 2612 2613 if (compileMode == MatchOnly) { 2614 if (m_charSize == Char8) 2615 jitObject.set8BitCodeMatchOnly(linkBuffer.finalizeCode()); 2616 else 2617 jitObject.set16BitCodeMatchOnly(linkBuffer.finalizeCode()); 2618 } else { 2619 if (m_charSize == Char8) 2620 jitObject.set8BitCode(linkBuffer.finalizeCode()); 2621 else 2622 jitObject.set16BitCode(linkBuffer.finalizeCode()); 2623 } 2547 2624 jitObject.setFallBack(m_shouldFallBack); 2548 2625 } … … 2578 2655 }; 2579 2656 2580 void jitCompile(YarrPattern& pattern, YarrCharSize charSize, JSGlobalData* globalData, YarrCodeBlock& jitObject )2657 void jitCompile(YarrPattern& pattern, YarrCharSize charSize, JSGlobalData* globalData, YarrCodeBlock& jitObject, YarrJITCompileMode mode) 2581 2658 { 2582 YarrGenerator(pattern, charSize).compile(globalData, jitObject); 2659 if (mode == MatchOnly) 2660 YarrGenerator<MatchOnly>(pattern, charSize).compile(globalData, jitObject); 2661 else 2662 YarrGenerator<IncludeSubpatterns>(pattern, charSize).compile(globalData, jitObject); 2583 2663 } 2584 2664 -
trunk/Source/JavaScriptCore/yarr/YarrJIT.h
r103641 r112454 30 30 31 31 #include "JSGlobalData.h" 32 #include "MacroAssembler.h" 32 #include "MacroAssemblerCodeRef.h" 33 #include "MatchResult.h" 33 34 #include "UString.h" 34 35 #include "Yarr.h" … … 49 50 50 51 class YarrCodeBlock { 51 typedef int (*YarrJITCode8)(const LChar* input, unsigned start, unsigned length, int* output) YARR_CALL; 52 typedef int (*YarrJITCode16)(const UChar* input, unsigned start, unsigned length, int* output) YARR_CALL; 52 #if CPU(X86_64) 53 typedef MatchResult (*YarrJITCode8)(const LChar* input, unsigned start, unsigned length, int* output) YARR_CALL; 54 typedef MatchResult (*YarrJITCode16)(const UChar* input, unsigned start, unsigned length, int* output) YARR_CALL; 55 typedef MatchResult (*YarrJITCodeMatchOnly8)(const LChar* input, unsigned start, unsigned length) YARR_CALL; 56 typedef MatchResult (*YarrJITCodeMatchOnly16)(const UChar* input, unsigned start, unsigned length) YARR_CALL; 57 #else 58 typedef EncodedMatchResult (*YarrJITCode8)(const LChar* input, unsigned start, unsigned length, int* output) YARR_CALL; 59 typedef EncodedMatchResult (*YarrJITCode16)(const UChar* input, unsigned start, unsigned length, int* output) YARR_CALL; 60 typedef EncodedMatchResult (*YarrJITCodeMatchOnly8)(const LChar* input, unsigned start, unsigned length) YARR_CALL; 61 typedef EncodedMatchResult (*YarrJITCodeMatchOnly16)(const UChar* input, unsigned start, unsigned length) YARR_CALL; 62 #endif 53 63 54 64 public: … … 64 74 void setFallBack(bool fallback) { m_needFallBack = fallback; } 65 75 bool isFallBack() { return m_needFallBack; } 76 66 77 bool has8BitCode() { return m_ref8.size(); } 67 78 bool has16BitCode() { return m_ref16.size(); } 68 void set8BitCode(MacroAssembler ::CodeRef ref) { m_ref8 = ref; }69 void set16BitCode(MacroAssembler ::CodeRef ref) { m_ref16 = ref; }79 void set8BitCode(MacroAssemblerCodeRef ref) { m_ref8 = ref; } 80 void set16BitCode(MacroAssemblerCodeRef ref) { m_ref16 = ref; } 70 81 71 int execute(const LChar* input, unsigned start, unsigned length, int* output) 82 bool has8BitCodeMatchOnly() { return m_matchOnly8.size(); } 83 bool has16BitCodeMatchOnly() { return m_matchOnly16.size(); } 84 void set8BitCodeMatchOnly(MacroAssemblerCodeRef matchOnly) { m_matchOnly8 = matchOnly; } 85 void set16BitCodeMatchOnly(MacroAssemblerCodeRef matchOnly) { m_matchOnly16 = matchOnly; } 86 87 MatchResult execute(const LChar* input, unsigned start, unsigned length, int* output) 72 88 { 73 89 ASSERT(has8BitCode()); 74 return reinterpret_cast<YarrJITCode8>(m_ref8.code().executableAddress())(input, start, length, output);90 return MatchResult(reinterpret_cast<YarrJITCode8>(m_ref8.code().executableAddress())(input, start, length, output)); 75 91 } 76 92 77 int execute(const UChar* input, unsigned start, unsigned length, int* output)93 MatchResult execute(const UChar* input, unsigned start, unsigned length, int* output) 78 94 { 79 95 ASSERT(has16BitCode()); 80 return reinterpret_cast<YarrJITCode16>(m_ref16.code().executableAddress())(input, start, length, output);96 return MatchResult(reinterpret_cast<YarrJITCode16>(m_ref16.code().executableAddress())(input, start, length, output)); 81 97 } 98 99 MatchResult execute(const LChar* input, unsigned start, unsigned length) 100 { 101 ASSERT(has8BitCodeMatchOnly()); 102 return MatchResult(reinterpret_cast<YarrJITCodeMatchOnly8>(m_matchOnly8.code().executableAddress())(input, start, length)); 103 } 104 105 MatchResult execute(const UChar* input, unsigned start, unsigned length) 106 { 107 ASSERT(has16BitCodeMatchOnly()); 108 return MatchResult(reinterpret_cast<YarrJITCodeMatchOnly16>(m_matchOnly16.code().executableAddress())(input, start, length)); 109 } 110 82 111 #if ENABLE(REGEXP_TRACING) 83 112 void *getAddr() { return m_ref.code().executableAddress(); } 84 113 #endif 85 114 115 void clear() 116 { 117 m_ref8 = MacroAssemblerCodeRef(); 118 m_ref16 = MacroAssemblerCodeRef(); 119 m_matchOnly8 = MacroAssemblerCodeRef(); 120 m_matchOnly16 = MacroAssemblerCodeRef(); 121 m_needFallBack = false; 122 } 123 86 124 private: 87 MacroAssembler::CodeRef m_ref8; 88 MacroAssembler::CodeRef m_ref16; 125 MacroAssemblerCodeRef m_ref8; 126 MacroAssemblerCodeRef m_ref16; 127 MacroAssemblerCodeRef m_matchOnly8; 128 MacroAssemblerCodeRef m_matchOnly16; 89 129 bool m_needFallBack; 90 130 }; 91 131 92 void jitCompile(YarrPattern&, YarrCharSize, JSGlobalData*, YarrCodeBlock& jitObject); 93 94 inline int execute(YarrCodeBlock& jitObject, const LChar* input, unsigned start, unsigned length, int* output) 95 { 96 return jitObject.execute(input, start, length, output); 97 } 98 99 inline int execute(YarrCodeBlock& jitObject, const UChar* input, unsigned start, unsigned length, int* output) 100 { 101 return jitObject.execute(input, start, length, output); 102 } 132 enum YarrJITCompileMode { 133 MatchOnly, 134 IncludeSubpatterns 135 }; 136 void jitCompile(YarrPattern&, YarrCharSize, JSGlobalData*, YarrCodeBlock& jitObject, YarrJITCompileMode = IncludeSubpatterns); 103 137 104 138 } } // namespace JSC::Yarr
Note:
See TracChangeset
for help on using the changeset viewer.