bool ZendArray::addLvalImpl(StringData *key, int64 h, Variant **pDest, bool doFind /* = true */) { ASSERT(key != NULL && pDest != NULL); Bucket *p; if (doFind) { p = find(key->data(), key->size(), h); if (p) { *pDest = &p->data; return false; } } p = NEW(Bucket)(); p->key = key; p->key->incRefCount(); p->h = h; *pDest = &p->data; uint nIndex = (h & m_nTableMask); CONNECT_TO_BUCKET_LIST(p, m_arBuckets[nIndex]); SET_ARRAY_BUCKET_HEAD(m_arBuckets, nIndex, p); CONNECT_TO_GLOBAL_DLLIST(p); if (++m_nNumOfElements > m_nTableSize) { resize(); } return true; }
bool ZendArray::addLvalImpl(int64 h, Variant **pDest, bool doFind /* = true */) { ASSERT(pDest != NULL); Bucket *p; if (doFind) { p = find(h); if (p) { *pDest = &p->data; return false; } } p = NEW(Bucket)(); p->h = h; if (pDest) { *pDest = &p->data; } uint nIndex = (h & m_nTableMask); CONNECT_TO_BUCKET_LIST(p, m_arBuckets[nIndex]); SET_ARRAY_BUCKET_HEAD(m_arBuckets, nIndex, p); CONNECT_TO_GLOBAL_DLLIST(p); if (h >= m_nNextFreeElement && m_nNextFreeElement >= 0) { m_nNextFreeElement = h + 1; } if (++m_nNumOfElements > m_nTableSize) { resize(); } return true; }
void ZendArray::rehash() { memset(m_arBuckets, 0, m_nTableSize * sizeof(Bucket *)); for (Bucket *p = m_pListHead; p; p = p->pListNext) { uint nIndex = (p->h & m_nTableMask); CONNECT_TO_BUCKET_LIST(p, m_arBuckets[nIndex]); SET_ARRAY_BUCKET_HEAD(m_arBuckets, nIndex, p); } }
/** * postSort() runs after sorting has been performed. For ZendArray, postSort() * handles rewiring the linked list according to the results of the sort. Also, * if resetKeys is true, postSort() will renumber the keys 0 thru n-1. */ void ZendArray::postSort(Bucket** buffer, bool resetKeys) { uint last = m_size-1; m_pListHead = buffer[0]; m_pListTail = buffer[last]; m_pos = (ssize_t)m_pListHead; Bucket* b = buffer[0]; b->pListLast = NULL; if (resetKeys) { memset(m_arBuckets, 0, tableSize() * sizeof(Bucket*)); for (uint i = 0; i < last; ++i) { Bucket* bNext = buffer[i+1]; b->pListNext = bNext; bNext->pListLast = b; if (b->hasStrKey() && b->skey->decRefCount() == 0) { DELETE(StringData)(b->skey); } b->setIntKey(i); uint nIndex = (i & m_nTableMask); CONNECT_TO_BUCKET_LIST(b, m_arBuckets[nIndex]); SET_ARRAY_BUCKET_HEAD(m_arBuckets, nIndex, b); b = bNext; } if (b->hasStrKey() && b->skey->decRefCount() == 0) { DELETE(StringData)(b->skey); } b->setIntKey(last); uint nIndex = (last & m_nTableMask); CONNECT_TO_BUCKET_LIST(b, m_arBuckets[nIndex]); SET_ARRAY_BUCKET_HEAD(m_arBuckets, nIndex, b); m_nNextFreeElement = m_size; } else { for (uint i = 0; i < last; ++i) { Bucket* bNext = buffer[i+1]; b->pListNext = bNext; bNext->pListLast = b; b = bNext; } } b->pListNext = NULL; }
bool ZendArray::nextInsertWithRef(CVarRef data) { int64 h = m_nNextFreeElement; Bucket * p = NEW(Bucket)(withRefBind(data)); p->h = h; uint nIndex = (h & m_nTableMask); CONNECT_TO_BUCKET_LIST(p, m_arBuckets[nIndex]); SET_ARRAY_BUCKET_HEAD(m_arBuckets, nIndex, p); CONNECT_TO_GLOBAL_DLLIST(p); m_nNextFreeElement = h + 1; if (++m_nNumOfElements > m_nTableSize) { resize(); } return true; }
HOT_FUNC_HPHP ZendArray::ZendArray(uint nSize, int64 n, Bucket *bkts[]) : m_flag(0), m_pListHead(bkts[0]), m_pListTail(0), m_nNextFreeElement(n) { m_pos = (ssize_t)(m_pListHead); m_size = nSize; init(nSize); for (Bucket **b = bkts; *b; b++) { Bucket *p = *b; uint nIndex = (p->hashKey() & m_nTableMask); CONNECT_TO_BUCKET_LIST(p, m_arBuckets[nIndex]); m_arBuckets[nIndex] = p; CONNECT_TO_GLOBAL_DLLIST_INIT(p); } }
HOT_FUNC_HPHP bool ZendArray::addValWithRef(StringData *key, CVarRef data) { int64 h = key->hash(); Bucket *p = findForInsert(key->data(), key->size(), h); if (p) { return false; } p = NEW(Bucket)(withRefBind(data)); p->setStrKey(key, h); uint nIndex = (h & m_nTableMask); CONNECT_TO_BUCKET_LIST(p, m_arBuckets[nIndex]); SET_ARRAY_BUCKET_HEAD(m_arBuckets, nIndex, p); CONNECT_TO_GLOBAL_DLLIST(p); if (++m_size > tableSize()) { resize(); } return true; }
bool ZendArray::addValWithRef(StringData *key, CVarRef data) { int64 h = key->hash(); Bucket *p = find(key->data(), key->size(), h); if (p) { return false; } p = NEW(Bucket)(withRefBind(data)); p->key = key; p->key->incRefCount(); p->h = h; uint nIndex = (h & m_nTableMask); CONNECT_TO_BUCKET_LIST(p, m_arBuckets[nIndex]); SET_ARRAY_BUCKET_HEAD(m_arBuckets, nIndex, p); CONNECT_TO_GLOBAL_DLLIST(p); if (++m_nNumOfElements > m_nTableSize) { resize(); } return true; }
bool ZendArray::addValWithRef(int64 h, CVarRef data) { Bucket *p = find(h); if (p) { return false; } p = NEW(Bucket)(withRefBind(data)); p->h = h; uint nIndex = (h & m_nTableMask); CONNECT_TO_BUCKET_LIST(p, m_arBuckets[nIndex]); SET_ARRAY_BUCKET_HEAD(m_arBuckets, nIndex, p); CONNECT_TO_GLOBAL_DLLIST(p); if (h >= m_nNextFreeElement && m_nNextFreeElement >= 0) { m_nNextFreeElement = h + 1; } if (++m_nNumOfElements > m_nTableSize) { resize(); } return true; }
bool ZendArray::nextInsertRef(CVarRef data) { if (m_nNextFreeElement < 0) { raise_warning("Cannot add element to the array as the next element is " "already occupied"); return false; } int64 h = m_nNextFreeElement; Bucket * p = NEW(Bucket)(strongBind(data)); p->h = h; uint nIndex = (h & m_nTableMask); CONNECT_TO_BUCKET_LIST(p, m_arBuckets[nIndex]); SET_ARRAY_BUCKET_HEAD(m_arBuckets, nIndex, p); CONNECT_TO_GLOBAL_DLLIST(p); m_nNextFreeElement = h + 1; if (++m_nNumOfElements > m_nTableSize) { resize(); } return true; }
HOT_FUNC_HPHP ArrayData *ZendArray::add(CStrRef k, CVarRef v, bool copy) { ASSERT(!exists(k)); if (UNLIKELY(copy)) { ZendArray *result = copyImpl(); result->add(k, v, false); return result; } int64 h = k->hash(); Bucket *p = NEW(Bucket)(v); p->setStrKey(k.get(), h); uint nIndex = (h & m_nTableMask); CONNECT_TO_BUCKET_LIST(p, m_arBuckets[nIndex]); SET_ARRAY_BUCKET_HEAD(m_arBuckets, nIndex, p); CONNECT_TO_GLOBAL_DLLIST(p); if (++m_size > tableSize()) { resize(); } return NULL; }
ArrayData *ZendArray::add(CStrRef k, CVarRef v, bool copy) { ASSERT(!exists(k)); if (UNLIKELY(copy)) { ZendArray *result = copyImpl(); result->add(k, v, false); return result; } int64 h = k->hash(); Bucket *p = NEW(Bucket)(v); p->key = k.get(); p->key->incRefCount(); p->h = h; uint nIndex = (h & m_nTableMask); CONNECT_TO_BUCKET_LIST(p, m_arBuckets[nIndex]); SET_ARRAY_BUCKET_HEAD(m_arBuckets, nIndex, p); CONNECT_TO_GLOBAL_DLLIST(p); if (++m_nNumOfElements > m_nTableSize) { resize(); } return NULL; }
ArrayData *ZendArray::add(int64 k, CVarRef v, bool copy) { ASSERT(!exists(k)); if (UNLIKELY(copy)) { ZendArray *result = copyImpl(); result->add(k, v, false); return result; } Bucket *p = NEW(Bucket)(v); p->h = k; uint nIndex = (k & m_nTableMask); CONNECT_TO_BUCKET_LIST(p, m_arBuckets[nIndex]); SET_ARRAY_BUCKET_HEAD(m_arBuckets, nIndex, p); CONNECT_TO_GLOBAL_DLLIST(p); if (k >= m_nNextFreeElement && m_nNextFreeElement >= 0) { m_nNextFreeElement = k + 1; } if (++m_nNumOfElements > m_nTableSize) { resize(); } return NULL; }
bool ZendArray::updateRef(StringData *key, CVarRef data) { int64 h = key->hash(); Bucket *p = findForInsert(key->data(), key->size(), h); if (p) { p->data.assignRefHelper(data); return true; } p = NEW(Bucket)(strongBind(data)); p->setStrKey(key, h); uint nIndex = (h & m_nTableMask); CONNECT_TO_BUCKET_LIST(p, m_arBuckets[nIndex]); SET_ARRAY_BUCKET_HEAD(m_arBuckets, nIndex, p); CONNECT_TO_GLOBAL_DLLIST(p); if (++m_size > tableSize()) { resize(); } return true; }
bool ZendArray::updateRef(int64 h, CVarRef data) { Bucket *p = findForInsert(h); if (p) { p->data.assignRefHelper(data); return true; } p = NEW(Bucket)(strongBind(data)); p->setIntKey(h); uint nIndex = (h & m_nTableMask); CONNECT_TO_BUCKET_LIST(p, m_arBuckets[nIndex]); SET_ARRAY_BUCKET_HEAD(m_arBuckets, nIndex, p); CONNECT_TO_GLOBAL_DLLIST(p); if (h >= m_nNextFreeElement && m_nNextFreeElement >= 0) { m_nNextFreeElement = h + 1; } if (++m_size > tableSize()) { resize(); } return true; }
HOT_FUNC_HPHP bool ZendArray::addLvalImpl(StringData *key, int64 h, Variant **pDest, bool doFind /* = true */) { ASSERT(key != NULL && pDest != NULL); Bucket *p; if (doFind) { p = findForInsert(key->data(), key->size(), h); if (p) { *pDest = &p->data; return false; } } p = NEW(Bucket)(); p->setStrKey(key, h); *pDest = &p->data; uint nIndex = (h & m_nTableMask); CONNECT_TO_BUCKET_LIST(p, m_arBuckets[nIndex]); SET_ARRAY_BUCKET_HEAD(m_arBuckets, nIndex, p); CONNECT_TO_GLOBAL_DLLIST(p); if (++m_size > tableSize()) { resize(); } return true; }