Changeset 143018 in webkit
- Timestamp:
- Feb 15, 2013 10:56:27 AM (11 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r142970 r143018 1 2013-02-15 Andreas Kling <akling@apple.com> 2 3 Yarr: Use OwnPtr to make pattern/disjunction/character-class ownership clearer. 4 <http://webkit.org/b/109218> 5 6 Reviewed by Benjamin Poulain. 7 8 - Let classes that manage lifetime of other objects hold on to them with OwnPtr instead of raw pointers. 9 - Placed some strategic Vector::shrinkToFit(), ::reserveInitialCapacity() and ::swap(). 10 11 668 kB progression on Membuster3. 12 13 * yarr/YarrInterpreter.cpp: 14 (JSC::Yarr::ByteCompiler::atomParenthesesSubpatternEnd): 15 (JSC::Yarr::ByteCompiler::emitDisjunction): 16 (ByteCompiler): 17 * yarr/YarrInterpreter.h: 18 (JSC::Yarr::BytecodePattern::BytecodePattern): 19 (BytecodePattern): 20 * yarr/YarrJIT.cpp: 21 (JSC::Yarr::YarrGenerator::opCompileParenthesesSubpattern): 22 (JSC::Yarr::YarrGenerator::opCompileParentheticalAssertion): 23 (JSC::Yarr::YarrGenerator::opCompileBody): 24 * yarr/YarrPattern.cpp: 25 (JSC::Yarr::CharacterClassConstructor::charClass): 26 (JSC::Yarr::YarrPatternConstructor::YarrPatternConstructor): 27 (JSC::Yarr::YarrPatternConstructor::reset): 28 (JSC::Yarr::YarrPatternConstructor::atomPatternCharacter): 29 (JSC::Yarr::YarrPatternConstructor::atomCharacterClassEnd): 30 (JSC::Yarr::YarrPatternConstructor::copyDisjunction): 31 (JSC::Yarr::YarrPatternConstructor::setupDisjunctionOffsets): 32 (JSC::Yarr::YarrPatternConstructor::checkForTerminalParentheses): 33 (JSC::Yarr::YarrPatternConstructor::optimizeBOL): 34 (JSC::Yarr::YarrPatternConstructor::containsCapturingTerms): 35 (JSC::Yarr::YarrPatternConstructor::optimizeDotStarWrappedExpressions): 36 * yarr/YarrPattern.h: 37 (JSC::Yarr::PatternDisjunction::addNewAlternative): 38 (PatternDisjunction): 39 (YarrPattern): 40 (JSC::Yarr::YarrPattern::reset): 41 (JSC::Yarr::YarrPattern::newlineCharacterClass): 42 (JSC::Yarr::YarrPattern::digitsCharacterClass): 43 (JSC::Yarr::YarrPattern::spacesCharacterClass): 44 (JSC::Yarr::YarrPattern::wordcharCharacterClass): 45 (JSC::Yarr::YarrPattern::nondigitsCharacterClass): 46 (JSC::Yarr::YarrPattern::nonspacesCharacterClass): 47 (JSC::Yarr::YarrPattern::nonwordcharCharacterClass): 48 1 49 2013-02-14 Geoffrey Garen <ggaren@apple.com> 2 50 -
trunk/Source/JavaScriptCore/yarr/YarrInterpreter.cpp
r140619 r143018 1456 1456 }; 1457 1457 1458 1459 1460 1458 class ByteCompiler { 1461 1459 struct ParenthesesStackEntry { … … 1713 1711 1714 1712 unsigned numSubpatterns = lastSubpatternId - subpatternId + 1; 1715 ByteDisjunction* parenthesesDisjunction = new ByteDisjunction(numSubpatterns, callFrameSize); 1713 OwnPtr<ByteDisjunction> parenthesesDisjunction = adoptPtr(new ByteDisjunction(numSubpatterns, callFrameSize)); 1714 1715 unsigned firstTermInParentheses = beginTerm + 1; 1716 parenthesesDisjunction->terms.reserveInitialCapacity(endTerm - firstTermInParentheses + 2); 1716 1717 1717 1718 parenthesesDisjunction->terms.append(ByteTerm::SubpatternBegin()); 1718 for (unsigned termInParentheses = beginTerm + 1; termInParentheses < endTerm; ++termInParentheses)1719 for (unsigned termInParentheses = firstTermInParentheses; termInParentheses < endTerm; ++termInParentheses) 1719 1720 parenthesesDisjunction->terms.append(m_bodyDisjunction->terms[termInParentheses]); 1720 1721 parenthesesDisjunction->terms.append(ByteTerm::SubpatternEnd()); … … 1722 1723 m_bodyDisjunction->terms.shrink(beginTerm); 1723 1724 1724 m_ allParenthesesInfo.append(parenthesesDisjunction);1725 m_ bodyDisjunction->terms.append(ByteTerm(ByteTerm::TypeParenthesesSubpattern, subpatternId, parenthesesDisjunction, capture, inputPosition));1725 m_bodyDisjunction->terms.append(ByteTerm(ByteTerm::TypeParenthesesSubpattern, subpatternId, parenthesesDisjunction.get(), capture, inputPosition)); 1726 m_allParenthesesInfo.append(parenthesesDisjunction.release()); 1726 1727 1727 1728 m_bodyDisjunction->terms[beginTerm].atom.quantityCount = quantityCount.unsafeGet(); … … 1810 1811 unsigned currentCountAlreadyChecked = inputCountAlreadyChecked; 1811 1812 1812 PatternAlternative* alternative = disjunction->m_alternatives[alt] ;1813 PatternAlternative* alternative = disjunction->m_alternatives[alt].get(); 1813 1814 1814 1815 if (alt) { … … 1921 1922 unsigned m_currentAlternativeIndex; 1922 1923 Vector<ParenthesesStackEntry> m_parenthesesStack; 1923 Vector< ByteDisjunction*> m_allParenthesesInfo;1924 Vector<OwnPtr<ByteDisjunction> > m_allParenthesesInfo; 1924 1925 }; 1925 1926 -
trunk/Source/JavaScriptCore/yarr/YarrInterpreter.h
r127191 r143018 338 338 WTF_MAKE_FAST_ALLOCATED; 339 339 public: 340 BytecodePattern(PassOwnPtr<ByteDisjunction> body, Vector< ByteDisjunction*> allParenthesesInfo, YarrPattern& pattern, BumpPointerAllocator* allocator)340 BytecodePattern(PassOwnPtr<ByteDisjunction> body, Vector<OwnPtr<ByteDisjunction> >& parenthesesInfoToAdopt, YarrPattern& pattern, BumpPointerAllocator* allocator) 341 341 : m_body(body) 342 342 , m_ignoreCase(pattern.m_ignoreCase) … … 344 344 , m_allocator(allocator) 345 345 { 346 m_body->terms.shrinkToFit(); 347 346 348 newlineCharacterClass = pattern.newlineCharacterClass(); 347 349 wordcharCharacterClass = pattern.wordcharCharacterClass(); 348 350 349 m_allParenthesesInfo.append(allParenthesesInfo); 350 m_userCharacterClasses.append(pattern.m_userCharacterClasses); 351 // 'Steal' the YarrPattern's CharacterClasses! We clear its 352 // array, so that it won't delete them on destruction. We'll 353 // take responsibility for that. 354 pattern.m_userCharacterClasses.clear(); 355 } 356 357 ~BytecodePattern() 358 { 359 deleteAllValues(m_allParenthesesInfo); 360 deleteAllValues(m_userCharacterClasses); 351 m_allParenthesesInfo.swap(parenthesesInfoToAdopt); 352 m_allParenthesesInfo.shrinkToFit(); 353 354 m_userCharacterClasses.swap(pattern.m_userCharacterClasses); 355 m_userCharacterClasses.shrinkToFit(); 361 356 } 362 357 … … 372 367 373 368 private: 374 Vector< ByteDisjunction*> m_allParenthesesInfo;375 Vector< CharacterClass*> m_userCharacterClasses;369 Vector<OwnPtr<ByteDisjunction> > m_allParenthesesInfo; 370 Vector<OwnPtr<CharacterClass> > m_userCharacterClasses; 376 371 }; 377 372 -
trunk/Source/JavaScriptCore/yarr/YarrJIT.cpp
r140594 r143018 2316 2316 m_ops.last().m_previousOp = notFound; 2317 2317 m_ops.last().m_term = term; 2318 Vector< PatternAlternative*>& alternatives = term->parentheses.disjunction->m_alternatives;2318 Vector<OwnPtr<PatternAlternative> >& alternatives = term->parentheses.disjunction->m_alternatives; 2319 2319 for (unsigned i = 0; i < alternatives.size(); ++i) { 2320 2320 size_t lastOpIndex = m_ops.size() - 1; 2321 2321 2322 PatternAlternative* nestedAlternative = alternatives[i] ;2322 PatternAlternative* nestedAlternative = alternatives[i].get(); 2323 2323 opCompileAlternative(nestedAlternative); 2324 2324 … … 2367 2367 m_ops.last().m_previousOp = notFound; 2368 2368 m_ops.last().m_term = term; 2369 Vector< PatternAlternative*>& alternatives = term->parentheses.disjunction->m_alternatives;2369 Vector<OwnPtr<PatternAlternative> >& alternatives = term->parentheses.disjunction->m_alternatives; 2370 2370 for (unsigned i = 0; i < alternatives.size(); ++i) { 2371 2371 size_t lastOpIndex = m_ops.size() - 1; 2372 2372 2373 PatternAlternative* nestedAlternative = alternatives[i] ;2373 PatternAlternative* nestedAlternative = alternatives[i].get(); 2374 2374 opCompileAlternative(nestedAlternative); 2375 2375 … … 2441 2441 void opCompileBody(PatternDisjunction* disjunction) 2442 2442 { 2443 Vector< PatternAlternative*>& alternatives =disjunction->m_alternatives;2443 Vector<OwnPtr<PatternAlternative> >& alternatives = disjunction->m_alternatives; 2444 2444 size_t currentAlternativeIndex = 0; 2445 2445 … … 2451 2451 do { 2452 2452 size_t lastOpIndex = m_ops.size() - 1; 2453 PatternAlternative* alternative = alternatives[currentAlternativeIndex] ;2453 PatternAlternative* alternative = alternatives[currentAlternativeIndex].get(); 2454 2454 opCompileAlternative(alternative); 2455 2455 … … 2486 2486 do { 2487 2487 size_t lastOpIndex = m_ops.size() - 1; 2488 PatternAlternative* alternative = alternatives[currentAlternativeIndex] ;2488 PatternAlternative* alternative = alternatives[currentAlternativeIndex].get(); 2489 2489 ASSERT(!alternative->onceThrough()); 2490 2490 opCompileAlternative(alternative); -
trunk/Source/JavaScriptCore/yarr/YarrPattern.cpp
r140594 r143018 176 176 } 177 177 178 CharacterClass*charClass()179 { 180 CharacterClass* characterClass = new CharacterClass(0);178 PassOwnPtr<CharacterClass> charClass() 179 { 180 OwnPtr<CharacterClass> characterClass = adoptPtr(new CharacterClass(0)); 181 181 182 182 characterClass->m_matches.swap(m_matches); … … 185 185 characterClass->m_rangesUnicode.swap(m_rangesUnicode); 186 186 187 return characterClass ;187 return characterClass.release(); 188 188 } 189 189 … … 275 275 , m_invertParentheticalAssertion(false) 276 276 { 277 m_pattern.m_body = new PatternDisjunction(); 278 m_alternative = m_pattern.m_body->addNewAlternative(); 279 m_pattern.m_disjunctions.append(m_pattern.m_body); 277 OwnPtr<PatternDisjunction> body = adoptPtr(new PatternDisjunction); 278 m_pattern.m_body = body.get(); 279 m_alternative = body->addNewAlternative(); 280 m_pattern.m_disjunctions.append(body.release()); 280 281 } 281 282 … … 289 290 m_characterClassConstructor.reset(); 290 291 291 m_pattern.m_body = new PatternDisjunction(); 292 m_alternative = m_pattern.m_body->addNewAlternative(); 293 m_pattern.m_disjunctions.append(m_pattern.m_body); 292 OwnPtr<PatternDisjunction> body = adoptPtr(new PatternDisjunction); 293 m_pattern.m_body = body.get(); 294 m_alternative = body->addNewAlternative(); 295 m_pattern.m_disjunctions.append(body.release()); 294 296 } 295 297 … … 328 330 329 331 m_characterClassConstructor.putUnicodeIgnoreCase(ch, info); 330 CharacterClass*newCharacterClass = m_characterClassConstructor.charClass();331 m_ pattern.m_userCharacterClasses.append(newCharacterClass);332 m_ alternative->m_terms.append(PatternTerm(newCharacterClass, false));332 OwnPtr<CharacterClass> newCharacterClass = m_characterClassConstructor.charClass(); 333 m_alternative->m_terms.append(PatternTerm(newCharacterClass.get(), false)); 334 m_pattern.m_userCharacterClasses.append(newCharacterClass.release()); 333 335 } 334 336 … … 390 392 void atomCharacterClassEnd() 391 393 { 392 CharacterClass*newCharacterClass = m_characterClassConstructor.charClass();393 m_ pattern.m_userCharacterClasses.append(newCharacterClass);394 m_ alternative->m_terms.append(PatternTerm(newCharacterClass, m_invertCharacterClass));394 OwnPtr<CharacterClass> newCharacterClass = m_characterClassConstructor.charClass(); 395 m_alternative->m_terms.append(PatternTerm(newCharacterClass.get(), m_invertCharacterClass)); 396 m_pattern.m_userCharacterClasses.append(newCharacterClass.release()); 395 397 } 396 398 … … 401 403 m_pattern.m_numSubpatterns++; 402 404 403 PatternDisjunction* parenthesesDisjunction = new PatternDisjunction(m_alternative); 404 m_pattern.m_disjunctions.append(parenthesesDisjunction); 405 m_alternative->m_terms.append(PatternTerm(PatternTerm::TypeParenthesesSubpattern, subpatternId, parenthesesDisjunction, capture, false)); 405 OwnPtr<PatternDisjunction> parenthesesDisjunction = adoptPtr(new PatternDisjunction(m_alternative)); 406 m_alternative->m_terms.append(PatternTerm(PatternTerm::TypeParenthesesSubpattern, subpatternId, parenthesesDisjunction.get(), capture, false)); 406 407 m_alternative = parenthesesDisjunction->addNewAlternative(); 408 m_pattern.m_disjunctions.append(parenthesesDisjunction.release()); 407 409 } 408 410 409 411 void atomParentheticalAssertionBegin(bool invert = false) 410 412 { 411 PatternDisjunction* parenthesesDisjunction = new PatternDisjunction(m_alternative); 412 m_pattern.m_disjunctions.append(parenthesesDisjunction); 413 m_alternative->m_terms.append(PatternTerm(PatternTerm::TypeParentheticalAssertion, m_pattern.m_numSubpatterns + 1, parenthesesDisjunction, false, invert)); 413 OwnPtr<PatternDisjunction> parenthesesDisjunction = adoptPtr(new PatternDisjunction(m_alternative)); 414 m_alternative->m_terms.append(PatternTerm(PatternTerm::TypeParentheticalAssertion, m_pattern.m_numSubpatterns + 1, parenthesesDisjunction.get(), false, invert)); 414 415 m_alternative = parenthesesDisjunction->addNewAlternative(); 415 416 m_invertParentheticalAssertion = invert; 417 m_pattern.m_disjunctions.append(parenthesesDisjunction.release()); 416 418 } 417 419 … … 478 480 PatternDisjunction* copyDisjunction(PatternDisjunction* disjunction, bool filterStartsWithBOL = false) 479 481 { 480 PatternDisjunction* newDisjunction = 0;482 OwnPtr<PatternDisjunction> newDisjunction; 481 483 for (unsigned alt = 0; alt < disjunction->m_alternatives.size(); ++alt) { 482 PatternAlternative* alternative = disjunction->m_alternatives[alt] ;484 PatternAlternative* alternative = disjunction->m_alternatives[alt].get(); 483 485 if (!filterStartsWithBOL || !alternative->m_startsWithBOL) { 484 486 if (!newDisjunction) { 485 newDisjunction = new PatternDisjunction();487 newDisjunction = adoptPtr(new PatternDisjunction()); 486 488 newDisjunction->m_parent = disjunction->m_parent; 487 489 } 488 490 PatternAlternative* newAlternative = newDisjunction->addNewAlternative(); 491 newAlternative->m_terms.reserveInitialCapacity(alternative->m_terms.size()); 489 492 for (unsigned i = 0; i < alternative->m_terms.size(); ++i) 490 493 newAlternative->m_terms.append(copyTerm(alternative->m_terms[i], filterStartsWithBOL)); … … 492 495 } 493 496 494 if (newDisjunction) 495 m_pattern.m_disjunctions.append(newDisjunction); 496 return newDisjunction; 497 if (!newDisjunction) 498 return 0; 499 500 PatternDisjunction* copiedDisjunction = newDisjunction.get(); 501 m_pattern.m_disjunctions.append(newDisjunction.release()); 502 return copiedDisjunction; 497 503 } 498 504 … … 656 662 657 663 for (unsigned alt = 0; alt < disjunction->m_alternatives.size(); ++alt) { 658 PatternAlternative* alternative = disjunction->m_alternatives[alt] ;664 PatternAlternative* alternative = disjunction->m_alternatives[alt].get(); 659 665 unsigned currentAlternativeCallFrameSize = setupAlternativeOffsets(alternative, initialCallFrameSize, initialInputPosition); 660 666 minimumInputSize = std::min(minimumInputSize, alternative->m_minimumSize); … … 691 697 return; 692 698 693 Vector< PatternAlternative*>& alternatives = m_pattern.m_body->m_alternatives;699 Vector<OwnPtr<PatternAlternative> >& alternatives = m_pattern.m_body->m_alternatives; 694 700 for (size_t i = 0; i < alternatives.size(); ++i) { 695 701 Vector<PatternTerm>& terms = alternatives[i]->m_terms; … … 726 732 // Move alternatives from loopDisjunction to disjunction 727 733 for (unsigned alt = 0; alt < loopDisjunction->m_alternatives.size(); ++alt) 728 disjunction->m_alternatives.append(loopDisjunction->m_alternatives[alt] );734 disjunction->m_alternatives.append(loopDisjunction->m_alternatives[alt].release()); 729 735 730 736 loopDisjunction->m_alternatives.clear(); … … 745 751 PatternDisjunction* nestedDisjunction = term.parentheses.disjunction; 746 752 for (unsigned alt = 0; alt < nestedDisjunction->m_alternatives.size(); ++alt) { 747 if (containsCapturingTerms(nestedDisjunction->m_alternatives[alt] , 0, nestedDisjunction->m_alternatives[alt]->m_terms.size() - 1))753 if (containsCapturingTerms(nestedDisjunction->m_alternatives[alt].get(), 0, nestedDisjunction->m_alternatives[alt]->m_terms.size() - 1)) 748 754 return true; 749 755 } … … 761 767 void optimizeDotStarWrappedExpressions() 762 768 { 763 Vector< PatternAlternative*>& alternatives = m_pattern.m_body->m_alternatives;769 Vector<OwnPtr<PatternAlternative> >& alternatives = m_pattern.m_body->m_alternatives; 764 770 if (alternatives.size() != 1) 765 771 return; 766 772 767 PatternAlternative* alternative = alternatives[0] ;773 PatternAlternative* alternative = alternatives[0].get(); 768 774 Vector<PatternTerm>& terms = alternative->m_terms; 769 775 if (terms.size() >= 3) { -
trunk/Source/JavaScriptCore/yarr/YarrPattern.h
r127191 r143018 29 29 30 30 #include <wtf/CheckedArithmetic.h> 31 #include <wtf/OwnPtr.h> 32 #include <wtf/PassOwnPtr.h> 31 33 #include <wtf/RefCounted.h> 32 34 #include <wtf/Vector.h> … … 276 278 } 277 279 278 ~PatternDisjunction()279 {280 deleteAllValues(m_alternatives);281 }282 283 280 PatternAlternative* addNewAlternative() 284 281 { 285 282 PatternAlternative* alternative = new PatternAlternative(this); 286 m_alternatives.append(a lternative);283 m_alternatives.append(adoptPtr(alternative)); 287 284 return alternative; 288 285 } 289 286 290 Vector< PatternAlternative*> m_alternatives;287 Vector<OwnPtr<PatternAlternative> > m_alternatives; 291 288 PatternAlternative* m_parent; 292 289 unsigned m_minimumSize; … … 319 316 JS_EXPORT_PRIVATE YarrPattern(const String& pattern, bool ignoreCase, bool multiline, const char** error); 320 317 321 ~YarrPattern()322 {323 deleteAllValues(m_disjunctions);324 deleteAllValues(m_userCharacterClasses);325 }326 327 318 void reset() 328 319 { … … 341 332 nonwordcharCached = 0; 342 333 343 deleteAllValues(m_disjunctions);344 334 m_disjunctions.clear(); 345 deleteAllValues(m_userCharacterClasses);346 335 m_userCharacterClasses.clear(); 347 336 } … … 355 344 { 356 345 if (!newlineCached) 357 m_userCharacterClasses.append( newlineCached = newlineCreate());346 m_userCharacterClasses.append(adoptPtr(newlineCached = newlineCreate())); 358 347 return newlineCached; 359 348 } … … 361 350 { 362 351 if (!digitsCached) 363 m_userCharacterClasses.append( digitsCached = digitsCreate());352 m_userCharacterClasses.append(adoptPtr(digitsCached = digitsCreate())); 364 353 return digitsCached; 365 354 } … … 367 356 { 368 357 if (!spacesCached) 369 m_userCharacterClasses.append( spacesCached = spacesCreate());358 m_userCharacterClasses.append(adoptPtr(spacesCached = spacesCreate())); 370 359 return spacesCached; 371 360 } … … 373 362 { 374 363 if (!wordcharCached) 375 m_userCharacterClasses.append( wordcharCached = wordcharCreate());364 m_userCharacterClasses.append(adoptPtr(wordcharCached = wordcharCreate())); 376 365 return wordcharCached; 377 366 } … … 379 368 { 380 369 if (!nondigitsCached) 381 m_userCharacterClasses.append( nondigitsCached = nondigitsCreate());370 m_userCharacterClasses.append(adoptPtr(nondigitsCached = nondigitsCreate())); 382 371 return nondigitsCached; 383 372 } … … 385 374 { 386 375 if (!nonspacesCached) 387 m_userCharacterClasses.append( nonspacesCached = nonspacesCreate());376 m_userCharacterClasses.append(adoptPtr(nonspacesCached = nonspacesCreate())); 388 377 return nonspacesCached; 389 378 } … … 391 380 { 392 381 if (!nonwordcharCached) 393 m_userCharacterClasses.append( nonwordcharCached = nonwordcharCreate());382 m_userCharacterClasses.append(adoptPtr(nonwordcharCached = nonwordcharCreate())); 394 383 return nonwordcharCached; 395 384 } … … 402 391 unsigned m_maxBackReference; 403 392 PatternDisjunction* m_body; 404 Vector< PatternDisjunction*, 4> m_disjunctions;405 Vector< CharacterClass*> m_userCharacterClasses;393 Vector<OwnPtr<PatternDisjunction>, 4> m_disjunctions; 394 Vector<OwnPtr<CharacterClass> > m_userCharacterClasses; 406 395 407 396 private:
Note: See TracChangeset
for help on using the changeset viewer.