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(); }
void CSSSelectorList::adopt(CSSSelectorList& list) { deleteSelectors(); m_selectorArray = list.m_selectorArray; list.m_selectorArray = 0; ASSERT_WITH_SECURITY_IMPLICATION(componentCount()); }
void CSSSelectorList::adoptSelectorVector(Vector<CSSSelector*>& selectorVector) { deleteSelectors(); const size_t size = selectorVector.size(); ASSERT(size); if (size == 1) { m_selectorArray = selectorVector[0]; m_selectorArray->setLastInSelectorList(); selectorVector.shrink(0); return; } m_selectorArray = reinterpret_cast<CSSSelector*>(fastMalloc(sizeof(CSSSelector) * selectorVector.size())); for (size_t i = 0; i < size; ++i) { memcpy(&m_selectorArray[i], selectorVector[i], sizeof(CSSSelector)); // We want to free the memory (which was allocated with fastNew), but we // don't want the destructor to run since it will affect the copy we've just made. fastDeleteSkippingDestructor(selectorVector[i]); ASSERT(!m_selectorArray[i].isLastInSelectorList()); } m_selectorArray[size - 1].setLastInSelectorList(); selectorVector.shrink(0); }
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); }
void CSSSelectorList::adoptSelectorVector(Vector<CSSSelector*>& selectorVector) { deleteSelectors(); const size_t size = selectorVector.size(); ASSERT(size); if (size == 1) { m_selectorArray = selectorVector[0]; m_selectorArray->setLastInSelectorList(); selectorVector.shrink(0); return; } m_selectorArray = reinterpret_cast<CSSSelector*>(fastMalloc(sizeof(CSSSelector) * selectorVector.size())); for (size_t i = 0; i < size; ++i) { memcpy(&m_selectorArray[i], selectorVector[i], sizeof(CSSSelector)); // We want to free the memory (which was allocated with new), but we // don't want the destructor to run since it will affect the copy // we've just made. In theory this is undefined, but operator delete // is only defined taking a void*, so in practice it should be ok. delete reinterpret_cast<char*>(selectorVector[i]); ASSERT(!m_selectorArray[i].isLastInSelectorList()); } m_selectorArray[size - 1].setLastInSelectorList(); selectorVector.shrink(0); }
void CSSSelectorList::adopt(CSSSelectorList& list) { deleteSelectors(); m_selectorArray = list.m_selectorArray; list.m_selectorArray = 0; }
CSSSelectorList::~CSSSelectorList() { deleteSelectors(); }