Generator& Generator::operator=(const Generator& other) { auto const fp = other.actRec(); const size_t numSlots = fp->func()->numSlotsInFrame(); const size_t frameSz = Resumable::getFrameSize(numSlots); const size_t genSz = genSize(sizeof(Generator), frameSz); resumable()->initialize<true>(fp, other.resumable()->resumeAddr(), other.resumable()->resumeOffset(), frameSz, genSz); copyVars(fp); setState(other.getState()); m_index = other.m_index; cellSet(other.m_key, m_key); cellSet(other.m_value, m_value); return *this; }
ObjectData* AsyncGenerator::Create(const ActRec* fp, size_t numSlots, jit::TCA resumeAddr, Offset resumeOffset) { assert(fp); assert(!fp->resumed()); assert(fp->func()->isAsyncGenerator()); const size_t frameSz = Resumable::getFrameSize(numSlots); const size_t genSz = genSize(sizeof(AsyncGenerator), frameSz); auto const obj = BaseGenerator::Alloc<AsyncGenerator>(s_class, genSz); auto const genData = new (Native::data<AsyncGenerator>(obj)) AsyncGenerator(); genData->resumable()->initialize<false>(fp, resumeAddr, resumeOffset, frameSz, genSz); genData->setState(State::Created); return obj; }