Item::Iterator::Ptr EvaluationCache<IsForGlobal>::evaluateSequence(const DynamicContext::Ptr &context) const { ItemSequenceCacheCell::Vector &cells = IsForGlobal ? context->globalItemSequenceCacheCells(m_varSlot) : context->itemSequenceCacheCells(m_varSlot); ItemSequenceCacheCell &cell = cells[m_varSlot]; if(cell.inUse) { context->error(QtXmlPatterns::tr("Circularity detected"), ReportContext::XTDE0640, this); } switch(cell.cacheState) { case ItemSequenceCacheCell::Full: { /** * We don't use makeListIterator() here because the MIPSPro compiler can't handle it. */ return Item::Iterator::Ptr(new ListIterator<Item, Item::List>(cell.cachedItems)); } case ItemSequenceCacheCell::Empty: { cell.inUse = true; cell.sourceIterator = m_operand->evaluateSequence(IsForGlobal ? topFocusContext(context) : context); cell.cacheState = ItemSequenceCacheCell::PartiallyPopulated; /* Fallthrough. */ } case ItemSequenceCacheCell::PartiallyPopulated: { cell.inUse = false; Q_ASSERT_X(cells.at(m_varSlot).sourceIterator, Q_FUNC_INFO, "This trigger for a cache bug which hasn't yet been analyzed."); return Item::Iterator::Ptr(new CachingIterator(cells, m_varSlot, IsForGlobal ? topFocusContext(context) : context)); } default: { Q_ASSERT_X(false, Q_FUNC_INFO, "This path is not supposed to be run."); return Item::Iterator::Ptr(); } } }