ArrayData* PackedArray::LvalInt(ArrayData* adIn, int64_t k, Variant*& ret, bool copy) { assert(checkInvariants(adIn)); if (LIKELY(size_t(k) < adIn->m_size)) { auto const ad = copy ? Copy(adIn) : adIn; ret = &tvAsVariant(&packedData(ad)[k]); return ad; } // We can stay packed if the index is m_size, and the operation does // the same thing as LvalNew. if (size_t(k) == adIn->m_size) return LvalNew(adIn, ret, copy); // Promote-to-mixed path, we know the key is new and should be using // findForNewInsert but aren't yet TODO(#2606310). auto const mixed = copy ? ToMixedCopy(adIn) : ToMixed(adIn); return mixed->addLvalImpl(k, ret); }
ArrayLval EmptyArray::LvalNewRef(ArrayData* ad, bool copy) { if (RuntimeOption::EvalHackArrCompatNotices) raiseHackArrCompatRefNew(); return LvalNew(ad, copy); }
arr_lval EmptyArray::LvalNewRef(ArrayData* ad, bool copy) { if (checkHACRefBind()) raiseHackArrCompatRefNew(); return LvalNew(ad, copy); }