Changeset 170697 in webkit
- Timestamp:
- Jul 1, 2014, 9:49:39 PM (12 years ago)
- Location:
- trunk/Source
- Files:
-
- 7 edited
-
WTF/ChangeLog (modified) (1 diff)
-
WTF/wtf/Deque.h (modified) (42 diffs)
-
WebCore/ChangeLog (modified) (1 diff)
-
WebCore/cssjit/FunctionCall.h (modified) (3 diffs)
-
WebCore/cssjit/RegisterAllocator.h (modified) (1 diff)
-
WebCore/cssjit/SelectorCompiler.cpp (modified) (6 diffs)
-
WebCore/cssjit/StackAllocator.h (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WTF/ChangeLog
r170630 r170697 1 2014-07-01 Alex Christensen <achristensen@webkit.org> 2 3 Reduce dynamic memory allocation in css jit. 4 https://bugs.webkit.org/show_bug.cgi?id=134416 5 6 Reviewed by Benjamin Poulain. 7 8 * wtf/Deque.h: 9 Added inlineCapacity optional template parameter. 10 1 11 2014-06-30 Commit Queue <commit-queue@webkit.org> 2 12 -
trunk/Source/WTF/wtf/Deque.h
r170630 r170697 39 39 namespace WTF { 40 40 41 template<typename T > class DequeIteratorBase;42 template<typename T > class DequeIterator;43 template<typename T > class DequeConstIterator;44 45 template<typename T >41 template<typename T, size_t inlineCapacity> class DequeIteratorBase; 42 template<typename T, size_t inlineCapacity> class DequeIterator; 43 template<typename T, size_t inlineCapacity> class DequeConstIterator; 44 45 template<typename T, size_t inlineCapacity = 0> 46 46 class Deque { 47 47 WTF_MAKE_FAST_ALLOCATED; 48 48 public: 49 typedef DequeIterator<T > iterator;50 typedef DequeConstIterator<T > const_iterator;49 typedef DequeIterator<T, inlineCapacity> iterator; 50 typedef DequeConstIterator<T, inlineCapacity> const_iterator; 51 51 typedef std::reverse_iterator<iterator> reverse_iterator; 52 52 typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 53 53 54 54 Deque(); 55 Deque(const Deque<T >&);56 Deque& operator=(const Deque<T >&);55 Deque(const Deque<T, inlineCapacity>&); 56 Deque& operator=(const Deque<T, inlineCapacity>&); 57 57 ~Deque(); 58 58 59 void swap(Deque<T >&);59 void swap(Deque<T, inlineCapacity>&); 60 60 61 61 size_t size() const { return m_start <= m_end ? m_end - m_start : m_end + m_buffer.capacity() - m_start; } … … 92 92 93 93 private: 94 friend class DequeIteratorBase<T >;95 96 typedef VectorBuffer<T, 0> Buffer;94 friend class DequeIteratorBase<T, inlineCapacity>; 95 96 typedef VectorBuffer<T, inlineCapacity> Buffer; 97 97 typedef VectorTypeOperations<T> TypeOperations; 98 typedef DequeIteratorBase<T > IteratorBase;98 typedef DequeIteratorBase<T, inlineCapacity> IteratorBase; 99 99 100 100 void remove(size_t position); … … 114 114 }; 115 115 116 template<typename T >116 template<typename T, size_t inlineCapacity> 117 117 class DequeIteratorBase { 118 118 protected: 119 119 DequeIteratorBase(); 120 DequeIteratorBase(const Deque<T >*, size_t);120 DequeIteratorBase(const Deque<T, inlineCapacity>*, size_t); 121 121 DequeIteratorBase(const DequeIteratorBase&); 122 122 DequeIteratorBase& operator=(const DequeIteratorBase&); … … 139 139 void checkValidity(const DequeIteratorBase&) const; 140 140 141 Deque<T >* m_deque;141 Deque<T, inlineCapacity>* m_deque; 142 142 size_t m_index; 143 143 144 friend class Deque<T >;144 friend class Deque<T, inlineCapacity>; 145 145 146 146 #ifndef NDEBUG … … 150 150 }; 151 151 152 template<typename T >153 class DequeIterator : public DequeIteratorBase<T > {152 template<typename T, size_t inlineCapacity> 153 class DequeIterator : public DequeIteratorBase<T, inlineCapacity> { 154 154 private: 155 typedef DequeIteratorBase<T > Base;156 typedef DequeIterator<T > Iterator;155 typedef DequeIteratorBase<T, inlineCapacity> Base; 156 typedef DequeIterator<T, inlineCapacity> Iterator; 157 157 158 158 public: … … 163 163 typedef std::bidirectional_iterator_tag iterator_category; 164 164 165 DequeIterator(Deque<T>* deque, size_t index) : Base(deque, index) { } 165 DequeIterator(Deque<T, inlineCapacity>* deque, size_t index) 166 : Base(deque, index) { } 166 167 167 168 DequeIterator(const Iterator& other) : Base(other) { } … … 180 181 }; 181 182 182 template<typename T >183 class DequeConstIterator : public DequeIteratorBase<T > {183 template<typename T, size_t inlineCapacity> 184 class DequeConstIterator : public DequeIteratorBase<T, inlineCapacity> { 184 185 private: 185 typedef DequeIteratorBase<T > Base;186 typedef DequeConstIterator<T > Iterator;187 typedef DequeIterator<T > NonConstIterator;186 typedef DequeIteratorBase<T, inlineCapacity> Base; 187 typedef DequeConstIterator<T, inlineCapacity> Iterator; 188 typedef DequeIterator<T, inlineCapacity> NonConstIterator; 188 189 189 190 public: … … 194 195 typedef std::bidirectional_iterator_tag iterator_category; 195 196 196 DequeConstIterator(const Deque<T>* deque, size_t index) : Base(deque, index) { } 197 DequeConstIterator(const Deque<T, inlineCapacity>* deque, size_t index) 198 : Base(deque, index) { } 197 199 198 200 DequeConstIterator(const Iterator& other) : Base(other) { } … … 214 216 215 217 #ifdef NDEBUG 216 template<typename T > inline void Deque<T>::checkValidity() const { }217 template<typename T > inline void Deque<T>::checkIndexValidity(size_t) const { }218 template<typename T > inline void Deque<T>::invalidateIterators() { }218 template<typename T, size_t inlineCapacity> inline void Deque<T, inlineCapacity>::checkValidity() const { } 219 template<typename T, size_t inlineCapacity> inline void Deque<T, inlineCapacity>::checkIndexValidity(size_t) const { } 220 template<typename T, size_t inlineCapacity> inline void Deque<T, inlineCapacity>::invalidateIterators() { } 219 221 #else 220 template<typename T >221 void Deque<T >::checkValidity() const222 template<typename T, size_t inlineCapacity> 223 void Deque<T, inlineCapacity>::checkValidity() const 222 224 { 223 225 // In this implementation a capacity of 1 would confuse append() and … … 234 236 } 235 237 236 template<typename T >237 void Deque<T >::checkIndexValidity(size_t index) const238 template<typename T, size_t inlineCapacity> 239 void Deque<T, inlineCapacity>::checkIndexValidity(size_t index) const 238 240 { 239 241 ASSERT_UNUSED(index, index <= m_buffer.capacity()); … … 246 248 } 247 249 248 template<typename T >249 void Deque<T >::invalidateIterators()250 template<typename T, size_t inlineCapacity> 251 void Deque<T, inlineCapacity>::invalidateIterators() 250 252 { 251 253 IteratorBase* next; … … 260 262 #endif 261 263 262 template<typename T >263 inline Deque<T >::Deque()264 template<typename T, size_t inlineCapacity> 265 inline Deque<T, inlineCapacity>::Deque() 264 266 : m_start(0) 265 267 , m_end(0) … … 271 273 } 272 274 273 template<typename T >274 inline Deque<T >::Deque(const Deque<T>& other)275 template<typename T, size_t inlineCapacity> 276 inline Deque<T, inlineCapacity>::Deque(const Deque<T, inlineCapacity>& other) 275 277 : m_start(other.m_start) 276 278 , m_end(other.m_end) … … 289 291 } 290 292 291 template<typename T >292 inline Deque<T >& Deque<T>::operator=(const Deque<T>& other)293 template<typename T, size_t inlineCapacity> 294 inline Deque<T, inlineCapacity>& Deque<T, inlineCapacity>::operator=(const Deque<T, inlineCapacity>& other) 293 295 { 294 296 // FIXME: This is inefficient if we're using an inline buffer and T is 295 297 // expensive to copy since it will copy the buffer twice instead of once. 296 Deque<T > copy(other);298 Deque<T, inlineCapacity> copy(other); 297 299 swap(copy); 298 300 return *this; 299 301 } 300 302 301 template<typename T >302 inline void Deque<T >::destroyAll()303 template<typename T, size_t inlineCapacity> 304 inline void Deque<T, inlineCapacity>::destroyAll() 303 305 { 304 306 if (m_start <= m_end) … … 310 312 } 311 313 312 template<typename T >313 inline Deque<T >::~Deque()314 template<typename T, size_t inlineCapacity> 315 inline Deque<T, inlineCapacity>::~Deque() 314 316 { 315 317 checkValidity(); … … 318 320 } 319 321 320 template<typename T >321 inline void Deque<T >::swap(Deque<T>& other)322 template<typename T, size_t inlineCapacity> 323 inline void Deque<T, inlineCapacity>::swap(Deque<T, inlineCapacity>& other) 322 324 { 323 325 checkValidity(); … … 331 333 } 332 334 333 template<typename T >334 inline void Deque<T >::clear()335 template<typename T, size_t inlineCapacity> 336 inline void Deque<T, inlineCapacity>::clear() 335 337 { 336 338 checkValidity(); … … 343 345 } 344 346 345 template<typename T >347 template<typename T, size_t inlineCapacity> 346 348 template<typename Predicate> 347 inline auto Deque<T >::findIf(Predicate&& predicate) -> iterator349 inline auto Deque<T, inlineCapacity>::findIf(Predicate&& predicate) -> iterator 348 350 { 349 351 iterator end_iterator = end(); … … 355 357 } 356 358 357 template<typename T >358 inline void Deque<T >::expandCapacityIfNeeded()359 template<typename T, size_t inlineCapacity> 360 inline void Deque<T, inlineCapacity>::expandCapacityIfNeeded() 359 361 { 360 362 if (m_start) { … … 370 372 } 371 373 372 template<typename T >373 void Deque<T >::expandCapacity()374 template<typename T, size_t inlineCapacity> 375 void Deque<T, inlineCapacity>::expandCapacity() 374 376 { 375 377 checkValidity(); … … 389 391 } 390 392 391 template<typename T >392 inline auto Deque<T >::takeFirst() -> T393 template<typename T, size_t inlineCapacity> 394 inline auto Deque<T, inlineCapacity>::takeFirst() -> T 393 395 { 394 396 T oldFirst = std::move(first()); … … 397 399 } 398 400 399 template<typename T >400 inline auto Deque<T >::takeLast() -> T401 template<typename T, size_t inlineCapacity> 402 inline auto Deque<T, inlineCapacity>::takeLast() -> T 401 403 { 402 404 T oldLast = std::move(last()); … … 405 407 } 406 408 407 template<typename T > template<typename U>408 inline void Deque<T >::append(U&& value)409 template<typename T, size_t inlineCapacity> template<typename U> 410 inline void Deque<T, inlineCapacity>::append(U&& value) 409 411 { 410 412 checkValidity(); … … 418 420 } 419 421 420 template<typename T > template<typename U>421 inline void Deque<T >::prepend(U&& value)422 template<typename T, size_t inlineCapacity> template<typename U> 423 inline void Deque<T, inlineCapacity>::prepend(U&& value) 422 424 { 423 425 checkValidity(); … … 431 433 } 432 434 433 template<typename T >434 inline void Deque<T >::removeFirst()435 template<typename T, size_t inlineCapacity> 436 inline void Deque<T, inlineCapacity>::removeFirst() 435 437 { 436 438 checkValidity(); … … 445 447 } 446 448 447 template<typename T >448 inline void Deque<T >::removeLast()449 template<typename T, size_t inlineCapacity> 450 inline void Deque<T, inlineCapacity>::removeLast() 449 451 { 450 452 checkValidity(); … … 459 461 } 460 462 461 template<typename T >462 inline void Deque<T >::remove(iterator& it)463 template<typename T, size_t inlineCapacity> 464 inline void Deque<T, inlineCapacity>::remove(iterator& it) 463 465 { 464 466 it.checkValidity(); … … 466 468 } 467 469 468 template<typename T >469 inline void Deque<T >::remove(const_iterator& it)470 template<typename T, size_t inlineCapacity> 471 inline void Deque<T, inlineCapacity>::remove(const_iterator& it) 470 472 { 471 473 it.checkValidity(); … … 473 475 } 474 476 475 template<typename T >476 inline void Deque<T >::remove(size_t position)477 template<typename T, size_t inlineCapacity> 478 inline void Deque<T, inlineCapacity>::remove(size_t position) 477 479 { 478 480 if (position == m_end) … … 497 499 498 500 #ifdef NDEBUG 499 template<typename T > inline void DequeIteratorBase<T>::checkValidity() const { }500 template<typename T > inline void DequeIteratorBase<T>::checkValidity(const DequeIteratorBase<T>&) const { }501 template<typename T > inline void DequeIteratorBase<T>::addToIteratorsList() { }502 template<typename T > inline void DequeIteratorBase<T>::removeFromIteratorsList() { }501 template<typename T, size_t inlineCapacity> inline void DequeIteratorBase<T, inlineCapacity>::checkValidity() const { } 502 template<typename T, size_t inlineCapacity> inline void DequeIteratorBase<T, inlineCapacity>::checkValidity(const DequeIteratorBase<T, inlineCapacity>&) const { } 503 template<typename T, size_t inlineCapacity> inline void DequeIteratorBase<T, inlineCapacity>::addToIteratorsList() { } 504 template<typename T, size_t inlineCapacity> inline void DequeIteratorBase<T, inlineCapacity>::removeFromIteratorsList() { } 503 505 #else 504 template<typename T >505 void DequeIteratorBase<T >::checkValidity() const506 template<typename T, size_t inlineCapacity> 507 void DequeIteratorBase<T, inlineCapacity>::checkValidity() const 506 508 { 507 509 ASSERT(m_deque); … … 509 511 } 510 512 511 template<typename T >512 void DequeIteratorBase<T >::checkValidity(const DequeIteratorBase& other) const513 template<typename T, size_t inlineCapacity> 514 void DequeIteratorBase<T, inlineCapacity>::checkValidity(const DequeIteratorBase& other) const 513 515 { 514 516 checkValidity(); … … 517 519 } 518 520 519 template<typename T >520 void DequeIteratorBase<T >::addToIteratorsList()521 template<typename T, size_t inlineCapacity> 522 void DequeIteratorBase<T, inlineCapacity>::addToIteratorsList() 521 523 { 522 524 if (!m_deque) … … 531 533 } 532 534 533 template<typename T >534 void DequeIteratorBase<T >::removeFromIteratorsList()535 template<typename T, size_t inlineCapacity> 536 void DequeIteratorBase<T, inlineCapacity>::removeFromIteratorsList() 535 537 { 536 538 if (!m_deque) { … … 556 558 #endif 557 559 558 template<typename T >559 inline DequeIteratorBase<T >::DequeIteratorBase()560 template<typename T, size_t inlineCapacity> 561 inline DequeIteratorBase<T, inlineCapacity>::DequeIteratorBase() 560 562 : m_deque(0) 561 563 { 562 564 } 563 565 564 template<typename T >565 inline DequeIteratorBase<T >::DequeIteratorBase(const Deque<T>* deque, size_t index)566 : m_deque(const_cast<Deque<T >*>(deque))566 template<typename T, size_t inlineCapacity> 567 inline DequeIteratorBase<T, inlineCapacity>::DequeIteratorBase(const Deque<T, inlineCapacity>* deque, size_t index) 568 : m_deque(const_cast<Deque<T, inlineCapacity>*>(deque)) 567 569 , m_index(index) 568 570 { … … 571 573 } 572 574 573 template<typename T >574 inline DequeIteratorBase<T >::DequeIteratorBase(const DequeIteratorBase& other)575 template<typename T, size_t inlineCapacity> 576 inline DequeIteratorBase<T, inlineCapacity>::DequeIteratorBase(const DequeIteratorBase& other) 575 577 : m_deque(other.m_deque) 576 578 , m_index(other.m_index) … … 580 582 } 581 583 582 template<typename T >583 inline DequeIteratorBase<T >& DequeIteratorBase<T>::operator=(const DequeIteratorBase& other)584 template<typename T, size_t inlineCapacity> 585 inline DequeIteratorBase<T, inlineCapacity>& DequeIteratorBase<T, inlineCapacity>::operator=(const DequeIteratorBase& other) 584 586 { 585 587 other.checkValidity(); … … 593 595 } 594 596 595 template<typename T >596 inline DequeIteratorBase<T >::~DequeIteratorBase()597 template<typename T, size_t inlineCapacity> 598 inline DequeIteratorBase<T, inlineCapacity>::~DequeIteratorBase() 597 599 { 598 600 #ifndef NDEBUG … … 602 604 } 603 605 604 template<typename T >605 inline bool DequeIteratorBase<T >::isEqual(const DequeIteratorBase& other) const606 template<typename T, size_t inlineCapacity> 607 inline bool DequeIteratorBase<T, inlineCapacity>::isEqual(const DequeIteratorBase& other) const 606 608 { 607 609 checkValidity(other); … … 609 611 } 610 612 611 template<typename T >612 inline void DequeIteratorBase<T >::increment()613 template<typename T, size_t inlineCapacity> 614 inline void DequeIteratorBase<T, inlineCapacity>::increment() 613 615 { 614 616 checkValidity(); … … 622 624 } 623 625 624 template<typename T >625 inline void DequeIteratorBase<T >::decrement()626 template<typename T, size_t inlineCapacity> 627 inline void DequeIteratorBase<T, inlineCapacity>::decrement() 626 628 { 627 629 checkValidity(); … … 635 637 } 636 638 637 template<typename T >638 inline T* DequeIteratorBase<T >::after() const639 template<typename T, size_t inlineCapacity> 640 inline T* DequeIteratorBase<T, inlineCapacity>::after() const 639 641 { 640 642 checkValidity(); … … 643 645 } 644 646 645 template<typename T >646 inline T* DequeIteratorBase<T >::before() const647 template<typename T, size_t inlineCapacity> 648 inline T* DequeIteratorBase<T, inlineCapacity>::before() const 647 649 { 648 650 checkValidity(); -
trunk/Source/WebCore/ChangeLog
r170694 r170697 1 2014-07-01 Alex Christensen <achristensen@webkit.org> 2 3 Reduce dynamic memory allocation in css jit. 4 https://bugs.webkit.org/show_bug.cgi?id=134416 5 6 Reviewed by Benjamin Poulain. 7 8 * cssjit/FunctionCall.h: 9 (WebCore::FunctionCall::saveAllocatedRegisters): 10 * cssjit/RegisterAllocator.h: 11 * cssjit/SelectorCompiler.cpp: 12 (WebCore::SelectorCompiler::addPseudoClassType): 13 (WebCore::SelectorCompiler::SelectorCodeGenerator::generateSelectorChecker): 14 (WebCore::SelectorCompiler::SelectorCodeGenerator::generateElementIsNthChild): 15 * cssjit/StackAllocator.h: 16 (WebCore::StackAllocator::push): 17 (WebCore::StackAllocator::pop): 18 Use inlineCapacity template parameter to reduce malloc calls. 19 I use 32 as the inline capacity for non-register related vectors because that 20 is probably big enough for the selector compiler, and if it is not then a malloc 21 call will not be significant because the selector is very complex. 22 1 23 2014-07-01 Eric Carlson <eric.carlson@apple.com> 2 24 -
trunk/Source/WebCore/cssjit/FunctionCall.h
r170630 r170697 38 38 class FunctionCall { 39 39 public: 40 FunctionCall(JSC::MacroAssembler& assembler, RegisterAllocator& registerAllocator, StackAllocator& stackAllocator, Vector<std::pair<JSC::MacroAssembler::Call, JSC::FunctionPtr> >& callRegistry)40 FunctionCall(JSC::MacroAssembler& assembler, RegisterAllocator& registerAllocator, StackAllocator& stackAllocator, Vector<std::pair<JSC::MacroAssembler::Call, JSC::FunctionPtr>, 32>& callRegistry) 41 41 : m_assembler(assembler) 42 42 , m_registerAllocator(registerAllocator) … … 168 168 m_savedRegisters.append(registerID); 169 169 } 170 Vector<StackAllocator::StackReference > stackReferences = m_stackAllocator.push(m_savedRegisters);170 Vector<StackAllocator::StackReference, registerCount> stackReferences = m_stackAllocator.push(m_savedRegisters); 171 171 m_savedRegisterStackReferences.appendVector(stackReferences); 172 172 } … … 181 181 RegisterAllocator& m_registerAllocator; 182 182 StackAllocator& m_stackAllocator; 183 Vector<std::pair<JSC::MacroAssembler::Call, JSC::FunctionPtr> >& m_callRegistry;183 Vector<std::pair<JSC::MacroAssembler::Call, JSC::FunctionPtr>, 32>& m_callRegistry; 184 184 185 185 Vector<JSC::MacroAssembler::RegisterID, registerCount> m_savedRegisters; -
trunk/Source/WebCore/cssjit/RegisterAllocator.h
r170630 r170697 206 206 207 207 private: 208 Deque<JSC::MacroAssembler::RegisterID > m_registers;208 Deque<JSC::MacroAssembler::RegisterID, registerCount> m_registers; 209 209 Vector<JSC::MacroAssembler::RegisterID, registerCount> m_allocatedRegisters; 210 210 Vector<JSC::MacroAssembler::RegisterID, calleeSavedRegisterCount> m_reservedCalleeSavedRegisters; -
trunk/Source/WebCore/cssjit/SelectorCompiler.cpp
r170630 r170697 160 160 const AtomicString* id; 161 161 const AtomicString* langFilter; 162 Vector<const AtomicStringImpl*, 1> classNames;162 Vector<const AtomicStringImpl*, 32> classNames; 163 163 HashSet<unsigned> pseudoClasses; 164 Vector<JSC::FunctionPtr > unoptimizedPseudoClasses;165 Vector<AttributeMatchingInfo > attributes;166 Vector<std::pair<int, int> > nthChildFilters;164 Vector<JSC::FunctionPtr, 32> unoptimizedPseudoClasses; 165 Vector<AttributeMatchingInfo, 32> attributes; 166 Vector<std::pair<int, int>, 32> nthChildFilters; 167 167 Vector<SelectorFragment> notFilters; 168 168 Vector<Vector<SelectorFragment>> anyFilters; … … 193 193 194 194 typedef JSC::MacroAssembler Assembler; 195 typedef Vector<SelectorFragment, 8> SelectorFragmentList;196 typedef Vector<TagNamePattern, 8> TagNameList;195 typedef Vector<SelectorFragment, 32> SelectorFragmentList; 196 typedef Vector<TagNamePattern, 32> TagNameList; 197 197 198 198 class SelectorCodeGenerator { … … 266 266 bool generatePrologue(); 267 267 void generateEpilogue(); 268 Vector<StackAllocator::StackReference > m_prologueStackReferences;268 Vector<StackAllocator::StackReference, registerCount> m_prologueStackReferences; 269 269 270 270 Assembler m_assembler; 271 271 RegisterAllocator m_registerAllocator; 272 272 StackAllocator m_stackAllocator; 273 Vector<std::pair<Assembler::Call, JSC::FunctionPtr> > m_functionCalls;273 Vector<std::pair<Assembler::Call, JSC::FunctionPtr>, 32> m_functionCalls; 274 274 275 275 SelectorContext m_selectorContext; … … 477 477 case CSSSelector::PseudoClassAny: 478 478 { 479 Vector<SelectorFragment > anyFragments;479 Vector<SelectorFragment, 32> anyFragments; 480 480 FunctionType functionType = FunctionType::SimpleSelectorChecker; 481 481 for (const CSSSelector* rootSelector = selector.selectorList()->first(); rootSelector; rootSelector = CSSSelectorList::next(rootSelector)) { … … 1167 1167 void SelectorCodeGenerator::generateSelectorChecker() 1168 1168 { 1169 Vector<StackAllocator::StackReference > calleeSavedRegisterStackReferences;1169 Vector<StackAllocator::StackReference, calleeSavedRegisterCount> calleeSavedRegisterStackReferences; 1170 1170 bool reservedCalleeSavedRegisters = false; 1171 1171 unsigned availableRegisterCount = m_registerAllocator.availableRegisterCount(); … … 2583 2583 generateWalkToParentElement(failureCases, parentElement); 2584 2584 2585 Vector<std::pair<int, int> > validSubsetFilters;2585 Vector<std::pair<int, int>, 32> validSubsetFilters; 2586 2586 validSubsetFilters.reserveInitialCapacity(fragment.nthChildFilters.size()); 2587 2587 for (const auto& slot : fragment.nthChildFilters) { -
trunk/Source/WebCore/cssjit/StackAllocator.h
r170630 r170697 29 29 #if ENABLE(CSS_SELECTOR_JIT) 30 30 31 #include "RegisterAllocator.h" 31 32 #include <JavaScriptCore/MacroAssembler.h> 32 33 … … 69 70 } 70 71 71 Vector<StackReference> push(const Vector<JSC::MacroAssembler::RegisterID>& registerIDs) 72 { 73 RELEASE_ASSERT(!m_hasFunctionCallPadding); 74 unsigned registerCount = registerIDs.size(); 75 Vector<StackReference> stackReferences; 76 stackReferences.reserveInitialCapacity(registerCount); 72 Vector<StackReference, registerCount> push(const Vector<JSC::MacroAssembler::RegisterID>& registerIDs) 73 { 74 RELEASE_ASSERT(!m_hasFunctionCallPadding); 75 Vector<StackReference, registerCount> stackReferences; 77 76 #if CPU(ARM64) 78 for (unsigned i = 0; i < registerCount - 1; i += 2) { 77 unsigned pushRegisterCount = registerIDs.size(); 78 for (unsigned i = 0; i < pushRegisterCount - 1; i += 2) { 79 79 m_assembler.pushPair(registerIDs[i + 1], registerIDs[i]); 80 80 m_offsetFromTop += stackUnitInBytes(); … … 82 82 stackReferences.append(StackReference(m_offsetFromTop)); 83 83 } 84 if ( registerCount % 2)85 stackReferences.append(push(registerIDs[ registerCount - 1]));84 if (pushRegisterCount % 2) 85 stackReferences.append(push(registerIDs[pushRegisterCount - 1])); 86 86 #else 87 87 for (auto registerID : registerIDs) … … 103 103 RELEASE_ASSERT(!m_hasFunctionCallPadding); 104 104 105 unsigned registerCount = registerIDs.size();106 RELEASE_ASSERT(stackReferences.size() == registerCount);105 unsigned popRegisterCount = registerIDs.size(); 106 RELEASE_ASSERT(stackReferences.size() == popRegisterCount); 107 107 #if CPU(ARM64) 108 ASSERT(m_offsetFromTop >= stackUnitInBytes() * (( registerCount + 1) / 2));109 unsigned registerCountOdd = registerCount % 2;110 if ( registerCountOdd)111 pop(stackReferences[ registerCount - 1], registerIDs[registerCount - 1]);112 for (unsigned i = registerCount - registerCountOdd; i > 0; i -= 2) {108 ASSERT(m_offsetFromTop >= stackUnitInBytes() * ((popRegisterCount + 1) / 2)); 109 unsigned popRegisterCountOdd = popRegisterCount % 2; 110 if (popRegisterCountOdd) 111 pop(stackReferences[popRegisterCount - 1], registerIDs[popRegisterCount - 1]); 112 for (unsigned i = popRegisterCount - popRegisterCountOdd; i > 0; i -= 2) { 113 113 RELEASE_ASSERT(stackReferences[i - 1] == m_offsetFromTop); 114 114 RELEASE_ASSERT(stackReferences[i - 2] == m_offsetFromTop - stackUnitInBytes() / 2); … … 118 118 } 119 119 #else 120 ASSERT(m_offsetFromTop >= stackUnitInBytes() * registerCount);121 for (unsigned i = registerCount; i > 0; --i)120 ASSERT(m_offsetFromTop >= stackUnitInBytes() * popRegisterCount); 121 for (unsigned i = popRegisterCount; i > 0; --i) 122 122 pop(stackReferences[i - 1], registerIDs[i - 1]); 123 123 #endif
Note:
See TracChangeset
for help on using the changeset viewer.