public function getReadOnlyResolvedParams($parameters, CompilationContext $compilationContext, array $expression)
{
$codePrinter = $compilationContext->codePrinter;
$exprParams = $this->getResolvedParamsAsExpr($parameters, $compilationContext, $expression, true);
$params = array();
$types = array();
$dynamicTypes = array();
foreach ($exprParams as $compiledExpression) {
$expression = $compiledExpression->getOriginal();
switch ($compiledExpression->getType()) {
case 'null':
$params[] = $compilationContext->backend->resolveValue('null', $compilationContext);
$types[] = 'null';
$dynamicTypes[] = 'null';
break;
case 'int':
case 'uint':
case 'long':
$parameterVariable = $compilationContext->backend->getScalarTempVariable('variable', $compilationContext, true);
$compilationContext->backend->assignLong($parameterVariable, $compiledExpression->getCode(), $compilationContext);
$this->_temporalVariables[] = $parameterVariable;
$params[] = '&' . $parameterVariable->getName();
$types[] = $parameterVariable->getType();
$dynamicTypes[] = $parameterVariable->getType();
break;
case 'char':
case 'uchar':
$parameterVariable = $compilationContext->backend->getScalarTempVariable('variable', $compilationContext, true);
$compilationContext->backend->assignLong($parameterVariable, '\'' . $compiledExpression->getCode() . '\'', $compilationContext);
$this->_temporalVariables[] = $parameterVariable;
$params[] = '&' . $parameterVariable->getName();
$types[] = $parameterVariable->getType();
$dynamicTypes[] = $parameterVariable->getType();
break;
case 'double':
$parameterVariable = $compilationContext->backend->getScalarTempVariable('variable', $compilationContext, true);
$codePrinter->output('ZVAL_DOUBLE(&' . $parameterVariable->getName() . ', ' . $compiledExpression->getCode() . ');');
$this->_temporalVariables[] = $parameterVariable;
$params[] = '&' . $parameterVariable->getName();
$types[] = $parameterVariable->getType();
$dynamicTypes[] = $parameterVariable->getType();
break;
case 'bool':
if ($compiledExpression->getCode() == 'true') {
$params[] = $compilationContext->backend->resolveValue('true', $compilationContext);
} else {
if ($compiledExpression->getCode() == 'false') {
$params[] = $compilationContext->backend->resolveValue('false', $compilationContext);
} else {
throw new Exception('?');
}
}
$types[] = 'bool';
$dynamicTypes[] = 'bool';
break;
case 'ulong':
case 'string':
case 'istring':
if ($compilationContext->backend->getName() == 'ZendEngine2') {
$parameterVariable = $compilationContext->symbolTable->getTempLocalVariableForWrite('variable', $compilationContext, $expression);
} else {
$parameterVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext, $expression);
}
$compilationContext->backend->assignString($parameterVariable, Utils::addSlashes($compiledExpression->getCode()), $compilationContext, true, false);
$this->_temporalVariables[] = $parameterVariable;
$params[] = '&' . $parameterVariable->getName();
$types[] = $parameterVariable->getType();
$dynamicTypes[] = $parameterVariable->getType();
break;
case 'array':
$parameterVariable = $compilationContext->symbolTable->getVariableForRead($compiledExpression->getCode(), $compilationContext, $expression);
$params[] = $compilationContext->backend->getVariableCode($parameterVariable);
$types[] = $parameterVariable->getType();
$dynamicTypes[] = $parameterVariable->getType();
break;
case 'variable':
$parameterVariable = $compilationContext->symbolTable->getVariableForRead($compiledExpression->getCode(), $compilationContext, $expression);
switch ($parameterVariable->getType()) {
case 'int':
case 'uint':
case 'long':
case 'ulong':
$parameterTempVariable = $compilationContext->backend->getScalarTempVariable('variable', $compilationContext, true);
$codePrinter->output('ZVAL_LONG(&' . $parameterTempVariable->getName() . ', ' . $compiledExpression->getCode() . ');');
$params[] = '&' . $parameterTempVariable->getName();
$types[] = $parameterTempVariable->getType();
$dynamicTypes[] = $parameterTempVariable->getType();
$this->_temporalVariables[] = $parameterTempVariable;
break;
case 'char':
case 'uchar':
$parameterTempVariable = $compilationContext->backend->getScalarTempVariable('variable', $compilationContext, true);
$codePrinter->output('ZVAL_LONG(&' . $parameterTempVariable->getName() . ', ' . $compiledExpression->getCode() . ');');
$params[] = '&' . $parameterTempVariable->getName();
$types[] = $parameterTempVariable->getType();
$dynamicTypes[] = $parameterTempVariable->getType();
$this->_temporalVariables[] = $parameterTempVariable;
break;
case 'double':
$parameterTempVariable = $compilationContext->backend->getScalarTempVariable('variable', $compilationContext, true);
$codePrinter->output('ZVAL_DOUBLE(&' . $parameterTempVariable->getName() . ', ' . $compiledExpression->getCode() . ');');
$params[] = '&' . $parameterTempVariable->getName();
$types[] = $parameterTempVariable->getType();
$dynamicTypes[] = $parameterTempVariable->getType();
$this->_temporalVariables[] = $parameterTempVariable;
break;
case 'bool':
$parameterTempVariable = $compilationContext->backend->getScalarTempVariable('variable', $compilationContext, true);
$compilationContext->backend->assignBool($parameterTempVariable, '(' . $parameterVariable->getName() . ' ? 1 : 0)', $compilationContext);
$params[] = $compilationContext->backend->getVariableCode($parameterTempVariable);
$dynamicTypes[] = $parameterTempVariable->getType();
$types[] = $parameterTempVariable->getType();
break;
case 'string':
case 'variable':
case 'array':
$params[] = $compilationContext->backend->getVariableCode($parameterVariable);
$dynamicTypes[] = $parameterVariable->getType();
$types[] = $parameterVariable->getType();
break;
default:
throw new CompilerException("Cannot use variable type: " . $parameterVariable->getType() . " as parameter", $expression);
}
break;
default:
throw new CompilerException("Cannot use value type: " . $compiledExpression->getType() . " as parameter", $expression);
}
}
$this->_resolvedTypes = $types;
$this->_resolvedDynamicTypes = $dynamicTypes;
return $params;
}