ArrayData* GlobalsArray::RemoveStr(ArrayData* ad, const StringData* k, bool copy) { auto a = asGlobals(ad); a->m_tab->unset(k); return a; }
ArrayData* GlobalsArray::SetRefStr(ArrayData* ad, StringData* k, Variant& v, bool copy) { auto a = asGlobals(ad); tvAsVariant(a->m_tab->lookupAdd(k)).assignRef(v); return a; }
ArrayData* GlobalsArray::SetStr(ArrayData* ad, StringData* k, Cell v, bool copy) { auto a = asGlobals(ad); cellSet(v, *tvToCell(a->m_tab->lookupAdd(k))); return a; }
bool GlobalsArray::ValidMArrayIter(const ArrayData* ad, const MArrayIter & fp) { assert(fp.getContainer() == ad); auto a = asGlobals(ad); if (fp.getResetFlag()) return false; if (fp.m_pos == IterEnd(a)) return false; NameValueTable::Iterator iter(a->m_tab, fp.m_pos); return iter.valid(); }
member_lval GlobalsArray::LvalStr(ArrayData* ad, StringData* k, bool /*copy*/) { auto a = asGlobals(ad); TypedValue* tv = a->m_tab->lookup(k); if (!tv) { TypedValue nulVal; tvWriteNull(nulVal); tv = a->m_tab->set(k, &nulVal); } return member_lval { a, tv }; }
Cell GlobalsArray::NvGetKey(const ArrayData* ad, ssize_t pos) { auto a = asGlobals(ad); NameValueTable::Iterator iter(a->m_tab, pos); if (iter.valid()) { auto k = iter.curKey(); if (k->isRefCounted()) { k->rawIncRefCount(); return make_tv<KindOfString>(const_cast<StringData*>(k)); } return make_tv<KindOfPersistentString>(k); } return make_tv<KindOfUninit>(); }
ArrayData* GlobalsArray::LvalStr(ArrayData* ad, StringData* k, Variant*& ret, bool copy) { auto a = asGlobals(ad); TypedValue* tv = a->m_tab->lookup(k); if (!tv) { TypedValue nulVal; tvWriteNull(&nulVal); tv = a->m_tab->set(k, &nulVal); } ret = &tvAsVariant(tv); return a; }
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; }
void GlobalsArray::NvGetKey(const ArrayData* ad, TypedValue* out, ssize_t pos) { auto a = asGlobals(ad); NameValueTable::Iterator iter(a->m_tab, pos); if (iter.valid()) { auto k = iter.curKey(); out->m_data.pstr = const_cast<StringData*>(k); out->m_type = KindOfString; k->incRefCount(); } else { out->m_type = KindOfUninit; } }
bool GlobalsArray::AdvanceMArrayIter(ArrayData* ad, MArrayIter& fp) { auto a = asGlobals(ad); bool reset = fp.getResetFlag(); NameValueTable::Iterator iter = reset ? NameValueTable::Iterator(a->m_tab) : NameValueTable::Iterator(a->m_tab, fp.m_pos); if (reset) { fp.setResetFlag(false); } else { if (!iter.valid()) { return false; } iter.next(); } fp.m_pos = iter.toInteger(); if (!iter.valid()) return false; // To conform to PHP behavior, we need to set the internal // cursor to point to the next element. iter.next(); a->m_pos = iter.toInteger(); return true; }
const TypedValue* GlobalsArray::NvGetStr(const ArrayData* ad, const StringData* k) { return asGlobals(ad)->m_tab->lookup(k); }
bool GlobalsArray::ExistsStr(const ArrayData* ad, const StringData* k) { return asGlobals(ad)->m_tab->lookup(k) != nullptr; }
const Variant& GlobalsArray::GetValueRef(const ArrayData* ad, ssize_t pos) { auto a = asGlobals(ad); NameValueTable::Iterator iter(a->m_tab, pos); return iter.valid() ? tvAsCVarRef(iter.curVal()) : null_variant; }
ArrayData* GlobalsArray::SetWithRefStr(ArrayData* ad, StringData* k, TypedValue v, bool) { auto a = asGlobals(ad); tvSetWithRef(v, *a->m_tab->lookupAdd(k)); return a; }
ssize_t GlobalsArray::IterEnd(const ArrayData* ad) { auto a = asGlobals(ad); return NameValueTable::Iterator::getEnd(a->m_tab).toInteger(); }
ssize_t GlobalsArray::IterRewind(const ArrayData* ad, ssize_t prev) { auto a = asGlobals(ad); NameValueTable::Iterator iter(a->m_tab, prev); iter.prev(); return iter.toInteger(); }
member_rval::ptr_u GlobalsArray::NvGetInt(const ArrayData* ad, int64_t k) { return asGlobals(ad)->m_tab->lookup(String(k).get()); }
const TypedValue* GlobalsArray::NvGetInt(const ArrayData* ad, int64_t k) { return asGlobals(ad)->m_tab->lookup(String(k).get()); }
ArrayData* GlobalsArray::SetRefStr(ArrayData* ad, StringData* k, member_lval v, bool) { auto a = asGlobals(ad); tvAsVariant(a->m_tab->lookupAdd(k)).assignRef(tvAsVariant(v.tv_ptr())); return a; }
ArrayData* GlobalsArray::SetRefInt(ArrayData* ad, int64_t k, Variant& v, bool copy) { return asGlobals(ad)->setRef(String(k).get(), v, copy); }
member_rval::ptr_u GlobalsArray::GetValueRef(const ArrayData* ad, ssize_t pos) { auto a = asGlobals(ad); NameValueTable::Iterator iter(a->m_tab, pos); return iter.valid() ? iter.curVal() : uninit_variant.asTypedValue(); }
ssize_t GlobalsArray::IterBegin(const ArrayData* ad) { auto a = asGlobals(ad); NameValueTable::Iterator iter(a->m_tab); return iter.toInteger(); }
member_rval::ptr_u GlobalsArray::NvGetStr(const ArrayData* ad, const StringData* k) { return asGlobals(ad)->m_tab->lookup(k); }