<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[170605] trunk/Source</title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/170605">170605</a></dd>
<dt>Author</dt> <dd>achristensen@apple.com</dd>
<dt>Date</dt> <dd>2014-06-30 15:48:47 -0700 (Mon, 30 Jun 2014)</dd>
</dl>
<h3>Log Message</h3>
<pre>Reduce dynamic memory allocation in css jit.
https://bugs.webkit.org/show_bug.cgi?id=134416
Reviewed by Benjamin Poulain.
Source/WebCore:
* cssjit/FunctionCall.h:
(WebCore::FunctionCall::FunctionCall):
(WebCore::FunctionCall::saveAllocatedCallerSavedRegisters):
* cssjit/RegisterAllocator.h:
* cssjit/SelectorCompiler.cpp:
(WebCore::SelectorCompiler::addPseudoClassType):
(WebCore::SelectorCompiler::SelectorCodeGenerator::generatePrologue):
(WebCore::SelectorCompiler::SelectorCodeGenerator::generateSelectorChecker):
(WebCore::SelectorCompiler::SelectorCodeGenerator::generateElementIsNthChild):
Use inlineCapacity template parameter to reduce malloc calls.
I use 16 and 32 as the inline capacity for non-register related vectors because that
is probably big enough for the selector compiler, and if it is not then a malloc
call will not be significant because the selector is very complex.
* cssjit/StackAllocator.h:
(WebCore::StackAllocator::push):
Pass a vector of stack references to match calls to pop and to avoid a call to appendVector.
Source/WTF:
* wtf/Deque.h:
Added inlineCapacity optional template parameter.</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWTFChangeLog">trunk/Source/WTF/ChangeLog</a></li>
<li><a href="#trunkSourceWTFwtfDequeh">trunk/Source/WTF/wtf/Deque.h</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorecssjitFunctionCallh">trunk/Source/WebCore/cssjit/FunctionCall.h</a></li>
<li><a href="#trunkSourceWebCorecssjitRegisterAllocatorh">trunk/Source/WebCore/cssjit/RegisterAllocator.h</a></li>
<li><a href="#trunkSourceWebCorecssjitSelectorCompilercpp">trunk/Source/WebCore/cssjit/SelectorCompiler.cpp</a></li>
<li><a href="#trunkSourceWebCorecssjitStackAllocatorh">trunk/Source/WebCore/cssjit/StackAllocator.h</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWTFChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/ChangeLog (170604 => 170605)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/ChangeLog        2014-06-30 22:22:31 UTC (rev 170604)
+++ trunk/Source/WTF/ChangeLog        2014-06-30 22:48:47 UTC (rev 170605)
</span><span class="lines">@@ -1,3 +1,13 @@
</span><ins>+2014-06-30 Alex Christensen <achristensen@webkit.org>
+
+ Reduce dynamic memory allocation in css jit.
+ https://bugs.webkit.org/show_bug.cgi?id=134416
+
+ Reviewed by Benjamin Poulain.
+
+ * wtf/Deque.h:
+ Added inlineCapacity optional template parameter.
+
</ins><span class="cx"> 2014-06-30 Anders Carlsson <andersca@apple.com>
</span><span class="cx">
</span><span class="cx"> Add code for encoding legacy session history entries
</span></span></pre></div>
<a id="trunkSourceWTFwtfDequeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WTF/wtf/Deque.h (170604 => 170605)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WTF/wtf/Deque.h        2014-06-30 22:22:31 UTC (rev 170604)
+++ trunk/Source/WTF/wtf/Deque.h        2014-06-30 22:48:47 UTC (rev 170605)
</span><span class="lines">@@ -38,25 +38,25 @@
</span><span class="cx">
</span><span class="cx"> namespace WTF {
</span><span class="cx">
</span><del>- template<typename T> class DequeIteratorBase;
- template<typename T> class DequeIterator;
- template<typename T> class DequeConstIterator;
</del><ins>+ template<typename T, size_t inlineCapacity> class DequeIteratorBase;
+ template<typename T, size_t inlineCapacity> class DequeIterator;
+ template<typename T, size_t inlineCapacity> class DequeConstIterator;
</ins><span class="cx">
</span><del>- template<typename T>
</del><ins>+ template<typename T, size_t inlineCapacity = 0>
</ins><span class="cx"> class Deque {
</span><span class="cx"> WTF_MAKE_FAST_ALLOCATED;
</span><span class="cx"> public:
</span><del>- typedef DequeIterator<T> iterator;
- typedef DequeConstIterator<T> const_iterator;
</del><ins>+ typedef DequeIterator<T, inlineCapacity> iterator;
+ typedef DequeConstIterator<T, inlineCapacity> const_iterator;
</ins><span class="cx"> typedef std::reverse_iterator<iterator> reverse_iterator;
</span><span class="cx"> typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
</span><span class="cx">
</span><span class="cx"> Deque();
</span><del>- Deque(const Deque<T>&);
- Deque& operator=(const Deque<T>&);
</del><ins>+ Deque(const Deque<T, inlineCapacity>&);
+ Deque& operator=(const Deque<T, inlineCapacity>&);
</ins><span class="cx"> ~Deque();
</span><span class="cx">
</span><del>- void swap(Deque<T>&);
</del><ins>+ void swap(Deque<T, inlineCapacity>&);
</ins><span class="cx">
</span><span class="cx"> size_t size() const { return m_start <= m_end ? m_end - m_start : m_end + m_buffer.capacity() - m_start; }
</span><span class="cx"> bool isEmpty() const { return m_start == m_end; }
</span><span class="lines">@@ -91,11 +91,11 @@
</span><span class="cx"> iterator findIf(Predicate&&);
</span><span class="cx">
</span><span class="cx"> private:
</span><del>- friend class DequeIteratorBase<T>;
</del><ins>+ friend class DequeIteratorBase<T, inlineCapacity>;
</ins><span class="cx">
</span><del>- typedef VectorBuffer<T, 0> Buffer;
</del><ins>+ typedef VectorBuffer<T, inlineCapacity> Buffer;
</ins><span class="cx"> typedef VectorTypeOperations<T> TypeOperations;
</span><del>- typedef DequeIteratorBase<T> IteratorBase;
</del><ins>+ typedef DequeIteratorBase<T, inlineCapacity> IteratorBase;
</ins><span class="cx">
</span><span class="cx"> void remove(size_t position);
</span><span class="cx"> void invalidateIterators();
</span><span class="lines">@@ -113,11 +113,11 @@
</span><span class="cx"> #endif
</span><span class="cx"> };
</span><span class="cx">
</span><del>- template<typename T>
</del><ins>+ template<typename T, size_t inlineCapacity>
</ins><span class="cx"> class DequeIteratorBase {
</span><span class="cx"> protected:
</span><span class="cx"> DequeIteratorBase();
</span><del>- DequeIteratorBase(const Deque<T>*, size_t);
</del><ins>+ DequeIteratorBase(const Deque<T, inlineCapacity>*, size_t);
</ins><span class="cx"> DequeIteratorBase(const DequeIteratorBase&);
</span><span class="cx"> DequeIteratorBase& operator=(const DequeIteratorBase&);
</span><span class="cx"> ~DequeIteratorBase();
</span><span class="lines">@@ -138,10 +138,10 @@
</span><span class="cx"> void checkValidity() const;
</span><span class="cx"> void checkValidity(const DequeIteratorBase&) const;
</span><span class="cx">
</span><del>- Deque<T>* m_deque;
</del><ins>+ Deque<T, inlineCapacity>* m_deque;
</ins><span class="cx"> size_t m_index;
</span><span class="cx">
</span><del>- friend class Deque<T>;
</del><ins>+ friend class Deque<T, inlineCapacity>;
</ins><span class="cx">
</span><span class="cx"> #ifndef NDEBUG
</span><span class="cx"> mutable DequeIteratorBase* m_next;
</span><span class="lines">@@ -149,11 +149,11 @@
</span><span class="cx"> #endif
</span><span class="cx"> };
</span><span class="cx">
</span><del>- template<typename T>
- class DequeIterator : public DequeIteratorBase<T> {
</del><ins>+ template<typename T, size_t inlineCapacity>
+ class DequeIterator : public DequeIteratorBase<T, inlineCapacity> {
</ins><span class="cx"> private:
</span><del>- typedef DequeIteratorBase<T> Base;
- typedef DequeIterator<T> Iterator;
</del><ins>+ typedef DequeIteratorBase<T, inlineCapacity> Base;
+ typedef DequeIterator<T, inlineCapacity> Iterator;
</ins><span class="cx">
</span><span class="cx"> public:
</span><span class="cx"> typedef ptrdiff_t difference_type;
</span><span class="lines">@@ -162,7 +162,8 @@
</span><span class="cx"> typedef T& reference;
</span><span class="cx"> typedef std::bidirectional_iterator_tag iterator_category;
</span><span class="cx">
</span><del>- DequeIterator(Deque<T>* deque, size_t index) : Base(deque, index) { }
</del><ins>+ DequeIterator(Deque<T, inlineCapacity>* deque, size_t index)
+ : Base(deque, index) { }
</ins><span class="cx">
</span><span class="cx"> DequeIterator(const Iterator& other) : Base(other) { }
</span><span class="cx"> DequeIterator& operator=(const Iterator& other) { Base::assign(other); return *this; }
</span><span class="lines">@@ -179,12 +180,12 @@
</span><span class="cx"> // postfix -- intentionally omitted
</span><span class="cx"> };
</span><span class="cx">
</span><del>- template<typename T>
- class DequeConstIterator : public DequeIteratorBase<T> {
</del><ins>+ template<typename T, size_t inlineCapacity>
+ class DequeConstIterator : public DequeIteratorBase<T, inlineCapacity> {
</ins><span class="cx"> private:
</span><del>- typedef DequeIteratorBase<T> Base;
- typedef DequeConstIterator<T> Iterator;
- typedef DequeIterator<T> NonConstIterator;
</del><ins>+ typedef DequeIteratorBase<T, inlineCapacity> Base;
+ typedef DequeConstIterator<T, inlineCapacity> Iterator;
+ typedef DequeIterator<T, inlineCapacity> NonConstIterator;
</ins><span class="cx">
</span><span class="cx"> public:
</span><span class="cx"> typedef ptrdiff_t difference_type;
</span><span class="lines">@@ -193,7 +194,8 @@
</span><span class="cx"> typedef const T& reference;
</span><span class="cx"> typedef std::bidirectional_iterator_tag iterator_category;
</span><span class="cx">
</span><del>- DequeConstIterator(const Deque<T>* deque, size_t index) : Base(deque, index) { }
</del><ins>+ DequeConstIterator(const Deque<T, inlineCapacity>* deque, size_t index)
+ : Base(deque, index) { }
</ins><span class="cx">
</span><span class="cx"> DequeConstIterator(const Iterator& other) : Base(other) { }
</span><span class="cx"> DequeConstIterator(const NonConstIterator& other) : Base(other) { }
</span><span class="lines">@@ -213,12 +215,12 @@
</span><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> #ifdef NDEBUG
</span><del>- template<typename T> inline void Deque<T>::checkValidity() const { }
- template<typename T> inline void Deque<T>::checkIndexValidity(size_t) const { }
- template<typename T> inline void Deque<T>::invalidateIterators() { }
</del><ins>+ template<typename T, size_t inlineCapacity> inline void Deque<T, inlineCapacity>::checkValidity() const { }
+ template<typename T, size_t inlineCapacity> inline void Deque<T, inlineCapacity>::checkIndexValidity(size_t) const { }
+ template<typename T, size_t inlineCapacity> inline void Deque<T, inlineCapacity>::invalidateIterators() { }
</ins><span class="cx"> #else
</span><del>- template<typename T>
- void Deque<T>::checkValidity() const
</del><ins>+ template<typename T, size_t inlineCapacity>
+ void Deque<T, inlineCapacity>::checkValidity() const
</ins><span class="cx"> {
</span><span class="cx"> // In this implementation a capacity of 1 would confuse append() and
</span><span class="cx"> // other places that assume the index after capacity - 1 is 0.
</span><span class="lines">@@ -233,8 +235,8 @@
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><del>- template<typename T>
- void Deque<T>::checkIndexValidity(size_t index) const
</del><ins>+ template<typename T, size_t inlineCapacity>
+ void Deque<T, inlineCapacity>::checkIndexValidity(size_t index) const
</ins><span class="cx"> {
</span><span class="cx"> ASSERT_UNUSED(index, index <= m_buffer.capacity());
</span><span class="cx"> if (m_start <= m_end) {
</span><span class="lines">@@ -245,8 +247,8 @@
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><del>- template<typename T>
- void Deque<T>::invalidateIterators()
</del><ins>+ template<typename T, size_t inlineCapacity>
+ void Deque<T, inlineCapacity>::invalidateIterators()
</ins><span class="cx"> {
</span><span class="cx"> IteratorBase* next;
</span><span class="cx"> for (IteratorBase* p = m_iterators; p; p = next) {
</span><span class="lines">@@ -259,8 +261,8 @@
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx">
</span><del>- template<typename T>
- inline Deque<T>::Deque()
</del><ins>+ template<typename T, size_t inlineCapacity>
+ inline Deque<T, inlineCapacity>::Deque()
</ins><span class="cx"> : m_start(0)
</span><span class="cx"> , m_end(0)
</span><span class="cx"> #ifndef NDEBUG
</span><span class="lines">@@ -270,8 +272,8 @@
</span><span class="cx"> checkValidity();
</span><span class="cx"> }
</span><span class="cx">
</span><del>- template<typename T>
- inline Deque<T>::Deque(const Deque<T>& other)
</del><ins>+ template<typename T, size_t inlineCapacity>
+ inline Deque<T, inlineCapacity>::Deque(const Deque<T, inlineCapacity>& other)
</ins><span class="cx"> : m_start(other.m_start)
</span><span class="cx"> , m_end(other.m_end)
</span><span class="cx"> , m_buffer(other.m_buffer.capacity())
</span><span class="lines">@@ -288,18 +290,18 @@
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><del>- template<typename T>
- inline Deque<T>& Deque<T>::operator=(const Deque<T>& other)
</del><ins>+ template<typename T, size_t inlineCapacity>
+ inline Deque<T, inlineCapacity>& Deque<T, inlineCapacity>::operator=(const Deque<T, inlineCapacity>& other)
</ins><span class="cx"> {
</span><span class="cx"> // FIXME: This is inefficient if we're using an inline buffer and T is
</span><span class="cx"> // expensive to copy since it will copy the buffer twice instead of once.
</span><del>- Deque<T> copy(other);
</del><ins>+ Deque<T, inlineCapacity> copy(other);
</ins><span class="cx"> swap(copy);
</span><span class="cx"> return *this;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- template<typename T>
- inline void Deque<T>::destroyAll()
</del><ins>+ template<typename T, size_t inlineCapacity>
+ inline void Deque<T, inlineCapacity>::destroyAll()
</ins><span class="cx"> {
</span><span class="cx"> if (m_start <= m_end)
</span><span class="cx"> TypeOperations::destruct(m_buffer.buffer() + m_start, m_buffer.buffer() + m_end);
</span><span class="lines">@@ -309,16 +311,16 @@
</span><span class="cx"> }
</span><span class="cx"> }
</span><span class="cx">
</span><del>- template<typename T>
- inline Deque<T>::~Deque()
</del><ins>+ template<typename T, size_t inlineCapacity>
+ inline Deque<T, inlineCapacity>::~Deque()
</ins><span class="cx"> {
</span><span class="cx"> checkValidity();
</span><span class="cx"> invalidateIterators();
</span><span class="cx"> destroyAll();
</span><span class="cx"> }
</span><span class="cx">
</span><del>- template<typename T>
- inline void Deque<T>::swap(Deque<T>& other)
</del><ins>+ template<typename T, size_t inlineCapacity>
+ inline void Deque<T, inlineCapacity>::swap(Deque<T, inlineCapacity>& other)
</ins><span class="cx"> {
</span><span class="cx"> checkValidity();
</span><span class="cx"> other.checkValidity();
</span><span class="lines">@@ -330,8 +332,8 @@
</span><span class="cx"> other.checkValidity();
</span><span class="cx"> }
</span><span class="cx">
</span><del>- template<typename T>
- inline void Deque<T>::clear()
</del><ins>+ template<typename T, size_t inlineCapacity>
+ inline void Deque<T, inlineCapacity>::clear()
</ins><span class="cx"> {
</span><span class="cx"> checkValidity();
</span><span class="cx"> invalidateIterators();
</span><span class="lines">@@ -342,9 +344,9 @@
</span><span class="cx"> checkValidity();
</span><span class="cx"> }
</span><span class="cx">
</span><del>- template<typename T>
</del><ins>+ template<typename T, size_t inlineCapacity>
</ins><span class="cx"> template<typename Predicate>
</span><del>- inline auto Deque<T>::findIf(Predicate&& predicate) -> iterator
</del><ins>+ inline auto Deque<T, inlineCapacity>::findIf(Predicate&& predicate) -> iterator
</ins><span class="cx"> {
</span><span class="cx"> iterator end_iterator = end();
</span><span class="cx"> for (iterator it = begin(); it != end_iterator; ++it) {
</span><span class="lines">@@ -354,8 +356,8 @@
</span><span class="cx"> return end_iterator;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- template<typename T>
- inline void Deque<T>::expandCapacityIfNeeded()
</del><ins>+ template<typename T, size_t inlineCapacity>
+ inline void Deque<T, inlineCapacity>::expandCapacityIfNeeded()
</ins><span class="cx"> {
</span><span class="cx"> if (m_start) {
</span><span class="cx"> if (m_end + 1 != m_start)
</span><span class="lines">@@ -369,8 +371,8 @@
</span><span class="cx"> expandCapacity();
</span><span class="cx"> }
</span><span class="cx">
</span><del>- template<typename T>
- void Deque<T>::expandCapacity()
</del><ins>+ template<typename T, size_t inlineCapacity>
+ void Deque<T, inlineCapacity>::expandCapacity()
</ins><span class="cx"> {
</span><span class="cx"> checkValidity();
</span><span class="cx"> size_t oldCapacity = m_buffer.capacity();
</span><span class="lines">@@ -388,24 +390,24 @@
</span><span class="cx"> checkValidity();
</span><span class="cx"> }
</span><span class="cx">
</span><del>- template<typename T>
- inline auto Deque<T>::takeFirst() -> T
</del><ins>+ template<typename T, size_t inlineCapacity>
+ inline auto Deque<T, inlineCapacity>::takeFirst() -> T
</ins><span class="cx"> {
</span><span class="cx"> T oldFirst = std::move(first());
</span><span class="cx"> removeFirst();
</span><span class="cx"> return oldFirst;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- template<typename T>
- inline auto Deque<T>::takeLast() -> T
</del><ins>+ template<typename T, size_t inlineCapacity>
+ inline auto Deque<T, inlineCapacity>::takeLast() -> T
</ins><span class="cx"> {
</span><span class="cx"> T oldLast = std::move(last());
</span><span class="cx"> removeLast();
</span><span class="cx"> return oldLast;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- template<typename T> template<typename U>
- inline void Deque<T>::append(U&& value)
</del><ins>+ template<typename T, size_t inlineCapacity> template<typename U>
+ inline void Deque<T, inlineCapacity>::append(U&& value)
</ins><span class="cx"> {
</span><span class="cx"> checkValidity();
</span><span class="cx"> expandCapacityIfNeeded();
</span><span class="lines">@@ -417,8 +419,8 @@
</span><span class="cx"> checkValidity();
</span><span class="cx"> }
</span><span class="cx">
</span><del>- template<typename T> template<typename U>
- inline void Deque<T>::prepend(U&& value)
</del><ins>+ template<typename T, size_t inlineCapacity> template<typename U>
+ inline void Deque<T, inlineCapacity>::prepend(U&& value)
</ins><span class="cx"> {
</span><span class="cx"> checkValidity();
</span><span class="cx"> expandCapacityIfNeeded();
</span><span class="lines">@@ -430,8 +432,8 @@
</span><span class="cx"> checkValidity();
</span><span class="cx"> }
</span><span class="cx">
</span><del>- template<typename T>
- inline void Deque<T>::removeFirst()
</del><ins>+ template<typename T, size_t inlineCapacity>
+ inline void Deque<T, inlineCapacity>::removeFirst()
</ins><span class="cx"> {
</span><span class="cx"> checkValidity();
</span><span class="cx"> invalidateIterators();
</span><span class="lines">@@ -444,8 +446,8 @@
</span><span class="cx"> checkValidity();
</span><span class="cx"> }
</span><span class="cx">
</span><del>- template<typename T>
- inline void Deque<T>::removeLast()
</del><ins>+ template<typename T, size_t inlineCapacity>
+ inline void Deque<T, inlineCapacity>::removeLast()
</ins><span class="cx"> {
</span><span class="cx"> checkValidity();
</span><span class="cx"> invalidateIterators();
</span><span class="lines">@@ -458,22 +460,22 @@
</span><span class="cx"> checkValidity();
</span><span class="cx"> }
</span><span class="cx">
</span><del>- template<typename T>
- inline void Deque<T>::remove(iterator& it)
</del><ins>+ template<typename T, size_t inlineCapacity>
+ inline void Deque<T, inlineCapacity>::remove(iterator& it)
</ins><span class="cx"> {
</span><span class="cx"> it.checkValidity();
</span><span class="cx"> remove(it.m_index);
</span><span class="cx"> }
</span><span class="cx">
</span><del>- template<typename T>
- inline void Deque<T>::remove(const_iterator& it)
</del><ins>+ template<typename T, size_t inlineCapacity>
+ inline void Deque<T, inlineCapacity>::remove(const_iterator& it)
</ins><span class="cx"> {
</span><span class="cx"> it.checkValidity();
</span><span class="cx"> remove(it.m_index);
</span><span class="cx"> }
</span><span class="cx">
</span><del>- template<typename T>
- inline void Deque<T>::remove(size_t position)
</del><ins>+ template<typename T, size_t inlineCapacity>
+ inline void Deque<T, inlineCapacity>::remove(size_t position)
</ins><span class="cx"> {
</span><span class="cx"> if (position == m_end)
</span><span class="cx"> return;
</span><span class="lines">@@ -496,28 +498,28 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> #ifdef NDEBUG
</span><del>- template<typename T> inline void DequeIteratorBase<T>::checkValidity() const { }
- template<typename T> inline void DequeIteratorBase<T>::checkValidity(const DequeIteratorBase<T>&) const { }
- template<typename T> inline void DequeIteratorBase<T>::addToIteratorsList() { }
- template<typename T> inline void DequeIteratorBase<T>::removeFromIteratorsList() { }
</del><ins>+ template<typename T, size_t inlineCapacity> inline void DequeIteratorBase<T, inlineCapacity>::checkValidity() const { }
+ template<typename T, size_t inlineCapacity> inline void DequeIteratorBase<T, inlineCapacity>::checkValidity(const DequeIteratorBase<T, inlineCapacity>&) const { }
+ template<typename T, size_t inlineCapacity> inline void DequeIteratorBase<T, inlineCapacity>::addToIteratorsList() { }
+ template<typename T, size_t inlineCapacity> inline void DequeIteratorBase<T, inlineCapacity>::removeFromIteratorsList() { }
</ins><span class="cx"> #else
</span><del>- template<typename T>
- void DequeIteratorBase<T>::checkValidity() const
</del><ins>+ template<typename T, size_t inlineCapacity>
+ void DequeIteratorBase<T, inlineCapacity>::checkValidity() const
</ins><span class="cx"> {
</span><span class="cx"> ASSERT(m_deque);
</span><span class="cx"> m_deque->checkIndexValidity(m_index);
</span><span class="cx"> }
</span><span class="cx">
</span><del>- template<typename T>
- void DequeIteratorBase<T>::checkValidity(const DequeIteratorBase& other) const
</del><ins>+ template<typename T, size_t inlineCapacity>
+ void DequeIteratorBase<T, inlineCapacity>::checkValidity(const DequeIteratorBase& other) const
</ins><span class="cx"> {
</span><span class="cx"> checkValidity();
</span><span class="cx"> other.checkValidity();
</span><span class="cx"> ASSERT(m_deque == other.m_deque);
</span><span class="cx"> }
</span><span class="cx">
</span><del>- template<typename T>
- void DequeIteratorBase<T>::addToIteratorsList()
</del><ins>+ template<typename T, size_t inlineCapacity>
+ void DequeIteratorBase<T, inlineCapacity>::addToIteratorsList()
</ins><span class="cx"> {
</span><span class="cx"> if (!m_deque)
</span><span class="cx"> m_next = 0;
</span><span class="lines">@@ -530,8 +532,8 @@
</span><span class="cx"> m_previous = 0;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- template<typename T>
- void DequeIteratorBase<T>::removeFromIteratorsList()
</del><ins>+ template<typename T, size_t inlineCapacity>
+ void DequeIteratorBase<T, inlineCapacity>::removeFromIteratorsList()
</ins><span class="cx"> {
</span><span class="cx"> if (!m_deque) {
</span><span class="cx"> ASSERT(!m_next);
</span><span class="lines">@@ -555,23 +557,23 @@
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx">
</span><del>- template<typename T>
- inline DequeIteratorBase<T>::DequeIteratorBase()
</del><ins>+ template<typename T, size_t inlineCapacity>
+ inline DequeIteratorBase<T, inlineCapacity>::DequeIteratorBase()
</ins><span class="cx"> : m_deque(0)
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx">
</span><del>- template<typename T>
- inline DequeIteratorBase<T>::DequeIteratorBase(const Deque<T>* deque, size_t index)
- : m_deque(const_cast<Deque<T>*>(deque))
</del><ins>+ template<typename T, size_t inlineCapacity>
+ inline DequeIteratorBase<T, inlineCapacity>::DequeIteratorBase(const Deque<T, inlineCapacity>* deque, size_t index)
+ : m_deque(const_cast<Deque<T, inlineCapacity>*>(deque))
</ins><span class="cx"> , m_index(index)
</span><span class="cx"> {
</span><span class="cx"> addToIteratorsList();
</span><span class="cx"> checkValidity();
</span><span class="cx"> }
</span><span class="cx">
</span><del>- template<typename T>
- inline DequeIteratorBase<T>::DequeIteratorBase(const DequeIteratorBase& other)
</del><ins>+ template<typename T, size_t inlineCapacity>
+ inline DequeIteratorBase<T, inlineCapacity>::DequeIteratorBase(const DequeIteratorBase& other)
</ins><span class="cx"> : m_deque(other.m_deque)
</span><span class="cx"> , m_index(other.m_index)
</span><span class="cx"> {
</span><span class="lines">@@ -579,8 +581,8 @@
</span><span class="cx"> checkValidity();
</span><span class="cx"> }
</span><span class="cx">
</span><del>- template<typename T>
- inline DequeIteratorBase<T>& DequeIteratorBase<T>::operator=(const DequeIteratorBase& other)
</del><ins>+ template<typename T, size_t inlineCapacity>
+ inline DequeIteratorBase<T, inlineCapacity>& DequeIteratorBase<T, inlineCapacity>::operator=(const DequeIteratorBase& other)
</ins><span class="cx"> {
</span><span class="cx"> other.checkValidity();
</span><span class="cx"> removeFromIteratorsList();
</span><span class="lines">@@ -592,8 +594,8 @@
</span><span class="cx"> return *this;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- template<typename T>
- inline DequeIteratorBase<T>::~DequeIteratorBase()
</del><ins>+ template<typename T, size_t inlineCapacity>
+ inline DequeIteratorBase<T, inlineCapacity>::~DequeIteratorBase()
</ins><span class="cx"> {
</span><span class="cx"> #ifndef NDEBUG
</span><span class="cx"> removeFromIteratorsList();
</span><span class="lines">@@ -601,15 +603,15 @@
</span><span class="cx"> #endif
</span><span class="cx"> }
</span><span class="cx">
</span><del>- template<typename T>
- inline bool DequeIteratorBase<T>::isEqual(const DequeIteratorBase& other) const
</del><ins>+ template<typename T, size_t inlineCapacity>
+ inline bool DequeIteratorBase<T, inlineCapacity>::isEqual(const DequeIteratorBase& other) const
</ins><span class="cx"> {
</span><span class="cx"> checkValidity(other);
</span><span class="cx"> return m_index == other.m_index;
</span><span class="cx"> }
</span><span class="cx">
</span><del>- template<typename T>
- inline void DequeIteratorBase<T>::increment()
</del><ins>+ template<typename T, size_t inlineCapacity>
+ inline void DequeIteratorBase<T, inlineCapacity>::increment()
</ins><span class="cx"> {
</span><span class="cx"> checkValidity();
</span><span class="cx"> ASSERT(m_index != m_deque->m_end);
</span><span class="lines">@@ -621,8 +623,8 @@
</span><span class="cx"> checkValidity();
</span><span class="cx"> }
</span><span class="cx">
</span><del>- template<typename T>
- inline void DequeIteratorBase<T>::decrement()
</del><ins>+ template<typename T, size_t inlineCapacity>
+ inline void DequeIteratorBase<T, inlineCapacity>::decrement()
</ins><span class="cx"> {
</span><span class="cx"> checkValidity();
</span><span class="cx"> ASSERT(m_index != m_deque->m_start);
</span><span class="lines">@@ -634,16 +636,16 @@
</span><span class="cx"> checkValidity();
</span><span class="cx"> }
</span><span class="cx">
</span><del>- template<typename T>
- inline T* DequeIteratorBase<T>::after() const
</del><ins>+ template<typename T, size_t inlineCapacity>
+ inline T* DequeIteratorBase<T, inlineCapacity>::after() const
</ins><span class="cx"> {
</span><span class="cx"> checkValidity();
</span><span class="cx"> ASSERT(m_index != m_deque->m_end);
</span><span class="cx"> return &m_deque->m_buffer.buffer()[m_index];
</span><span class="cx"> }
</span><span class="cx">
</span><del>- template<typename T>
- inline T* DequeIteratorBase<T>::before() const
</del><ins>+ template<typename T, size_t inlineCapacity>
+ inline T* DequeIteratorBase<T, inlineCapacity>::before() const
</ins><span class="cx"> {
</span><span class="cx"> checkValidity();
</span><span class="cx"> ASSERT(m_index != m_deque->m_start);
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (170604 => 170605)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-06-30 22:22:31 UTC (rev 170604)
+++ trunk/Source/WebCore/ChangeLog        2014-06-30 22:48:47 UTC (rev 170605)
</span><span class="lines">@@ -1,5 +1,29 @@
</span><span class="cx"> 2014-06-30 Alex Christensen <achristensen@webkit.org>
</span><span class="cx">
</span><ins>+ Reduce dynamic memory allocation in css jit.
+ https://bugs.webkit.org/show_bug.cgi?id=134416
+
+ Reviewed by Benjamin Poulain.
+
+ * cssjit/FunctionCall.h:
+ (WebCore::FunctionCall::FunctionCall):
+ (WebCore::FunctionCall::saveAllocatedCallerSavedRegisters):
+ * cssjit/RegisterAllocator.h:
+ * cssjit/SelectorCompiler.cpp:
+ (WebCore::SelectorCompiler::addPseudoClassType):
+ (WebCore::SelectorCompiler::SelectorCodeGenerator::generatePrologue):
+ (WebCore::SelectorCompiler::SelectorCodeGenerator::generateSelectorChecker):
+ (WebCore::SelectorCompiler::SelectorCodeGenerator::generateElementIsNthChild):
+ Use inlineCapacity template parameter to reduce malloc calls.
+ I use 16 and 32 as the inline capacity for non-register related vectors because that
+ is probably big enough for the selector compiler, and if it is not then a malloc
+ call will not be significant because the selector is very complex.
+ * cssjit/StackAllocator.h:
+ (WebCore::StackAllocator::push):
+ Pass a vector of stack references to match calls to pop and to avoid a call to appendVector.
+
+2014-06-30 Alex Christensen <achristensen@webkit.org>
+
</ins><span class="cx"> Use non-thumb registers in armv7 css jit.
</span><span class="cx"> https://bugs.webkit.org/show_bug.cgi?id=134450
</span><span class="cx">
</span></span></pre></div>
<a id="trunkSourceWebCorecssjitFunctionCallh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/cssjit/FunctionCall.h (170604 => 170605)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/cssjit/FunctionCall.h        2014-06-30 22:22:31 UTC (rev 170604)
+++ trunk/Source/WebCore/cssjit/FunctionCall.h        2014-06-30 22:48:47 UTC (rev 170605)
</span><span class="lines">@@ -37,7 +37,7 @@
</span><span class="cx">
</span><span class="cx"> class FunctionCall {
</span><span class="cx"> public:
</span><del>- FunctionCall(JSC::MacroAssembler& assembler, RegisterAllocator& registerAllocator, StackAllocator& stackAllocator, Vector<std::pair<JSC::MacroAssembler::Call, JSC::FunctionPtr>>& callRegistry)
</del><ins>+ FunctionCall(JSC::MacroAssembler& assembler, RegisterAllocator& registerAllocator, StackAllocator& stackAllocator, Vector<std::pair<JSC::MacroAssembler::Call, JSC::FunctionPtr>, 32>& callRegistry)
</ins><span class="cx"> : m_assembler(assembler)
</span><span class="cx"> , m_registerAllocator(registerAllocator)
</span><span class="cx"> , m_stackAllocator(stackAllocator)
</span><span class="lines">@@ -167,8 +167,7 @@
</span><span class="cx"> if (RegisterAllocator::isCallerSavedRegister(registerID))
</span><span class="cx"> m_savedRegisters.append(registerID);
</span><span class="cx"> }
</span><del>- Vector<StackAllocator::StackReference> stackReferences = m_stackAllocator.push(m_savedRegisters);
- m_savedRegisterStackReferences.appendVector(stackReferences);
</del><ins>+ m_stackAllocator.push(m_savedRegisterStackReferences, m_savedRegisters);
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> void restoreAllocatedCallerSavedRegisters()
</span><span class="lines">@@ -180,7 +179,7 @@
</span><span class="cx"> JSC::MacroAssembler& m_assembler;
</span><span class="cx"> RegisterAllocator& m_registerAllocator;
</span><span class="cx"> StackAllocator& m_stackAllocator;
</span><del>- Vector<std::pair<JSC::MacroAssembler::Call, JSC::FunctionPtr>>& m_callRegistry;
</del><ins>+ Vector<std::pair<JSC::MacroAssembler::Call, JSC::FunctionPtr>, 32>& m_callRegistry;
</ins><span class="cx">
</span><span class="cx"> Vector<JSC::MacroAssembler::RegisterID, registerCount> m_savedRegisters;
</span><span class="cx"> Vector<StackAllocator::StackReference, registerCount> m_savedRegisterStackReferences;
</span></span></pre></div>
<a id="trunkSourceWebCorecssjitRegisterAllocatorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/cssjit/RegisterAllocator.h (170604 => 170605)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/cssjit/RegisterAllocator.h        2014-06-30 22:22:31 UTC (rev 170604)
+++ trunk/Source/WebCore/cssjit/RegisterAllocator.h        2014-06-30 22:48:47 UTC (rev 170605)
</span><span class="lines">@@ -205,7 +205,7 @@
</span><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> private:
</span><del>- Deque<JSC::MacroAssembler::RegisterID> m_registers;
</del><ins>+ Deque<JSC::MacroAssembler::RegisterID, registerCount> m_registers;
</ins><span class="cx"> Vector<JSC::MacroAssembler::RegisterID, registerCount> m_allocatedRegisters;
</span><span class="cx"> Vector<JSC::MacroAssembler::RegisterID, calleeSavedRegisterCount> m_reservedCalleeSavedRegisters;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCorecssjitSelectorCompilercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/cssjit/SelectorCompiler.cpp (170604 => 170605)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/cssjit/SelectorCompiler.cpp        2014-06-30 22:22:31 UTC (rev 170604)
+++ trunk/Source/WebCore/cssjit/SelectorCompiler.cpp        2014-06-30 22:48:47 UTC (rev 170605)
</span><span class="lines">@@ -159,11 +159,11 @@
</span><span class="cx"> const QualifiedName* tagName;
</span><span class="cx"> const AtomicString* id;
</span><span class="cx"> const AtomicString* langFilter;
</span><del>- Vector<const AtomicStringImpl*, 1> classNames;
</del><ins>+ Vector<const AtomicStringImpl*, 2> classNames;
</ins><span class="cx"> HashSet<unsigned> pseudoClasses;
</span><del>- Vector<JSC::FunctionPtr> unoptimizedPseudoClasses;
- Vector<AttributeMatchingInfo> attributes;
- Vector<std::pair<int, int>> nthChildFilters;
</del><ins>+ Vector<JSC::FunctionPtr, 2> unoptimizedPseudoClasses;
+ Vector<AttributeMatchingInfo, 32> attributes;
+ Vector<std::pair<int, int>, 2> nthChildFilters;
</ins><span class="cx"> Vector<SelectorFragment> notFilters;
</span><span class="cx"> Vector<Vector<SelectorFragment>> anyFilters;
</span><span class="cx">
</span><span class="lines">@@ -192,8 +192,8 @@
</span><span class="cx"> };
</span><span class="cx">
</span><span class="cx"> typedef JSC::MacroAssembler Assembler;
</span><del>-typedef Vector<SelectorFragment, 8> SelectorFragmentList;
-typedef Vector<TagNamePattern, 8> TagNameList;
</del><ins>+typedef Vector<SelectorFragment, 16> SelectorFragmentList;
+typedef Vector<TagNamePattern, 16> TagNameList;
</ins><span class="cx">
</span><span class="cx"> class SelectorCodeGenerator {
</span><span class="cx"> public:
</span><span class="lines">@@ -265,12 +265,12 @@
</span><span class="cx">
</span><span class="cx"> bool generatePrologue();
</span><span class="cx"> void generateEpilogue();
</span><del>- Vector<StackAllocator::StackReference> m_prologueStackReferences;
</del><ins>+ Vector<StackAllocator::StackReference, registerCount> m_prologueStackReferences;
</ins><span class="cx">
</span><span class="cx"> Assembler m_assembler;
</span><span class="cx"> RegisterAllocator m_registerAllocator;
</span><span class="cx"> StackAllocator m_stackAllocator;
</span><del>- Vector<std::pair<Assembler::Call, JSC::FunctionPtr>> m_functionCalls;
</del><ins>+ Vector<std::pair<Assembler::Call, JSC::FunctionPtr>, 32> m_functionCalls;
</ins><span class="cx">
</span><span class="cx"> SelectorContext m_selectorContext;
</span><span class="cx"> FunctionType m_functionType;
</span><span class="lines">@@ -476,7 +476,7 @@
</span><span class="cx">
</span><span class="cx"> case CSSSelector::PseudoClassAny:
</span><span class="cx"> {
</span><del>- Vector<SelectorFragment> anyFragments;
</del><ins>+ Vector<SelectorFragment, 32> anyFragments;
</ins><span class="cx"> FunctionType functionType = FunctionType::SimpleSelectorChecker;
</span><span class="cx"> for (const CSSSelector* rootSelector = selector.selectorList()->first(); rootSelector; rootSelector = CSSSelectorList::next(rootSelector)) {
</span><span class="cx"> SelectorFragmentList fragmentList;
</span><span class="lines">@@ -1127,19 +1127,19 @@
</span><span class="cx"> Vector<JSC::MacroAssembler::RegisterID, 2> prologueRegisters;
</span><span class="cx"> prologueRegisters.append(JSC::ARM64Registers::lr);
</span><span class="cx"> prologueRegisters.append(JSC::ARM64Registers::fp);
</span><del>- m_prologueStackReferences = m_stackAllocator.push(prologueRegisters);
</del><ins>+ m_stackAllocator.push(m_prologueStackReferences, prologueRegisters);
</ins><span class="cx"> return true;
</span><span class="cx"> #elif CPU(ARM_THUMB2)
</span><span class="cx"> Vector<JSC::MacroAssembler::RegisterID, 2> prologueRegisters;
</span><span class="cx"> prologueRegisters.append(JSC::ARMRegisters::lr);
</span><span class="cx"> // r6 is tempRegister in RegisterAllocator.h and addressTempRegister in MacroAssemblerARMv7.h and must be preserved by the callee.
</span><span class="cx"> prologueRegisters.append(JSC::ARMRegisters::r6);
</span><del>- m_prologueStackReferences = m_stackAllocator.push(prologueRegisters);
</del><ins>+ m_stackAllocator.push(m_prologueStackReferences, prologueRegisters);
</ins><span class="cx"> return true;
</span><span class="cx"> #elif CPU(X86_64) && CSS_SELECTOR_JIT_DEBUGGING
</span><span class="cx"> Vector<JSC::MacroAssembler::RegisterID, 1> prologueRegister;
</span><span class="cx"> prologueRegister.append(callFrameRegister);
</span><del>- m_prologueStackReferences = m_stackAllocator.push(prologueRegister);
</del><ins>+ m_stackAllocator.push(m_prologueStackReferences, prologueRegister);
</ins><span class="cx"> return true;
</span><span class="cx"> #endif
</span><span class="cx"> return false;
</span><span class="lines">@@ -1166,7 +1166,7 @@
</span><span class="cx">
</span><span class="cx"> void SelectorCodeGenerator::generateSelectorChecker()
</span><span class="cx"> {
</span><del>- Vector<StackAllocator::StackReference> calleeSavedRegisterStackReferences;
</del><ins>+ Vector<StackAllocator::StackReference, registerCount> calleeSavedRegisterStackReferences;
</ins><span class="cx"> bool reservedCalleeSavedRegisters = false;
</span><span class="cx"> unsigned availableRegisterCount = m_registerAllocator.availableRegisterCount();
</span><span class="cx"> unsigned minimumRegisterCountForAttributes = minimumRegisterRequirements(m_selectorFragments);
</span><span class="lines">@@ -1179,7 +1179,7 @@
</span><span class="cx"> ASSERT(minimumRegisterCountForAttributes <= registerCount);
</span><span class="cx"> if (availableRegisterCount < minimumRegisterCountForAttributes) {
</span><span class="cx"> reservedCalleeSavedRegisters = true;
</span><del>- calleeSavedRegisterStackReferences = m_stackAllocator.push(m_registerAllocator.reserveCalleeSavedRegisters(minimumRegisterCountForAttributes - availableRegisterCount));
</del><ins>+ m_stackAllocator.push(calleeSavedRegisterStackReferences, m_registerAllocator.reserveCalleeSavedRegisters(minimumRegisterCountForAttributes - availableRegisterCount));
</ins><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> m_registerAllocator.allocateRegister(elementAddressRegister);
</span><span class="lines">@@ -2582,7 +2582,7 @@
</span><span class="cx"> Assembler::RegisterID parentElement = m_registerAllocator.allocateRegister();
</span><span class="cx"> generateWalkToParentElement(failureCases, parentElement);
</span><span class="cx">
</span><del>- Vector<std::pair<int, int>> validSubsetFilters;
</del><ins>+ Vector<std::pair<int, int>, 32> validSubsetFilters;
</ins><span class="cx"> validSubsetFilters.reserveInitialCapacity(fragment.nthChildFilters.size());
</span><span class="cx"> for (const auto& slot : fragment.nthChildFilters) {
</span><span class="cx"> int a = slot.first;
</span></span></pre></div>
<a id="trunkSourceWebCorecssjitStackAllocatorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/cssjit/StackAllocator.h (170604 => 170605)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/cssjit/StackAllocator.h        2014-06-30 22:22:31 UTC (rev 170604)
+++ trunk/Source/WebCore/cssjit/StackAllocator.h        2014-06-30 22:48:47 UTC (rev 170605)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx">
</span><span class="cx"> #if ENABLE(CSS_SELECTOR_JIT)
</span><span class="cx">
</span><ins>+#include "RegisterAllocator.h"
</ins><span class="cx"> #include <JavaScriptCore/MacroAssembler.h>
</span><span class="cx">
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -68,14 +69,11 @@
</span><span class="cx"> return StackReference(m_offsetFromTop);
</span><span class="cx"> }
</span><span class="cx">
</span><del>- Vector<StackReference> push(const Vector<JSC::MacroAssembler::RegisterID>& registerIDs)
</del><ins>+ void push(Vector<StackReference, registerCount>& stackReferences, const Vector<JSC::MacroAssembler::RegisterID>& registerIDs)
</ins><span class="cx"> {
</span><span class="cx"> RELEASE_ASSERT(!m_hasFunctionCallPadding);
</span><del>- unsigned registerCount = registerIDs.size();
- Vector<StackReference> stackReferences;
- stackReferences.reserveInitialCapacity(registerCount);
</del><span class="cx"> #if CPU(ARM64)
</span><del>- for (unsigned i = 0; i < registerCount - 1; i += 2) {
</del><ins>+ for (unsigned i = 0; i < registerIDs.size() - 1; i += 2) {
</ins><span class="cx"> m_assembler.pushPair(registerIDs[i + 1], registerIDs[i]);
</span><span class="cx"> m_offsetFromTop += stackUnitInBytes();
</span><span class="cx"> stackReferences.append(StackReference(m_offsetFromTop - stackUnitInBytes() / 2));
</span><span class="lines">@@ -87,7 +85,6 @@
</span><span class="cx"> for (auto registerID : registerIDs)
</span><span class="cx"> stackReferences.append(push(registerID));
</span><span class="cx"> #endif
</span><del>- return stackReferences;
</del><span class="cx"> }
</span><span class="cx">
</span><span class="cx"> StackReference push(JSC::MacroAssembler::RegisterID registerID)
</span></span></pre>
</div>
</div>
</body>
</html>