Cell incDecBodySlow(IncDecOp op, Cell* fr) { assert(cellIsPlausible(*fr)); assert(fr->m_type != KindOfUninit); auto dup = [&]() { tvRefcountedIncRef(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(); }
void incDecBodySlow(IncDecOp op, Cell* fr, TypedValue* to) { assert(cellIsPlausible(*fr)); assert(fr->m_type != KindOfUninit); auto dup = [&]() { cellDup(*fr, *to); }; switch (op) { case IncDecOp::PreInc: cellInc(*fr); dup(); return; case IncDecOp::PostInc: dup(); cellInc(*fr); return; case IncDecOp::PreDec: cellDec(*fr); dup(); return; case IncDecOp::PostDec: dup(); cellDec(*fr); return; default: break; } switch (op) { case IncDecOp::PreIncO: cellIncO(*fr); dup(); return; case IncDecOp::PostIncO: dup(); cellIncO(*fr); return; case IncDecOp::PreDecO: cellDecO(*fr); dup(); return; case IncDecOp::PostDecO: dup(); cellDecO(*fr); return; default: break; } not_reached(); }