ArrayData *VectorArray::prepend(CVarRef v, bool copy) { if (UNLIKELY(m_size == m_capacity)) { ZendArray *a = escalateToNonEmptyZendArray(); ArrayData *aa UNUSED = a->prepend(v, false); assert(!aa); return a; } if (UNLIKELY(copy)) { ArrayData *a = UNLIKELY(m_size >= FixedSize && Util::isPowerOfTwo(m_size)) ? // in this case, we would escalate in the capacity check anyway static_cast<ArrayData*>(escalateToNonEmptyZendArray()) : static_cast<ArrayData*>(NEW(VectorArray)(this)); ArrayData *aa UNUSED = a->prepend(v, false); assert(!aa); return a; } checkSize(); for (uint i = m_size; i > 0; i--) { // copying TV's by value, intentionally not refcounting. m_elems[i] = m_elems[i-1]; } tvAsUninitializedVariant(&m_elems[0]).constructValHelper(v); m_size++; // To match PHP-like semantics, the prepend operation resets the array's // internal iterator m_pos = (ssize_t)0; return nullptr; }
ArrayData *SharedMap::prepend(CVarRef v, bool copy) { ArrayData *escalated = escalate(); ArrayData *ee = escalated->prepend(v, false); if (ee) { escalated->release(); return ee; } return escalated; }
ArrayData *MapVariant::prepend(CVarRef v, bool copy) { if (copy) { ArrayData* ret = NEW(MapVariant)(this); ret->prepend(v, false); return ret; } insertKeyAtPos(0); m_elems.insert(0, ArrayFuncs::element(v)); return NULL; }
ArrayData *SharedMap::prepend(CVarRef v, bool copy) { ArrayData *escalated = SharedMap::escalate(); return releaseIfCopied(escalated, escalated->prepend(v, false)); }
ArrayData *APCLocalArray::Prepend(ArrayData* ad, const Variant& v, bool copy) { ArrayData *escalated = Escalate(ad); return releaseIfCopied(escalated, escalated->prepend(v, false)); }
ArrayData *SharedMap::Prepend(ArrayData* ad, CVarRef v, bool copy) { ArrayData *escalated = Escalate(ad); return releaseIfCopied(escalated, escalated->prepend(v, false)); }