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();
}
Exemple #2
0
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;
}
Exemple #3
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);
}