private function compileJumptableSwitch(Stmt\Switch_ $node)
{
$cond = $this->readVariable($this->parseExprNode($node->cond));
$cases = [];
$targets = [];
$endBlock = new Block();
$defaultBlock = $endBlock;
/** @var null|Block $block */
$block = null;
foreach ($node->cases as $case) {
$caseBlock = new Block($this->block);
if ($block && !$block->dead) {
// wire up!
$block->children[] = new Jump($caseBlock);
$caseBlock->addParent($block);
}
if ($case->cond) {
$targets[] = $caseBlock;
$cases[] = $this->parseExprNode($case->cond);
} else {
$defaultBlock = $caseBlock;
}
$block = $this->parseNodes($case->stmts, $caseBlock);
}
$this->block->children[] = new Op\Stmt\Switch_($cond, $cases, $targets, $defaultBlock, $this->mapAttributes($node));
if ($block && !$block->dead) {
// wire end of block to endblock
$block->children[] = new Jump($endBlock);
$endBlock->addParent($block);
}
$this->block = $endBlock;
}