protected function isReadOnly($funcName, array $expression)
{
if ($this->isBuiltInFunction($funcName)) {
return false;
}
/**
* These functions are supposed to be read-only but they change parameters ref-count
*/
switch ($funcName) {
case 'min':
case 'max':
case 'array_fill':
case 'array_pad':
case 'call_user_func':
case 'call_user_func_array':
return false;
}
$reflector = $this->getReflector($funcName);
if ($reflector) {
if (isset($expression['parameters'])) {
/**
* Check if the number of parameters
*/
$numberParameters = count($expression['parameters']);
if ($numberParameters < $reflector->getNumberOfRequiredParameters()) {
throw new CompilerException("The number of parameters passed is lesser than the number of required parameters by '" . $funcName . "'", $expression);
}
} else {
$numberParameters = 0;
if ($reflector->getNumberOfRequiredParameters() > 0) {
throw new CompilerException("The number of parameters passed is lesser than the number of required parameters by '" . $funcName . "'", $expression);
}
}
if ($reflector->getNumberOfParameters() > 0) {
foreach ($reflector->getParameters() as $parameter) {
if ($parameter->isPassedByReference()) {
return false;
}
}
}
return true;
}
return false;
}