protected function parseFunc(Func $func, array $params, array $stmts, $implicitReturnValue)
{
// Switch to new function context
$prevCtx = $this->ctx;
$this->ctx = new FuncContext();
$start = $func->cfg;
$func->params = $this->parseParameterList($func, $params);
foreach ($func->params as $param) {
$this->writeVariableName($param->name->value, $param->result, $start);
}
$end = $this->parseNodes($stmts, $start);
if (!$end->dead) {
$end->children[] = new Return_(new Literal($implicitReturnValue));
}
if ($this->ctx->unresolvedGotos) {
$this->throwUndefinedLabelError();
}
$this->ctx->complete = true;
foreach ($this->ctx->incompletePhis as $block) {
/** @var Op\Phi $phi */
foreach ($this->ctx->incompletePhis[$block] as $name => $phi) {
// add phi operands
foreach ($block->parents as $parent) {
if ($parent->dead) {
continue;
}
$var = $this->readVariableName($name, $parent);
$phi->addOperand($var);
}
$block->phi[] = $phi;
}
}
$this->ctx = $prevCtx;
}