// static size_t MemoryProfile::getSizeOfTV(const TypedValue* tv) { if (!RuntimeOption::HHProfServerEnabled) return 0; switch (tv->m_type) { case KindOfString: return getSizeOfPtr(tv->m_data.pstr); case KindOfArray: return getSizeOfArray(tv->m_data.parr); case KindOfObject: return getSizeOfObject(tv->m_data.pobj); case KindOfRef: return getSizeOfPtr(tv->m_data.pref); default: return 0; } }
// static size_t MemoryProfile::getSizeOfTV(TypedValue *tv) { if (!memory_profiling) return 0; switch (tv->m_type) { case KindOfString: return getSizeOfPtr(tv->m_data.pstr); case KindOfArray: return getSizeOfArray(tv->m_data.parr); case KindOfObject: return getSizeOfObject(tv->m_data.pobj); case KindOfRef: return getSizeOfPtr(tv->m_data.pref); default: return 0; } }
// static size_t MemoryProfile::getSizeOfObject(ObjectData *obj) { auto ret = getSizeOfPtr(obj); if (ret == 0) { return 0; } if (UNLIKELY(obj->getAttribute(ObjectData::HasDynPropArr))) { auto& props = obj->dynPropArray(); ret += getSizeOfArray(props.get()); } return ret; }
// static size_t MemoryProfile::getSizeOfArray(ArrayData *arr) { size_t size = getSizeOfPtr(arr); if (size == 0) { return 0; } if (arr->isHphpArray()) { // calculate extra size HphpArray *ha = static_cast<HphpArray *>(arr); size_t hashSize = ha->hashSize(); size_t maxElms = HphpArray::computeMaxElms(ha->m_tableMask); if (maxElms > HphpArray::SmallSize) { size += maxElms * sizeof(HphpArray::Elm) + hashSize * sizeof(int32_t); } } return size; }
// static size_t MemoryProfile::getSizeOfArray(ArrayData *arr) { size_t size = getSizeOfPtr(arr); if (arr->isHphpArray()) { // calculate extra size HphpArray *ha = static_cast<HphpArray *>(arr); size_t tableSize = HphpArray::computeTableSize(ha->m_tableMask); size_t maxElms = HphpArray::computeMaxElms(ha->m_tableMask); if (maxElms > HphpArray::SmallSize) { size_t hashSize = tableSize * sizeof(HphpArray::ElmInd); size_t dataSize = maxElms * sizeof(HphpArray::Elm); size += (hashSize <= sizeof(ha->m_inline_hash)) ? dataSize : dataSize + hashSize; } } return size; }
// static size_t MemoryProfile::getSizeOfArray(ArrayData* arr) { // Some non-flat array types have extra memory (e.g. the local TV // cache of an apc local array), but we haven't implemented this. return getSizeOfPtr(arr); }
// static size_t MemoryProfile::getSizeOfObject(ObjectData *obj) { ArrayData* props = obj->o_properties.get(); return getSizeOfPtr(obj) + (props ? getSizeOfArray(props) : 0); }