public static function replaceVar(Operand $from, Operand $to) { foreach ($from->usages as $usage) { foreach ($usage->getVariableNames() as $varName) { $vars = $usage->{$varName}; $newVars = []; if (!is_array($vars)) { $vars = [$vars]; } foreach ($vars as $key => $value) { if ($value === $from) { $newVars[$key] = $to; $to->addUsage($usage); } else { $newVars[$key] = $value; } } if (!is_array($usage->{$varName})) { $usage->{$varName} = array_shift($newVars); } else { $usage->{$varName} = $newVars; } } } }
public function removeOperand(Operand $op) { foreach ($this->vars as $key => $value) { if ($op === $value) { $op->removeUsage($this); unset($this->vars[$key]); $this->vars = array_values($this->vars); } } }
private function replaceOpVariable(Operand $from, Operand $to, Op $op) { foreach ($op->getVariableNames() as $name) { if (is_null($op->{$name})) { continue; } if (is_array($op->{$name})) { // SIGH, PHP won't let me do this directly (parses as $op->($name[$key])) $result = $op->{$name}; $new = []; foreach ($result as $key => $value) { if ($value === $from) { $new[$key] = $to; if ($op->isWriteVariable($name)) { $to->addWriteOp($op); } else { $to->addUsage($op); } } else { $new[$key] = $value; } } $op->{$name} = $new; } elseif ($op->{$name} === $from) { $op->{$name} = $to; if ($op->isWriteVariable($name)) { $to->addWriteOp($op); } else { $to->addUsage($op); } } } }