bool PackedArray::AdvanceMArrayIter(ArrayData* ad, MArrayIter& fp) { assert(checkInvariants(ad)); if (fp.getResetFlag()) { fp.setResetFlag(false); fp.m_pos = ArrayData::invalid_index; } else if (fp.m_pos == ArrayData::invalid_index) { return false; } fp.m_pos = IterAdvance(ad, fp.m_pos); if (fp.m_pos == ArrayData::invalid_index) { return false; } // To conform to PHP behavior, we need to set the internal // cursor to point to the next element. ad->m_pos = IterAdvance(ad, fp.m_pos); return true; }
bool StructArray::AdvanceMArrayIter(ArrayData* ad, MArrayIter& fp) { auto structArray = asStructArray(ad); if (fp.getResetFlag()) { fp.setResetFlag(false); fp.m_pos = 0; } else if (fp.m_pos == structArray->size()) { return false; } else { fp.m_pos = IterAdvance(structArray, fp.m_pos); } if (fp.m_pos == structArray->size()) { return false; } // We set ad's internal cursor to point to the next element // to conform with PHP5 behavior structArray->m_pos = IterAdvance(structArray, fp.m_pos); return true; }
size_t GlobalsArray::Vsize(const ArrayData* ad) { // We need to iterate to find out the actual size, since kNamedLocalDataType // elements in the array may have been set to KindOfUninit. auto a = asGlobals(ad); size_t count = 0; auto iter_limit = IterEnd(a); for (auto iter = IterBegin(a); iter != iter_limit; iter = IterAdvance(a, iter)) { ++count; } return count; }
size_t NameValueTableWrapper::Vsize(const ArrayData* ad) { // We need to iterate to find out the actual size, since // KindOfIndirect elements in the array may have been set to // KindOfUninit. auto a = asNVTW(ad); size_t count = 0; for (auto iter = IterBegin(a); iter != invalid_index; iter = IterAdvance(a, iter)) { ++count; } return count; }