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;
}