| Index: Source/core/rendering/OrderIterator.h | 
| diff --git a/Source/core/rendering/OrderIterator.h b/Source/core/rendering/OrderIterator.h | 
| index 8639bdcb1001f7a24c31fcdf2470ab73822bf86d..8704078968c6cd215facd2cacd9f4dfe71643039 100644 | 
| --- a/Source/core/rendering/OrderIterator.h | 
| +++ b/Source/core/rendering/OrderIterator.h | 
| @@ -31,6 +31,7 @@ | 
| #ifndef OrderIterator_h | 
| #define OrderIterator_h | 
|  | 
| +#include "wtf/HashMap.h" | 
| #include "wtf/Noncopyable.h" | 
| #include "wtf/Vector.h" | 
|  | 
| @@ -38,6 +39,16 @@ namespace WebCore { | 
|  | 
| class RenderBox; | 
|  | 
| +// Normally, -1 and 0 are not valid in a HashSet, but these are relatively likel y order: values. Instead, | 
| +// we make the two smallest int values invalid order: values (in the css parser code we clamp them to | 
| +// int min + 2). | 
| +struct OrdererValueMapKeyHashTraits : WTF::GenericHashTraits<int> { | 
| +    static const bool emptyValueIsZero = false; | 
| +    static int emptyValue() { return std::numeric_limits<int>::min(); } | 
| +    static void constructDeletedValue(int& slot) { slot = std::numeric_limits<int>::min() + 1; } | 
| +    static bool isDeletedValue(int value) { return value == std::numeric_limits<int>::min() + 1; } | 
| +}; | 
| + | 
| class OrderIterator { | 
| WTF_MAKE_NONCOPYABLE(OrderIterator); | 
| public: | 
| @@ -52,34 +63,38 @@ public: | 
|  | 
| private: | 
| const RenderBox* m_containerBox; | 
| -    RenderBox* m_currentChild; | 
| + | 
| // The inline capacity for a single item is used to cover the most | 
| // common case by far: if we only have the default 'order' value 0. | 
| typedef Vector<int, 1> OrderValues; | 
| OrderValues m_orderValues; | 
| -    Vector<int>::const_iterator m_orderValuesIterator; | 
| + | 
| +    RenderBox* m_currentChild; | 
| +    size_t m_currentOrderIndex; | 
| +    size_t m_currentChildIndex; | 
| + | 
| +    // This HashMap is empty if there is only one value. | 
| +    typedef HashMap<int, Vector<RenderBox*>, DefaultHash<int>::Hash, OrdererValueMapKeyHashTraits > OrderedValuesMap; | 
| +    OrderedValuesMap m_orderedValues; | 
| }; | 
|  | 
| class OrderIteratorPopulator { | 
| public: | 
| OrderIteratorPopulator(OrderIterator& iterator) | 
| : m_iterator(iterator) | 
| -        , m_anyChildHasDefaultOrderValue(false) | 
| { | 
| // Note that we don't release the memory here, we only invalidate the size. | 
| // This avoids unneeded reallocation if the size ends up not changing. | 
| m_iterator.m_orderValues.shrink(0); | 
| +        m_iterator.m_orderedValues.clear(); | 
| } | 
|  | 
| ~OrderIteratorPopulator(); | 
|  | 
| -    void collectChild(const RenderBox*); | 
| +    void collectChild(RenderBox*); | 
|  | 
| private: | 
| -    void removeDuplicatedOrderValues(); | 
| - | 
| OrderIterator& m_iterator; | 
| -    bool m_anyChildHasDefaultOrderValue; | 
| }; | 
|  | 
| } // namespace WebCore | 
|  |