ArrayData *VectorArray::lval(int64 k, Variant *&ret, bool copy, bool checkExist /* = false */) { ret = inRange(k, m_size) ? &tvAsVariant(&m_elems[k]) : nullptr; if (ret == nullptr && k != m_size) { ZendArray *a = escalateToZendArray(); a->addLvalImpl(k, &ret, false); return a; } if (LIKELY(!copy)) { if (ret) return nullptr; assert(m_size == k); checkSize(); Variant& v = tvAsUninitializedVariant(&m_elems[k]); v.setUninitNull(); ret = &v; checkInsertIterator((ssize_t)k); m_size++; return nullptr; } if (checkExist && ret && (ret->isReferenced() || ret->isObject())) { return nullptr; } VectorArray *a = NEW(VectorArray)(this); if (ret) { Variant& v = tvAsVariant(&a->m_elems[k]); ret = &v; assert(ret); return a; } assert(m_size == k); a->VectorArray::lvalNew(ret, false); return a; }
ArrayData *VectorArray::lval(litstr k, Variant *&ret, bool copy, bool checkExist /* = false */) { ZendArray *a = escalateToZendArray(); StringData sd(k, AttachLiteral); a->addLvalImpl(&sd, sd.hash(), &ret); return a; }
ArrayData *ZendArray::addLval(CStrRef k, Variant *&ret, bool copy) { ASSERT(!exists(k)); if (UNLIKELY(copy)) { ZendArray *result = copyImpl(); result->addLvalImpl(k.get(), k->hash(), &ret, false); return result; } addLvalImpl(k.get(), k->hash(), &ret, false); return NULL; }
ArrayData *ZendArray::addLval(int64 k, Variant *&ret, bool copy) { ASSERT(!exists(k)); if (UNLIKELY(copy)) { ZendArray *result = copyImpl(); result->addLvalImpl(k, &ret, false); return result; } addLvalImpl(k, &ret, false); return NULL; }
ArrayData *ZendArray::lval(int64 k, Variant *&ret, bool copy, bool checkExist /* = false */) { if (!copy) { addLvalImpl(k, &ret); return NULL; } if (!checkExist) { ZendArray *a = copyImpl(); a->addLvalImpl(k, &ret); return a; } Bucket *p = find(k); if (p && (p->data.isReferenced() || p->data.isObject())) { ret = &p->data; return NULL; } ZendArray *a = copyImpl(); a->addLvalImpl(k, &ret, p); return a; }
ArrayData *VectorArray::lval(CVarRef k, Variant *&ret, bool copy, bool checkExist /* = false */) { Variant::TypedValueAccessor tva = k.getTypedAccessor(); if (isIntKey(tva)) { return VectorArray::lval(getIntKey(tva), ret, copy, checkExist); } ASSERT(k.isString()); ZendArray *a = escalateToZendArray(); StringData *sd = getStringKey(tva); a->addLvalImpl(sd, sd->hash(), &ret); return a; }
ArrayData *ZendArray::lval(CStrRef k, Variant *&ret, bool copy, bool checkExist /* = false */) { StringData *key = k.get(); int64 prehash = key->hash(); if (!copy) { addLvalImpl(key, prehash, &ret); return NULL; } if (!checkExist) { ZendArray *a = copyImpl(); a->addLvalImpl(key, prehash, &ret); return a; } Bucket *p = find(key->data(), key->size(), prehash); if (p && (p->data.isReferenced() || p->data.isObject())) { ret = &p->data; return NULL; } ZendArray *a = copyImpl(); a->addLvalImpl(key, prehash, &ret, p); return a; }
ArrayData *VectorArray::lval(StringData* k, Variant *&ret, bool copy, bool checkExist /* = false */) { ZendArray *a = escalateToZendArray(); a->addLvalImpl(k, k->hash(), &ret); return a; }