Zephir\Operators\Arithmetical\ArithmeticalBaseOperator::optimizeConstantFolding PHP Method

optimizeConstantFolding() public method

This tries to perform arithmetical operations Probably gcc/clang will optimize them without this optimization
See also: http://en.wikipedia.org/wiki/Constant_folding
public optimizeConstantFolding ( array $expression, Zephir\CompilationContext $compilationContext ) : boolean | Zephir\CompiledExpression
$expression array
$compilationContext Zephir\CompilationContext
return boolean | Zephir\CompiledExpression
    public function optimizeConstantFolding(array $expression, CompilationContext $compilationContext)
    {
        if ($expression['left']['type'] != 'int' && $expression['left']['type'] != 'double') {
            return false;
        }
        if ($compilationContext->config->get('constant-folding', 'optimizations')) {
            if ($expression['left']['type'] == 'int' && $expression['right']['type'] == 'int') {
                switch ($this->_operator) {
                    case '+':
                        return new CompiledExpression('int', $expression['left']['value'] + $expression['right']['value'], $expression);
                    case '-':
                        return new CompiledExpression('int', $expression['left']['value'] - $expression['right']['value'], $expression);
                    case '*':
                        return new CompiledExpression('int', $expression['left']['value'] * $expression['right']['value'], $expression);
                }
            }
            if ($expression['left']['type'] == 'double' && $expression['right']['type'] == 'double' || $expression['left']['type'] == 'double' && $expression['right']['type'] == 'int' || $expression['left']['type'] == 'int' && $expression['right']['type'] == 'double') {
                switch ($this->_operator) {
                    case '+':
                        return new CompiledExpression('double', $expression['left']['value'] + $expression['right']['value'], $expression);
                    case '-':
                        return new CompiledExpression('double', $expression['left']['value'] - $expression['right']['value'], $expression);
                    case '*':
                        return new CompiledExpression('double', $expression['left']['value'] * $expression['right']['value'], $expression);
                }
            }
        }
        return false;
    }