public function getVariableForWrite($name, CompilationContext $compilationContext, array $statement = null)
{
/**
* Create superglobals just in time
*/
if ($this->isSuperGlobal($name)) {
if (!$this->hasVariable($name)) {
/**
* @TODO, injecting globals, initialize to null and check first?
*/
$superVar = new Variable('variable', $name, $compilationContext->currentBranch);
$superVar->setIsInitialized(true, $compilationContext, $statement);
$superVar->setDynamicTypes('array');
$superVar->increaseMutates();
$superVar->increaseUses();
$superVar->setUsed(true, $statement);
$this->addRawVariable($superVar);
return $superVar;
}
}
if (!$this->hasVariable($name)) {
throw new CompilerException("Cannot mutate variable '" . $name . "' because it wasn't defined", $statement);
}
$variable = $this->getVariable($name);
$variable->increaseUses();
$variable->increaseMutates();
/**
* Saves the last place where the variable was mutated
* We discard mutations inside loops because iterations could use the value
* and Zephir only provides top-down compilation
*/
if (!$compilationContext->insideCycle) {
$variable->setUsed(false, $statement);
} else {
$variable->setUsed(true, $statement);
}
return $variable;
}