ArrayData* EmptyArray::SetStr(ArrayData*, StringData* k, Cell v) { tvIncRefGen(v); // TODO(#3888164): we should make it so we don't need KindOfUninit checks if (v.m_type == KindOfUninit) v.m_type = KindOfNull; return EmptyArray::MakeMixed(k, v).arr; }
Cell APCLocalArray::NvGetKey(const ArrayData* ad, ssize_t pos) { auto a = asApcArray(ad); Variant k = a->m_arr->getKey(pos); auto const tv = k.asTypedValue(); tvIncRefGen(tv); return *tv; }
ArrayData* EmptyArray::SetInt(ArrayData*, int64_t k, Cell v) { // TODO(#3888164): we should make it so we don't need KindOfUninit checks if (v.m_type == KindOfUninit) v.m_type = KindOfNull; tvIncRefGen(v); auto const lval = k == 0 ? EmptyArray::MakePacked(v) : EmptyArray::MakeMixed(k, v); return lval.arr; }
Cell incDecBodySlow(IncDecOp op, Cell* fr) { assert(cellIsPlausible(*fr)); assert(fr->m_type != KindOfUninit); auto dup = [&]() { tvIncRefGen(fr); return *fr; }; switch (op) { case IncDecOp::PreInc: cellInc(*fr); return dup(); case IncDecOp::PostInc: { auto const tmp = dup(); cellInc(*fr); return tmp; } case IncDecOp::PreDec: cellDec(*fr); return dup(); case IncDecOp::PostDec: { auto const tmp = dup(); cellDec(*fr); return tmp; } default: break; } switch (op) { case IncDecOp::PreIncO: cellIncO(*fr); return dup(); case IncDecOp::PostIncO: { auto const tmp = dup(); cellIncO(*fr); return tmp; } case IncDecOp::PreDecO: cellDecO(*fr); return dup(); case IncDecOp::PostDecO: { auto const tmp = dup(); cellDecO(*fr); return tmp; } default: break; } not_reached(); }
ArrayData* EmptyArray::Prepend(ArrayData*, Cell v) { tvIncRefGen(v); return EmptyArray::MakePacked(v).arr; }