Remove checkExist option to ArrayData::lval()

It appears to be a leftover optimization that only applied to HPHPC,
which is gone now.
Esse commit está contido em:
Edwin Smith
2013-06-11 08:02:09 -07:00
commit de Sara Golemon
commit 1e3f2c2864
13 arquivos alterados com 43 adições e 106 exclusões
+5 -7
Ver Arquivo
@@ -66,18 +66,16 @@ inline CVarRef ArrayData::get(const StringData* k, bool error) const {
return tv ? tvAsCVarRef(tv) : getNotFound(k, error);
}
inline ArrayData* ArrayData::lval(CStrRef k, Variant *&ret, bool copy,
bool checkExist) {
inline ArrayData* ArrayData::lval(CStrRef k, Variant *&ret, bool copy) {
assert(IsValidKey(k));
return lval(k.get(), ret, copy, checkExist);
return lval(k.get(), ret, copy);
}
inline ArrayData* ArrayData::lval(CVarRef k, Variant *&ret, bool copy,
bool checkExist) {
inline ArrayData* ArrayData::lval(CVarRef k, Variant *&ret, bool copy) {
assert(IsValidKey(k));
auto const cell = k.asCell();
return isIntKey(cell) ? lval(getIntKey(cell), ret, copy, checkExist)
: lval(getStringKey(cell), ret, copy, checkExist);
return isIntKey(cell) ? lval(getIntKey(cell), ret, copy)
: lval(getStringKey(cell), ret, copy);
}
inline
+9 -11
Ver Arquivo
@@ -114,7 +114,7 @@ public:
* Array interface functions.
*
* 1. For functions that return ArrayData pointers, these are the ones that
* can potentially escalate into a different ArrayData type. Return NULL
* can potentially escalate into a different ArrayData type. Return this
* if no escalation is needed.
*
* 2. All functions with a "key" parameter are type-specialized.
@@ -233,17 +233,15 @@ public:
Variant getKey(ssize_t pos) const;
/**
* Getting l-value (that Variant pointer) at specified key. Return NULL if
* Getting l-value (that Variant pointer) at specified key. Return this if
* escalation is not needed, or an escalated array data.
*/
virtual ArrayData *lval(int64_t k, Variant *&ret, bool copy,
bool checkExist = false) = 0;
virtual ArrayData *lval(StringData* k, Variant *&ret, bool copy,
bool checkExist = false) = 0;
virtual ArrayData *lval(int64_t k, Variant *&ret, bool copy) = 0;
virtual ArrayData *lval(StringData* k, Variant *&ret, bool copy) = 0;
/**
* Getting l-value (that Variant pointer) of a new element with the next
* available integer key. Return NULL if escalation is not needed, or an
* available integer key. Return this if escalation is not needed, or an
* escalated array data. Note that adding a new element with the next
* available integer key may fail, in which case ret is set to point to
* the lval blackhole (see Variant::lvalBlackHole() for details).
@@ -260,7 +258,7 @@ public:
/**
* Setting a value at specified key. If "copy" is true, make a copy first
* then set the value. Return NULL if escalation is not needed, or an
* then set the value. Return this if escalation is not needed, or an
* escalated array data.
*/
ArrayData *set(int64_t k, CVarRef v, bool copy);
@@ -286,7 +284,7 @@ public:
/**
* Remove a value at specified key. If "copy" is true, make a copy first
* then remove the value. Return NULL if escalation is not needed, or an
* then remove the value. Return this if escalation is not needed, or an
* escalated array data.
*/
virtual ArrayData *remove(int64_t k, bool copy) = 0;
@@ -302,8 +300,8 @@ public:
CVarRef get(const StringData* k, bool error = false) const;
CVarRef get(CStrRef k, bool error = false) const;
CVarRef get(CVarRef k, bool error = false) const;
ArrayData *lval(CStrRef k, Variant *&ret, bool copy, bool checkExist=false);
ArrayData *lval(CVarRef k, Variant *&ret, bool copy, bool checkExist=false);
ArrayData *lval(CStrRef k, Variant *&ret, bool copy);
ArrayData *lval(CVarRef k, Variant *&ret, bool copy);
ArrayData *createLvalPtr(CStrRef k, Variant *&ret, bool copy);
ArrayData *getLvalPtr(CStrRef k, Variant *&ret, bool copy);
ArrayData *set(CStrRef k, CVarRef v, bool copy);
+3 -30
Ver Arquivo
@@ -1112,41 +1112,14 @@ ArrayData* HphpArray::updateRef(StringData* key, CVarRef data) {
return this;
}
ArrayData* HphpArray::lval(int64_t k, Variant*& ret, bool copy,
bool checkExist /* = false */) {
ArrayData* HphpArray::lval(int64_t k, Variant*& ret, bool copy) {
assert(checkInvariants());
if (checkExist && copy) {
ElmInd pos = isVector() ? (size_t(k) < m_size ? ElmInd(k) : ElmIndEmpty) :
find(k);
if (pos != ElmIndEmpty) {
Elm* e = &m_data[pos];
if (tvAsVariant(&e->data).isReferenced() ||
tvAsVariant(&e->data).isObject()) {
ret = &tvAsVariant(&e->data);
return this;
}
}
}
return (!copy ? this : copyImpl())->addLvalImpl(k, &ret);
}
ArrayData* HphpArray::lval(StringData* key, Variant*& ret, bool copy,
bool checkExist /* = false */) {
ArrayData* HphpArray::lval(StringData* key, Variant*& ret, bool copy) {
assert(checkInvariants());
strhash_t prehash = key->hash();
if (checkExist && copy && !isVector()) {
auto pos = find(key, prehash);
if (pos != ElmIndEmpty) {
Elm* e = &m_data[pos];
TypedValue* tv = &e->data;
if (tvAsVariant(tv).isReferenced() ||
tvAsVariant(tv).isObject()) {
ret = &tvAsVariant(tv);
return this;
}
}
}
return (!copy ? this : copyImpl())->addLvalImpl(key, prehash, &ret);
return (!copy ? this : copyImpl())->addLvalImpl(key, key->hash(), &ret);
}
ArrayData *HphpArray::createLvalPtr(StringData* key, Variant*& ret, bool copy) {
+2 -3
Ver Arquivo
@@ -122,9 +122,8 @@ public:
bool exists(const StringData* k) const;
// implements ArrayData
ArrayData* lval(int64_t k, Variant*& ret, bool copy, bool checkExist=false);
ArrayData* lval(StringData* k, Variant*& ret, bool copy,
bool checkExist=false);
ArrayData* lval(int64_t k, Variant*& ret, bool copy);
ArrayData* lval(StringData* k, Variant*& ret, bool copy);
ArrayData* lvalNew(Variant*& ret, bool copy);
// overrides ArrayData
+5 -23
Ver Arquivo
@@ -268,33 +268,15 @@ void PolicyArray::NvGetKey(const ArrayData* ad, TypedValue* out, ssize_t pos) {
}
template <class K>
ArrayData *PolicyArray::lvalImpl(K k, Variant*& ret,
bool copy, bool checkExist) {
ArrayData *PolicyArray::lvalImpl(K k, Variant*& ret, bool copy) {
APILOG(this) << "(" << keystr(k) << ", " << ret << ", "
<< copy << ", " << checkExist << ")";
<< copy << ", " << ")";
if (copy) {
return PolicyArray::copy()->lvalImpl(k, ret, false, checkExist);
}
PosType pos = PosType::invalid;
if (checkExist && (pos = find(k, m_size)) != PosType::invalid) {
assert(toInt<uint32_t>(pos) < m_size);
auto& e = lval(pos);
if (e.isReferenced() || e.isObject()) {
MYLOG << (void*)this << "->lval:" << "found1";
ret = &e;
return this;
}
}
// Make sure the search is done. TODO: this may actually search
// twice sometimes.
if (pos == PosType::invalid) {
pos = find(k, m_size);
return PolicyArray::copy()->lvalImpl(k, ret, false);
}
PosType pos = find(k, m_size);
if (pos != PosType::invalid) {
// found, don't overwrite anything
assert(toInt<uint32_t>(pos) <= m_size);
@@ -677,7 +659,7 @@ ArrayData *PolicyArray::merge(const ArrayData *elems, bool copy) {
StringData *s = key.getStringData();
Variant *p;
// Andrei TODO: make sure this is the right semantics
lval(s, p, false, true);
lval(s, p, false);
p->setWithRef(value);
}
}
+5 -7
Ver Arquivo
@@ -375,7 +375,7 @@ public:
private:
template <class K>
ArrayData *lvalImpl(K k, Variant *&ret, bool copy, bool checkExist);
ArrayData *lvalImpl(K k, Variant *&ret, bool copy);
using Store::lval;
@@ -386,15 +386,13 @@ public:
*/
virtual ArrayData *lval(int64_t k,
Variant *&ret,
bool copy,
bool checkExist = false) FOLLY_OVERRIDE {
return lvalImpl(k, ret, copy, checkExist);
bool copy) FOLLY_OVERRIDE {
return lvalImpl(k, ret, copy);
}
virtual ArrayData *lval(StringData* k,
Variant*& ret,
bool copy,
bool checkExist = false) FOLLY_OVERRIDE {
return lvalImpl(k, ret, copy, checkExist);
bool copy) FOLLY_OVERRIDE {
return lvalImpl(k, ret, copy);
}
/**
+2 -4
Ver Arquivo
@@ -110,14 +110,12 @@ inline ArrayData* releaseIfCopied(ArrayData* a1, ArrayData* a2) {
return a2;
}
ArrayData *SharedMap::lval(int64_t k, Variant *&ret, bool copy,
bool checkExist /* = false */) {
ArrayData *SharedMap::lval(int64_t k, Variant *&ret, bool copy) {
ArrayData *escalated = SharedMap::escalate();
return releaseIfCopied(escalated, escalated->lval(k, ret, false));
}
ArrayData *SharedMap::lval(StringData* k, Variant *&ret, bool copy,
bool checkExist /* = false */) {
ArrayData *SharedMap::lval(StringData* k, Variant *&ret, bool copy) {
ArrayData *escalated = SharedMap::escalate();
return releaseIfCopied(escalated, escalated->lval(k, ret, false));
}
+2 -4
Ver Arquivo
@@ -67,10 +67,8 @@ public:
bool exists(int64_t k) const;
bool exists(const StringData* k) const;
virtual ArrayData *lval(int64_t k, Variant *&ret, bool copy,
bool checkExist = false);
virtual ArrayData *lval(StringData* k, Variant *&ret, bool copy,
bool checkExist = false);
virtual ArrayData *lval(int64_t k, Variant *&ret, bool copy);
virtual ArrayData *lval(StringData* k, Variant *&ret, bool copy);
ArrayData *lvalNew(Variant *&ret, bool copy);
static ArrayData *SetInt(ArrayData*, int64_t k, CVarRef v, bool copy);
+2 -2
Ver Arquivo
@@ -465,11 +465,11 @@ class Array : protected SmartPtr<ArrayData> {
template<typename T>
Variant &lvalAtImpl(const T &key, ACCESSPARAMS_DECL) {
assert(!(flags & AccessFlags::CheckExist));
if (!m_px) ArrayBase::operator=(ArrayData::Create());
Variant *ret = nullptr;
ArrayData *escalated =
m_px->lval(key, ret, m_px->getCount() > 1,
flags & AccessFlags::CheckExist);
m_px->lval(key, ret, m_px->getCount() > 1);
if (escalated != m_px) ArrayBase::operator=(escalated);
assert(ret);
return *ret;
+3 -5
Ver Arquivo
@@ -1142,19 +1142,17 @@ template<typename T>
Variant& Variant::LvalAtImpl0(
Variant *self, T key, Variant *tmp, bool blackHole, ACCESSPARAMS_IMPL) {
head:
assert(!(flags & AccessFlags::CheckExist));
if (self->m_type == KindOfArray) {
ArrayData *arr = self->m_data.parr;
ArrayData *escalated;
Variant *ret = nullptr;
if (LvalHelper<T>::CheckParams && flags & AccessFlags::Key) {
escalated = arr->lval(key, ret, arr->getCount() > 1,
flags & AccessFlags::CheckExist);
escalated = arr->lval(key, ret, arr->getCount() > 1);
} else {
typename LvalHelper<T>::KeyType k(ToKey(key));
if (LvalHelper<T>::CheckKey(k)) {
escalated =
arr->lval(k, ret, arr->getCount() > 1,
flags & AccessFlags::CheckExist);
escalated = arr->lval(k, ret, arr->getCount() > 1);
} else {
if (blackHole) ret = &lvalBlackHole();
else ret = tmp;
-1
Ver Arquivo
@@ -418,7 +418,6 @@ public:
NoHipHop = 8,
Error_Key = Error | Key,
CheckExist_Key = CheckExist | Key,
Error_NoHipHop = Error | NoHipHop,
};
static Type IsKey(bool s) { return s ? Key : None; }
+3 -5
Ver Arquivo
@@ -91,13 +91,11 @@ TypedValue* NameValueTableWrapper::NvGetInt(const ArrayData* ad, int64_t k) {
return asNVTW(ad)->m_tab->lookup(String(k).get());
}
ArrayData* NameValueTableWrapper::lval(int64_t k, Variant*& ret, bool copy,
bool checkExist) {
return lval(String(k), ret, copy, checkExist);
ArrayData* NameValueTableWrapper::lval(int64_t k, Variant*& ret, bool) {
return lval(String(k), ret, false);
}
ArrayData* NameValueTableWrapper::lval(StringData* k, Variant*& ret,
bool copy, bool checkExist) {
ArrayData* NameValueTableWrapper::lval(StringData* k, Variant*& ret, bool) {
TypedValue* tv = m_tab->lookup(k);
if (!tv) {
TypedValue nulVal;
+2 -4
Ver Arquivo
@@ -88,10 +88,8 @@ public: // ArrayData implementation
static TypedValue* NvGetInt(const ArrayData*, int64_t k);
static TypedValue* NvGetStr(const ArrayData*, const StringData* k);
virtual ArrayData* lval(int64_t k, Variant*& ret, bool copy,
bool checkExist = false);
virtual ArrayData* lval(StringData* k, Variant*& ret,
bool copy, bool checkExist = false);
virtual ArrayData* lval(int64_t k, Variant*& ret, bool copy);
virtual ArrayData* lval(StringData* k, Variant*& ret, bool copy);
virtual ArrayData* lvalNew(Variant*& ret, bool copy);
static ArrayData* SetInt(ArrayData*, int64_t k, CVarRef v, bool copy);