void Variant::setEvalScalar() { assertx(cellIsPlausible(*this)); auto const do_array = [this]{ auto parr = m_data.parr; if (!parr->isStatic()) { auto ad = ArrayData::GetScalarArray(parr); assert(ad->isStatic()); m_data.parr = ad; decRefArr(parr); } }; switch (m_type) { case KindOfUninit: case KindOfNull: case KindOfBoolean: case KindOfInt64: case KindOfDouble: return; case KindOfString: m_type = KindOfPersistentString; case KindOfPersistentString: { auto pstr = m_data.pstr; if (!pstr->isStatic()) { StringData *sd = makeStaticString(pstr); decRefStr(pstr); m_data.pstr = sd; assert(m_data.pstr->isStatic()); } return; } case KindOfVec: m_type = KindOfPersistentVec; case KindOfPersistentVec: do_array(); return; case KindOfDict: m_type = KindOfPersistentDict; case KindOfPersistentDict: do_array(); return; case KindOfKeyset: m_type = KindOfPersistentKeyset; case KindOfPersistentKeyset: do_array(); return; case KindOfArray: m_type = KindOfPersistentArray; case KindOfPersistentArray: do_array(); return; case KindOfObject: case KindOfResource: case KindOfRef: case KindOfClass: break; } not_reached(); }
void intrusive_ptr_release(ArrayData* a) { decRefArr(a); }