Example #1
0
 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;
             }
         }
     }
 }
Example #2
0
 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);
         }
     }
 }
Example #3
0
 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);
             }
         }
     }
 }