Specialize vector & generic copies in HphpArray
This is some carnage left over from the Vector & devirtualize-ArrayData work. Several places I left the original call to copyImpl(), where a more specific call would have been ok. In one place, I called the wrong function, which would assert in debug and potentially crash in opt.
Esse commit está contido em:
@@ -1111,25 +1111,29 @@ static inline bool isContainer(const TypedValue& tv) {
|
||||
ArrayData* HphpArray::LvalIntVec(ArrayData* ad, int64_t k, Variant*& ret,
|
||||
bool copy) {
|
||||
auto a = asVector(ad);
|
||||
return (!copy ? a : a->copyImpl())->addLvalImpl(k, &ret);
|
||||
if (copy) a = a->copyVec();
|
||||
return a->addLvalImpl(k, &ret);
|
||||
}
|
||||
|
||||
ArrayData* HphpArray::LvalInt(ArrayData* ad, int64_t k, Variant*& ret,
|
||||
bool copy) {
|
||||
auto a = asGeneric(ad);
|
||||
return (!copy ? a : a->copyImpl())->addLvalImpl(k, &ret);
|
||||
if (copy) a = a->copyGeneric();
|
||||
return a->addLvalImpl(k, &ret);
|
||||
}
|
||||
|
||||
ArrayData* HphpArray::LvalStrVec(ArrayData* ad, StringData* key, Variant*& ret,
|
||||
bool copy) {
|
||||
auto a = asVector(ad);
|
||||
return (!copy ? a : a->copyImpl())->addLvalImpl(key, key->hash(), &ret);
|
||||
if (copy) a = a->copyVec();
|
||||
return a->addLvalImpl(key, key->hash(), &ret);
|
||||
}
|
||||
|
||||
ArrayData* HphpArray::LvalStr(ArrayData* ad, StringData* key, Variant*& ret,
|
||||
bool copy) {
|
||||
auto a = asGeneric(ad);
|
||||
return (!copy ? a : a->copyImpl())->addLvalImpl(key, key->hash(), &ret);
|
||||
if (copy) a = a->copyGeneric();
|
||||
return a->addLvalImpl(key, key->hash(), &ret);
|
||||
}
|
||||
|
||||
ArrayData *HphpArray::CreateLvalPtrVec(ArrayData* ad, StringData* key,
|
||||
@@ -1254,14 +1258,14 @@ ArrayData*
|
||||
HphpArray::SetRefStrVec(ArrayData* ad, StringData* k, CVarRef v, bool copy) {
|
||||
auto a = asVector(ad);
|
||||
if (copy) a = a->copyVec();
|
||||
// todo t2606310: key can't exist. use add/findForNewInsert
|
||||
return a->vectorToGeneric()->updateRef(k, v);
|
||||
}
|
||||
|
||||
ArrayData*
|
||||
HphpArray::SetRefStr(ArrayData* ad, StringData* k, CVarRef v, bool copy) {
|
||||
auto a = asGeneric(ad);
|
||||
if (copy) a = a->copyVec();
|
||||
// todo t2606310: key can't exist. use add/findForNewInsert
|
||||
if (copy) a = a->copyGeneric();
|
||||
return a->updateRef(k, v);
|
||||
}
|
||||
|
||||
@@ -1341,7 +1345,7 @@ ArrayData*
|
||||
HphpArray::AddLvalStr(ArrayData* ad, StringData* k, Variant*& ret, bool copy) {
|
||||
assert(!ad->exists(k));
|
||||
auto a = asGeneric(ad);
|
||||
if (copy) a = a->copyVec();
|
||||
if (copy) a = a->copyGeneric();
|
||||
return a->addLvalImpl(k, k->hash(), &ret);
|
||||
}
|
||||
|
||||
@@ -1426,7 +1430,7 @@ ArrayData* HphpArray::erase(ElmInd* ei, bool updateNext /* = false */) {
|
||||
|
||||
ArrayData* HphpArray::RemoveIntVec(ArrayData* ad, int64_t k, bool copy) {
|
||||
auto a = asVector(ad);
|
||||
if (copy) a = a->copyImpl();
|
||||
if (copy) a = a->copyVec();
|
||||
// todo t2606310: what is probability of (k == size-1)
|
||||
if (size_t(k) < a->m_size) {
|
||||
a->vectorToGeneric();
|
||||
@@ -1437,21 +1441,21 @@ ArrayData* HphpArray::RemoveIntVec(ArrayData* ad, int64_t k, bool copy) {
|
||||
|
||||
ArrayData* HphpArray::RemoveInt(ArrayData* ad, int64_t k, bool copy) {
|
||||
auto a = asGeneric(ad);
|
||||
if (copy) a = a->copyImpl();
|
||||
if (copy) a = a->copyGeneric();
|
||||
return a->erase(a->findForInsert(k));
|
||||
}
|
||||
|
||||
ArrayData*
|
||||
HphpArray::RemoveStrVec(ArrayData* ad, const StringData* key, bool copy) {
|
||||
auto a = asVector(ad);
|
||||
if (copy) a = a->copyImpl();
|
||||
if (copy) a = a->copyVec();
|
||||
return a;
|
||||
}
|
||||
|
||||
ArrayData*
|
||||
HphpArray::RemoveStr(ArrayData* ad, const StringData* key, bool copy) {
|
||||
auto a = asGeneric(ad);
|
||||
if (copy) a = a->copyImpl();
|
||||
if (copy) a = a->copyGeneric();
|
||||
return a->erase(a->findForInsert(key, key->hash()));
|
||||
}
|
||||
|
||||
@@ -1665,7 +1669,7 @@ ArrayData* HphpArray::Merge(ArrayData* ad, const ArrayData* elems, bool copy) {
|
||||
|
||||
ArrayData* HphpArray::PopVec(ArrayData* ad, Variant& value) {
|
||||
auto a = asVector(ad);
|
||||
if (a->getCount() > 1) a = a->copyImpl();
|
||||
if (a->getCount() > 1) a = a->copyVec();
|
||||
if (a->m_size > 0) {
|
||||
auto i = a->m_size - 1;
|
||||
value = tvAsCVarRef(&a->m_data[i].data);
|
||||
@@ -1680,7 +1684,7 @@ ArrayData* HphpArray::PopVec(ArrayData* ad, Variant& value) {
|
||||
|
||||
ArrayData* HphpArray::Pop(ArrayData* ad, Variant& value) {
|
||||
auto a = asGeneric(ad);
|
||||
if (a->getCount() > 1) a = a->copyImpl();
|
||||
if (a->getCount() > 1) a = a->copyGeneric();
|
||||
Elm* elms = a->m_data;
|
||||
ElmInd pos = IterEnd(a);
|
||||
if (validElmInd(pos)) {
|
||||
|
||||
Referência em uma Nova Issue
Bloquear um usuário