Separates variables before being updated
public separate ( zephir\CompilationContext $compilationContext ) | ||
$compilationContext | zephir\CompilationContext |
/** * Compiles x-- * * @param string $variable * @param ZephirVariable $symbolVariable * @param CompilationContext $compilationContext * @param array $statement */ public function assign($variable, ZephirVariable $symbolVariable, CompilationContext $compilationContext, $statement) { if (!$symbolVariable->isInitialized()) { throw new CompilerException("Cannot mutate variable '" . $variable . "' because it is not initialized", $statement); } if ($symbolVariable->isReadOnly()) { throw new CompilerException("Cannot mutate variable '" . $variable . "' because it is read only", $statement); } $codePrinter = $compilationContext->codePrinter; switch ($symbolVariable->getType()) { case 'int': case 'uint': case 'long': case 'ulong': case 'double': case 'char': case 'uchar': $codePrinter->output($variable . '--;'); break; case 'variable': /** * Variable is probably not initialized here */ if ($symbolVariable->hasAnyDynamicType('unknown')) { throw new CompilerException("Attempt to increment uninitialized variable", $statement); } /** * Decrement non-numeric variables could be expensive */ if (!$symbolVariable->hasAnyDynamicType(array('undefined', 'int', 'long', 'double', 'uint'))) { $compilationContext->logger->warning('Possible attempt to decrement non-numeric dynamic variable', 'non-valid-decrement', $statement); } $compilationContext->headersManager->add('kernel/operators'); if ($symbolVariable->isLocalOnly()) { $codePrinter->output('zephir_decrement(&' . $variable . ');'); } else { $symbolVariable->separate($compilationContext); $codePrinter->output('zephir_decrement(' . $variable . ');'); } break; default: throw new CompilerException("Cannot decrement variable: " . $symbolVariable->getType(), $statement); } }
/** * Compiles x++ * * @param string $variable * @param ZephirVariable $symbolVariable * @param CompilationContext $compilationContext * @param array $statement * * @throws CompilerException */ public function assign($variable, ZephirVariable $symbolVariable, CompilationContext $compilationContext, $statement) { if (!$symbolVariable->isInitialized()) { throw new CompilerException("Cannot mutate variable '" . $variable . "' because it is not initialized", $statement); } if ($symbolVariable->isReadOnly()) { /** * @TODO implement increment of objects members */ throw new CompilerException("Cannot mutate variable '" . $variable . "' because it is read only", $statement); } $codePrinter =& $compilationContext->codePrinter; switch ($symbolVariable->getType()) { case 'int': case 'uint': case 'long': case 'ulong': case 'double': case 'char': case 'uchar': $codePrinter->output($variable . '++;'); break; case 'variable': /** * Update non-numeric dynamic variables could be expensive */ if (!$symbolVariable->hasAnyDynamicType(array('undefined', 'long', 'double'))) { $compilationContext->logger->warning('Possible attempt to increment non-numeric dynamic variable', 'non-valid-increment', $statement); } $compilationContext->headersManager->add('kernel/operators'); if (!$symbolVariable->isLocalOnly()) { $symbolVariable->separate($compilationContext); } $symbol = $compilationContext->backend->getVariableCode($symbolVariable); $codePrinter->output('zephir_increment(' . $symbol . ');'); break; default: throw new CompilerException("Cannot increment: " . $symbolVariable->getType(), $statement); } }