Skip to content

Commit

Permalink
Manually inline HphpArray::addValWithRef to the one place they're use…
Browse files Browse the repository at this point in the history
…d used.

They're only called from one place, and manually inlining them allows
a little bit of code sharing; maybe more over time.

Reviewed By: @jdelong

Differential Revision: D970506
  • Loading branch information
edwinsmith authored and sgolemon committed Sep 16, 2013
1 parent 231a7ad commit 4fd3b59
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 28 deletions.
42 changes: 16 additions & 26 deletions hphp/runtime/base/hphp-array.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1245,30 +1245,6 @@ inline ArrayData* HphpArray::addVal(StringData* key, CVarRef data) {
return initVal(e.data, data);
}

inline ArrayData* HphpArray::addValWithRef(int64_t ki, CVarRef data) {
resizeIfNeeded();
auto ei = findForInsert(ki);
if (!validPos(*ei)) {
auto& e = allocElm(ei);
e.setIntKey(ki);
if (ki >= m_nextKI) m_nextKI = ki + 1;
initWithRef(e.data, data);
}
return this;
}

inline ArrayData* HphpArray::addValWithRef(StringData* key, CVarRef data) {
resizeIfNeeded();
strhash_t h = key->hash();
auto ei = findForInsert(key, h);
if (!validPos(*ei)) {
auto& e = allocElm(ei);
e.setStrKey(key, h);
initWithRef(e.data, data);
}
return this;
}

INLINE_SINGLE_CALLER
ArrayData* HphpArray::update(int64_t ki, CVarRef data) {
auto ei = findForInsert(ki);
Expand Down Expand Up @@ -1753,11 +1729,25 @@ ArrayData* HphpArray::Plus(ArrayData* ad, const ArrayData* elems, bool copy) {
for (ArrayIter it(elems); !it.end(); it.next()) {
Variant key = it.first();
CVarRef value = it.secondRef();
TypedValue* tv;
if (key.asTypedValue()->m_type == KindOfInt64) {
a->addValWithRef(key.toInt64(), value);
auto k = key.toInt64();
auto ei = a->findForInsert(k);
if (validPos(*ei)) continue;
auto& e = a->newElm(ei, k);
e.setIntKey(k);
if (k >= a->m_nextKI) a->m_nextKI = k + 1;
tv = &e.data;
} else {
a->addValWithRef(key.getStringData(), value);
auto k = key.getStringData();
strhash_t h = k->hash();
auto ei = a->findForInsert(k, h);
if (validPos(*ei)) continue;
auto& e = a->newElm(ei, h);
e.setStrKey(k, h);
tv = &e.data;
}
a->initWithRef(*tv, value);
}
return a;
}
Expand Down
2 changes: 0 additions & 2 deletions hphp/runtime/base/hphp-array.h
Original file line number Diff line number Diff line change
Expand Up @@ -404,8 +404,6 @@ class HphpArray : public ArrayData {
ArrayData* addLvalImpl(StringData* key, strhash_t h, Variant*& ret);
ArrayData* addVal(int64_t ki, CVarRef data);
ArrayData* addVal(StringData* key, CVarRef data);
ArrayData* addValWithRef(int64_t ki, CVarRef data);
ArrayData* addValWithRef(StringData* key, CVarRef data);

ArrayData* update(int64_t ki, CVarRef data);
ArrayData* update(StringData* key, CVarRef data);
Expand Down

0 comments on commit 4fd3b59

Please sign in to comment.