Object APCObject::createObject() const { auto cls = m_cls.left(); assert(cls != nullptr); auto obj = Object::attach( m_fast_init ? ObjectData::newInstanceNoPropInit(const_cast<Class*>(cls)) : ObjectData::newInstance(const_cast<Class*>(cls)) ); auto const numProps = cls->numDeclProperties(); auto const objProp = obj->propVec(); auto const apcProp = persistentProps(); if (m_fast_init) { // re-entry is possible while we're executing toLocal() on each // property, so heap inspectors may see partially initid objects // not yet exposed to PHP. unsigned i = 0; try { for (; i < numProps; ++i) { new (objProp + i) Variant(apcProp[i]->toLocal()); } } catch (...) { for (; i < numProps; ++i) { new (objProp + i) Variant(); } throw; } } else { for (unsigned i = 0; i < numProps; ++i) { tvAsVariant(&objProp[i]) = apcProp[i]->toLocal(); } } if (UNLIKELY(numProps < m_propCount)) { auto dynProps = apcProp[numProps]; assert(dynProps->kind() == APCKind::StaticArray || dynProps->kind() == APCKind::UncountedArray || dynProps->kind() == APCKind::SharedArray); obj->setDynPropArray(dynProps->toLocal().asCArrRef()); } if (!m_no_wakeup) obj->invokeWakeup(); return obj; }
Object APCObject::createObject() const { auto cls = m_cls.left(); assert(cls != nullptr); auto obj = Object::attach( m_fast_init ? ObjectData::newInstanceNoPropInit(const_cast<Class*>(cls)) : ObjectData::newInstance(const_cast<Class*>(cls)) ); auto const numProps = cls->numDeclProperties(); auto const objProp = obj->propVec(); auto const apcProp = persistentProps(); if (m_fast_init) { unsigned i = 0; try { while (i < numProps) { new (objProp + i) Variant(apcProp[i]->toLocal()); ++i; } } catch (...) { while (i < numProps) { new (objProp + i) Variant(); ++i; } throw; } } else { for (unsigned i = 0; i < numProps; ++i) { tvAsVariant(&objProp[i]) = apcProp[i]->toLocal(); } } if (UNLIKELY(numProps < m_propCount)) { auto dynProps = apcProp[numProps]; assert(dynProps->kind() == APCKind::StaticArray || dynProps->kind() == APCKind::UncountedArray || dynProps->kind() == APCKind::SharedArray); obj->setDynPropArray(dynProps->toLocal().asCArrRef()); } if (!m_no_wakeup) obj->invokeWakeup(); return obj; }