Zephir\Call::getReadOnlyResolvedParams PHP Method

getReadOnlyResolvedParams() public method

Resolve parameters using zvals in the stack and without allocating memory for constants
public getReadOnlyResolvedParams ( array $parameters, zephir\CompilationContext $compilationContext, array $expression ) : array
$parameters array
$compilationContext zephir\CompilationContext
$expression array
return array
    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;
    }

Usage Example

Example #1
0
 /**
  * @param array $expression
  * @param Call $call
  * @param CompilationContext $context
  * @return bool|CompiledExpression|mixed
  * @throws CompilerException
  */
 public function optimize(array $expression, Call $call, CompilationContext $context)
 {
     if (!isset($expression['parameters'])) {
         return false;
     }
     $numberParameters = count($expression['parameters']);
     if ($numberParameters != 1 && $numberParameters != 2) {
         throw new CompilerException("'get_class' only accepts one or two parameters", $expression);
     }
     /**
      * Process the expected symbol to be returned
      */
     $call->processExpectedReturn($context);
     $symbolVariable = $call->getSymbolVariable(true, $context);
     if ($symbolVariable->isNotVariableAndString()) {
         throw new CompilerException("Returned values by functions can only be assigned to variant variables", $expression);
     }
     $context->headersManager->add('kernel/object');
     $symbolVariable->setDynamicTypes('string');
     $resolvedParams = $call->getReadOnlyResolvedParams($expression['parameters'], $context, $expression);
     if ($call->mustInitSymbolVariable()) {
         $symbolVariable->initVariant($context);
     }
     $symbol = $context->backend->getVariableCode($symbolVariable);
     $context->codePrinter->output('zephir_get_class(' . $symbol . ', ' . $resolvedParams[0] . ', 0 TSRMLS_CC);');
     return new CompiledExpression('variable', $symbolVariable->getRealName(), $expression);
 }
All Usage Examples Of Zephir\Call::getReadOnlyResolvedParams