void CSSSelectorList::adoptSelectorVector(Vector<OwnPtr<CSSParserSelector>>& selectorVector) { deleteSelectors(); size_t flattenedSize = 0; for (size_t i = 0; i < selectorVector.size(); ++i) { for (CSSParserSelector* selector = selectorVector[i].get(); selector; selector = selector->tagHistory()) ++flattenedSize; } ASSERT(flattenedSize); m_selectorArray = reinterpret_cast<CSSSelector*>(fastMalloc(sizeof(CSSSelector) * flattenedSize)); size_t arrayIndex = 0; for (size_t i = 0; i < selectorVector.size(); ++i) { CSSParserSelector* current = selectorVector[i].get(); while (current) { // Move item from the parser selector vector into m_selectorArray without invoking destructor (Ugh.) CSSSelector* currentSelector = current->releaseSelector().leakPtr(); memcpy(&m_selectorArray[arrayIndex], currentSelector, sizeof(CSSSelector)); fastFree(currentSelector); current = current->tagHistory(); ASSERT(!m_selectorArray[arrayIndex].isLastInSelectorList()); if (current) m_selectorArray[arrayIndex].setNotLastInTagHistory(); ++arrayIndex; } ASSERT(m_selectorArray[arrayIndex - 1].isLastInTagHistory()); } ASSERT(flattenedSize == arrayIndex); m_selectorArray[arrayIndex - 1].setLastInSelectorList(); selectorVector.clear(); }
CSSSelectorList CSSSelectorList::adoptSelectorVector( Vector<std::unique_ptr<CSSParserSelector>>& selectorVector) { size_t flattenedSize = 0; for (size_t i = 0; i < selectorVector.size(); ++i) { for (CSSParserSelector* selector = selectorVector[i].get(); selector; selector = selector->tagHistory()) ++flattenedSize; } ASSERT(flattenedSize); CSSSelectorList list; list.m_selectorArray = reinterpret_cast<CSSSelector*>(WTF::Partitions::fastMalloc( sizeof(CSSSelector) * flattenedSize, kCSSSelectorTypeName)); size_t arrayIndex = 0; for (size_t i = 0; i < selectorVector.size(); ++i) { CSSParserSelector* current = selectorVector[i].get(); while (current) { // Move item from the parser selector vector into m_selectorArray without // invoking destructor (Ugh.) CSSSelector* currentSelector = current->releaseSelector().release(); memcpy(&list.m_selectorArray[arrayIndex], currentSelector, sizeof(CSSSelector)); WTF::Partitions::fastFree(currentSelector); current = current->tagHistory(); ASSERT(!list.m_selectorArray[arrayIndex].isLastInSelectorList()); if (current) list.m_selectorArray[arrayIndex].setNotLastInTagHistory(); ++arrayIndex; } ASSERT(list.m_selectorArray[arrayIndex - 1].isLastInTagHistory()); } ASSERT(flattenedSize == arrayIndex); list.m_selectorArray[arrayIndex - 1].setLastInSelectorList(); selectorVector.clear(); return list; }
void CSSSelectorList::adoptSelectorVector(Vector<OwnPtr<CSSParserSelector> >& selectorVector) { deleteSelectors(); const size_t vectorSize = selectorVector.size(); size_t flattenedSize = 0; for (size_t i = 0; i < vectorSize; ++i) { for (CSSParserSelector* selector = selectorVector[i].get(); selector; selector = selector->tagHistory()) ++flattenedSize; } ASSERT(flattenedSize); if (flattenedSize == 1) { m_selectorArray = selectorVector[0]->releaseSelector().leakPtr(); m_selectorArray->setLastInSelectorList(); ASSERT(m_selectorArray->isLastInTagHistory()); selectorVector.shrink(0); return; } m_selectorArray = reinterpret_cast<CSSSelector*>(fastMalloc(sizeof(CSSSelector) * flattenedSize)); size_t arrayIndex = 0; for (size_t i = 0; i < vectorSize; ++i) { CSSParserSelector* current = selectorVector[i].get(); while (current) { OwnPtr<CSSSelector> selector = current->releaseSelector(); current = current->tagHistory(); move(selector.release(), &m_selectorArray[arrayIndex]); ASSERT(!m_selectorArray[arrayIndex].isLastInSelectorList()); if (current) m_selectorArray[arrayIndex].setNotLastInTagHistory(); ++arrayIndex; } ASSERT(m_selectorArray[arrayIndex - 1].isLastInTagHistory()); } ASSERT(flattenedSize == arrayIndex); m_selectorArray[arrayIndex - 1].setLastInSelectorList(); selectorVector.shrink(0); }