/** * @param array $expression * @param Call $call * @param CompilationContext $context * @return bool|CompiledExpression|mixed */ public function optimize(array $expression, Call $call, CompilationContext $context) { if (!isset($expression['parameters'])) { return false; } $context->headersManager->add('kernel/variables'); $resolvedParams = $call->getResolvedParamsAsExpr($expression['parameters'], $context, $expression); foreach ($resolvedParams as $resolvedParam) { $variable = $context->symbolTable->getVariable($resolvedParam->getCode()); if (!$variable || !$variable->isVariable()) { /** * Complex expressions require a temporary variable */ switch ($resolvedParam->getType()) { case 'array': $type = 'array'; break; default: $type = 'variable'; break; } $variable = $context->symbolTable->addTemp($type, $context); $variable->initVariant($context); $statement = new LetStatement(array('type' => 'let', 'assignments' => array(array('assign-type' => $type, 'variable' => $variable->getName(), 'operator' => 'assign', 'expr' => array('type' => $resolvedParam->getType(), 'value' => $resolvedParam->getCode(), 'file' => $expression['file'], 'line' => $expression['line'], 'char' => $expression['char']), 'file' => $expression['file'], 'line' => $expression['line'], 'char' => $expression['char'])))); $statement->compile($context); } else { /** * This mark the variable as used */ $variable = $context->symbolTable->getVariableForRead($resolvedParam->getCode(), $context, $expression); } $context->codePrinter->output('zephir_var_dump(&' . $variable->getName() . ' TSRMLS_CC);'); } return new CompiledExpression('null', 'null', $expression); }
/** * @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; } if (count($expression['parameters']) != 1) { throw new CompilerException("'uncamelize' only accepts one parameter"); } /** * 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/string'); $symbolVariable->setDynamicTypes('string'); $resolvedParams = $call->getReadOnlyResolvedParams($expression['parameters'], $context, $expression); if ($call->mustInitSymbolVariable()) { $symbolVariable->initVariant($context); } $context->codePrinter->output('zephir_uncamelize(' . $symbolVariable->getName() . ', ' . $resolvedParams[0] . ');'); return new CompiledExpression('variable', $symbolVariable->getRealName(), $expression); }
/** * @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; } if (count($expression['parameters']) != 3) { if (count($expression['parameters']) == 4) { return false; } throw new CompilerException("'str_replace' only accepts three parameter", $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/string'); $symbolVariable->setDynamicTypes('string'); $resolvedParams = $call->getReadOnlyResolvedParams($expression['parameters'], $context, $expression); if ($call->mustInitSymbolVariable()) { if ($symbolVariable->getName() == 'return_value') { $symbolVariable = $context->symbolTable->getTempVariableForWrite('variable', $context); } else { $symbolVariable->initVariant($context); } } $symbol = $context->backend->getVariableCodePointer($symbolVariable); $context->codePrinter->output('zephir_fast_str_replace(' . $symbol . ', ' . $resolvedParams[0] . ', ' . $resolvedParams[1] . ', ' . $resolvedParams[2] . ' TSRMLS_CC);'); return new CompiledExpression('variable', $symbolVariable->getRealName(), $expression); }
/** * @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'])) { $numberParameters = count($expression['parameters']); if ($numberParameters != 0) { return false; } } /** * 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); } if ($call->mustInitSymbolVariable()) { $symbolVariable->initVariant($context); } $context->headersManager->add('kernel/object'); $symbolVariable->setDynamicTypes('string'); $symbol = $context->backend->getVariableCode($symbolVariable); $context->codePrinter->output('zephir_get_called_class(' . $symbol . ' TSRMLS_CC);'); return new CompiledExpression('variable', $symbolVariable->getRealName(), $expression); }
/** * @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'])) { throw new CompilerException("'globals_set' requires two parameters", $expression); } if (count($expression['parameters']) != 2) { throw new CompilerException("'globals_set' only accepts two parameters", $expression); } if ($expression['parameters'][0]['parameter']['type'] != 'string') { throw new CompilerException("A string parameter is required for 'globals_set'", $expression); } $globalName = $expression['parameters'][0]['parameter']['value']; if (!$context->compiler->isExtensionGlobal($globalName)) { throw new CompilerException("Global '" . $globalName . "' cannot be written because it wasn't defined", $expression); } unset($expression['parameters'][0]); $resolvedParams = $call->getReadOnlyResolvedParams($expression['parameters'], $context, $expression); //$globalDefinition = $context->compiler->getExtensionGlobal($globalName); //if (strpos($globalName, '.') !== false) { // $parts = explode('.', $globalName); // return new CompiledExpression($globalDefinition['type'], 'ZEPHIR_GLOBAL(' . $parts[0] . ').' . $parts[1], $expression); //} //return new CompiledExpression($globalDefinition['type'], 'ZEPHIR_GLOBAL(' . $globalName . ')', $expression); return new CompiledExpression('null', null, $expression); }
/** * @param array $expression * @param Call $call * @param CompilationContext $context * @return CompiledExpression|mixed * @throws CompilerException */ public function optimize(array $expression, Call $call, CompilationContext $context) { if (isset($expression['parameters'])) { if (count($expression['parameters']) != 0) { throw new CompilerException("This function doesn't require parameters", $expression); } } /** * Process the expected symbol to be returned */ $call->processExpectedReturn($context); $symbolVariable = $call->getSymbolVariable(true, $context); if ($symbolVariable) { if (!$symbolVariable->isVariable()) { throw new CompilerException("Returned values by functions can only be assigned to variant variables", $expression); } } if ($call->mustInitSymbolVariable()) { $symbolVariable->initVariant($context); } $context->headersManager->add('kernel/memory'); $context->codePrinter->output('zephir_create_symbol_table(TSRMLS_C);'); $context->codePrinter->output(''); return new CompiledExpression('null', null, $expression); }
/** * @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; } if (count($expression['parameters']) != 1) { throw new CompilerException("phalcon_jsmin only accepts one parameter", $expression); } /** * Process the expected symbol to be returned */ $call->processExpectedReturn($context); $symbolVariable = $call->getSymbolVariable(); if ($symbolVariable->getType() != 'variable') { throw new CompilerException("Returned values by functions can only be assigned to variant variables", $expression); } if ($call->mustInitSymbolVariable()) { $symbolVariable->initVariant($context); } $context->headersManager->add('phalcon/assets/filters/jsminifier'); $symbolVariable->setDynamicTypes('string'); $resolvedParams = $call->getResolvedParams($expression['parameters'], $context, $expression); $context->codePrinter->output('phalcon_jsmin(' . $symbolVariable->getName() . ', ' . $resolvedParams[0] . ' TSRMLS_CC);'); return new CompiledExpression('variable', $symbolVariable->getRealName(), $expression); }
/** * * @param array $expression * @param Call $call * @param CompilationContext $context */ public function optimize(array $expression, Call $call, CompilationContext $context) { if (!isset($expression['parameters'])) { return false; } if (count($expression['parameters']) != 2) { return false; } /** * Process the expected symbol to be returned */ $call->processExpectedReturn($context); $symbolVariable = $call->getSymbolVariable(); if ($symbolVariable->getType() != 'variable') { throw new CompilerException("Returned values by functions can only be assigned to variant variables", $expression); } if ($call->mustInitSymbolVariable()) { $symbolVariable->initVariant($context); } $context->headersManager->add('kernel/array'); $symbolVariable->setDynamicTypes('array'); $resolvedParams = $call->getReadOnlyResolvedParams($expression['parameters'], $context, $expression); //$context->codePrinter->output('zephir_fast_array_merge(' . $symbolVariable->getName() . ', &(' . $resolvedParams[0] . '), &(' . $resolvedParams[1] . ') TSRMLS_CC);'); return new CompiledExpression('variable', $symbolVariable->getRealName(), $expression); }
/** * @param array $expression * @param Call $call * @param CompilationContext $context * @return bool|CompiledExpression|mixed */ public function optimize(array $expression, Call $call, CompilationContext $context) { if (!isset($expression['parameters'])) { return false; } /** * Process the expected symbol to be returned */ $call->processExpectedReturn($context); $symbolVariable = $call->getSymbolVariable(); if ($symbolVariable) { if (!$symbolVariable->isVariable()) { throw new CompilerException("Returned values by functions can only be assigned to variant variables", $expression); } } else { $symbolVariable = $context->symbolTable->addTemp('variable', $context); $symbolVariable->initVariant($context); } $context->headersManager->add('kernel/string'); $resolvedParams = $call->getReadOnlyResolvedParams($expression['parameters'], $context, $expression); /** * Process encode options */ if (count($resolvedParams) >= 2) { $context->headersManager->add('kernel/operators'); $options = 'zephir_get_intval(' . $resolvedParams[1] . ') '; } else { $options = '0 '; } if ($call->mustInitSymbolVariable()) { $symbolVariable->initVariant($context); } $context->codePrinter->output('zephir_json_decode(' . $symbolVariable->getName() . ', &(' . $symbolVariable->getName() . '), ' . $resolvedParams[0] . ', ' . $options . ' TSRMLS_CC);'); return new CompiledExpression('variable', $symbolVariable->getRealName(), $expression); }
/** * @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_ns' only accepts one or two parameters", $expression); } /** * Process the expected symbol to be returned */ $call->processExpectedReturn($context); $symbolVariable = $call->getSymbolVariable(); if ($symbolVariable->isNotVariableAndString()) { throw new CompilerException("Returned values by functions can only be assigned to variant variables", $expression); } if ($call->mustInitSymbolVariable()) { $symbolVariable->initVariant($context); } $context->headersManager->add('kernel/object'); $symbolVariable->setDynamicTypes('string'); $resolvedParams = $call->getReadOnlyResolvedParams($expression['parameters'], $context, $expression); if (!isset($resolvedParams[1])) { $context->codePrinter->output('zephir_get_class_ns(' . $symbolVariable->getName() . ', ' . $resolvedParams[0] . ', 0 TSRMLS_CC);'); } else { $context->codePrinter->output('zephir_get_class_ns(' . $symbolVariable->getName() . ', ' . $resolvedParams[0] . ', ' . $resolvedParams[1] . ' TSRMLS_CC);'); } return new CompiledExpression('variable', $symbolVariable->getRealName(), $expression); }
/** * @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; } if (count($expression['parameters']) != 2) { return false; } /** * Process the expected symbol to be returned */ $call->processExpectedReturn($context); $symbolVariable = $call->getSymbolVariable(); if ($symbolVariable->isNotVariableAndString()) { throw new CompilerException("Returned values by functions can only be assigned to variant variables", $expression); } if ($expression['parameters'][0]['parameter']['type'] == 'string') { $str = Utils::addSlashes($expression['parameters'][0]['parameter']['value']); unset($expression['parameters'][0]); } if ($call->mustInitSymbolVariable()) { $symbolVariable->initVariant($context); } $resolvedParams = $call->getReadOnlyResolvedParams($expression['parameters'], $context, $expression); $context->headersManager->add('kernel/string'); $symbolVariable->setDynamicTypes('string'); if (isset($str)) { $context->codePrinter->output('zephir_fast_join_str(' . $symbolVariable->getName() . ', SL("' . $str . '"), ' . $resolvedParams[0] . ' TSRMLS_CC);'); return new CompiledExpression('variable', $symbolVariable->getRealName(), $expression); } $context->codePrinter->output('zephir_fast_join(' . $symbolVariable->getName() . ', ' . $resolvedParams[0] . ', ' . $resolvedParams[1] . ' TSRMLS_CC);'); return new CompiledExpression('variable', $symbolVariable->getRealName(), $expression); }
/** * @param array $expression * @param Call $call * @param CompilationContext $context * @return bool|CompiledExpression * @throws CompilerException */ public function optimize(array $expression, Call $call, CompilationContext $context) { if (!isset($expression['parameters'])) { return false; } if (count($expression['parameters']) != 3) { throw new CompilerException("parse_annotations only accepts three parameter", $expression); } /** * Process the expected symbol to be returned */ $call->processExpectedReturn($context); $symbolVariable = $call->getSymbolVariable(); if ($symbolVariable->getType() != 'variable') { throw new CompilerException("Returned values by functions can only be assigned to variant variables", $expression); } if ($call->mustInitSymbolVariable()) { $symbolVariable->initVariant($context); } $context->headersManager->add('owl/annotations/scanner', HeadersManager::POSITION_LAST); $context->headersManager->add('owl/annotations/annot', HeadersManager::POSITION_LAST); $symbolVariable->setDynamicTypes('array'); $resolvedParams = $call->getReadOnlyResolvedParams($expression['parameters'], $context, $expression); $context->codePrinter->output('phannot_parse_annotations(' . $symbolVariable->getName() . ', ' . $resolvedParams[0] . ', ' . $resolvedParams[1] . ', ' . $resolvedParams[2] . ' TSRMLS_CC);'); return new CompiledExpression('variable', $symbolVariable->getRealName(), $expression); }
/** * @param array $expression * @param Call $call * @param CompilationContext $context * @return bool|CompiledExpression * @throws CompilerException */ public function optimize(array $expression, Call $call, CompilationContext $context) { if (!isset($expression['parameters'])) { return false; } if (count($expression['parameters']) != 1) { throw new CompilerException("phalcon_get_uri only accepts three parameter", $expression); } /** * Process the expected symbol to be returned */ $call->processExpectedReturn($context); $symbolVariable = $call->getSymbolVariable(); if ($symbolVariable->getType() != 'variable') { throw new CompilerException("Returned values by functions can only be assigned to variant variables", $expression); } if ($call->mustInitSymbolVariable()) { $symbolVariable->initVariant($context); } $context->headersManager->add('phalcon/mvc/url/utils', HeadersManager::POSITION_LAST); $resolvedParams = $call->getResolvedParams($expression['parameters'], $context, $expression); $symbol = $context->backend->getVariableCode($symbolVariable); $context->codePrinter->output('phalcon_get_uri(' . $symbol . ', ' . $resolvedParams[0] . ');'); return new CompiledExpression('variable', $symbolVariable->getRealName(), $expression); }
/** * @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; } $charlist = 'NULL '; if (count($expression['parameters']) == 2) { if ($expression['parameters'][1]['parameter']['type'] == 'null') { unset($expression['parameters'][1]); } } /** * Process the expected symbol to be returned */ $call->processExpectedReturn($context); $symbolVariable = $call->getSymbolVariable(); if ($symbolVariable->isNotVariableAndString()) { throw new CompilerException("Returned values by functions can only be assigned to variant variables", $expression); } if ($call->mustInitSymbolVariable()) { $symbolVariable->initVariant($context); } $context->headersManager->add('kernel/string'); $symbolVariable->setDynamicTypes('string'); $resolvedParams = $call->getReadOnlyResolvedParams($expression['parameters'], $context, $expression); if (isset($resolvedParams[1])) { $charlist = $resolvedParams[1]; } $context->codePrinter->output('zephir_fast_trim(' . $symbolVariable->getName() . ', ' . $resolvedParams[0] . ', ' . $charlist . ', ' . static::$TRIM_WHERE . ' TSRMLS_CC);'); return new CompiledExpression('variable', $symbolVariable->getRealName(), $expression); }
/** * @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; } if (count($expression['parameters']) != 2) { return false; } $context->headersManager->add('kernel/file'); /** * Process the expected symbol to be returned */ $call->processExpectedReturn($context); $symbolVariable = $call->getSymbolVariable(); if ($symbolVariable) { if ($symbolVariable->isNotVariableAndString()) { throw new CompilerException("Returned values by functions can only be assigned to variant variables", $expression); } } $resolvedParams = $call->getReadOnlyResolvedParams($expression['parameters'], $context, $expression); if ($symbolVariable) { if ($call->mustInitSymbolVariable()) { $symbolVariable->initVariant($context); } $context->codePrinter->output('zephir_file_put_contents(' . $symbolVariable->getName() . ', ' . $resolvedParams[0] . ', ' . $resolvedParams[1] . ' TSRMLS_CC);'); return new CompiledExpression('variable', $symbolVariable->getRealName(), $expression); } else { $context->codePrinter->output('zephir_file_put_contents(NULL, ' . $resolvedParams[0] . ', ' . $resolvedParams[1] . ' TSRMLS_CC);'); } return new CompiledExpression('null', 'null', $expression); }
/** * * @param array $expression * @param Call $call * @param CompilationContext $context */ public function optimize(array $expression, Call $call, CompilationContext $context) { if (!isset($expression['parameters'])) { return false; } if (count($expression['parameters']) != 2) { throw new CompilerException("'phvolt_parse_view' only accepts two parameters", $expression); } /** * Process the expected symbol to be returned */ $call->processExpectedReturn($context); $symbolVariable = $call->getSymbolVariable(); if ($symbolVariable->getType() != 'variable') { throw new CompilerException("Returned values by functions can only be assigned to variant variables", $expression); } if ($call->mustInitSymbolVariable()) { $symbolVariable->initVariant($context); } $symbolVariable->setDynamicTypes('array'); $resolvedParams = $call->getReadOnlyResolvedParams($expression['parameters'], $context, $expression); $context->headersManager->add('phalcon/mvc/view/engine/volt/scanner', HeadersManager::POSITION_LAST); $context->headersManager->add('phalcon/mvc/view/engine/volt/volt', HeadersManager::POSITION_LAST); $context->codePrinter->output('if (phvolt_parse_view(' . $symbolVariable->getName() . ', ' . $resolvedParams[0] . ', ' . $resolvedParams[1] . ' TSRMLS_CC) == FAILURE) {'); $context->codePrinter->output("\t" . 'RETURN_MM();'); $context->codePrinter->output('}'); return new CompiledExpression('variable', $symbolVariable->getRealName(), $expression); }
/** * @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; } if (count($expression['parameters']) < 1 || count($expression['parameters']) > 2) { throw new CompilerException("'camelize' only accepts one or two parameters"); } $delimiter = 'NULL '; if (count($expression['parameters']) == 2) { if ($expression['parameters'][1]['parameter']['type'] == 'null') { unset($expression['parameters'][1]); } } /** * 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); } if ($call->mustInitSymbolVariable()) { $symbolVariable->initVariant($context); } $context->headersManager->add('kernel/string'); $symbolVariable->setDynamicTypes('string'); $resolvedParams = $call->getReadOnlyResolvedParams($expression['parameters'], $context, $expression); if (isset($resolvedParams[1])) { $delimiter = $resolvedParams[1]; } $symbol = $context->backend->getVariableCode($symbolVariable); $context->codePrinter->output('zephir_camelize(' . $symbol . ', ' . $resolvedParams[0] . ', ' . $delimiter . ' );'); return new CompiledExpression('variable', $symbolVariable->getRealName(), $expression); }
/** * @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']) || count($expression['parameters']) != 2) { throw new CompilerException(sprintf("'%s' requires two parameters", $this->getFunctionName()), $expression); } $resolvedParams = $call->getReadOnlyResolvedParams($expression['parameters'], $context, $expression); $context->headersManager->add('kernel/math'); return new CompiledExpression('double', 'zephir_' . $this->getFunctionName() . '(' . $resolvedParams[0] . ', ' . $resolvedParams[1] . ' TSRMLS_CC)', $expression); }
/** * @param array $expression * @param Call $call * @param CompilationContext $context * @return mixed|CompiledExpression * @throws CompilerException */ public function optimize(array $expression, Call $call, CompilationContext $context) { if (!isset($expression['parameters'])) { return false; } /** * Process the expected symbol to be returned */ $call->processExpectedReturn($context); $symbolVariable = $call->getSymbolVariable(); if ($symbolVariable) { if (!$symbolVariable->isVariable()) { throw new CompilerException("Returned values by functions can only be assigned to variant variables", $expression); } } $context->headersManager->add('kernel/variables'); $resolvedParams = $call->getResolvedParamsAsExpr($expression['parameters'], $context, $expression); $resolvedParam = $resolvedParams[0]; if (!$symbolVariable || !$symbolVariable->isVariable()) { /** * Complex expressions require a temporary variable */ switch ($resolvedParam->getType()) { case 'array': $type = 'array'; break; default: $type = 'variable'; break; } $variable = $context->symbolTable->addTemp($type, $context); $variable->initVariant($context); $statement = new LetStatement(array('type' => 'let', 'assignments' => array(array('assign-type' => $type, 'variable' => $variable->getName(), 'operator' => 'assign', 'expr' => array('type' => $resolvedParam->getType(), 'value' => $resolvedParam->getCode(), 'file' => $expression['file'], 'line' => $expression['line'], 'char' => $expression['char']), 'file' => $expression['file'], 'line' => $expression['line'], 'char' => $expression['char'])))); $statement->compile($context); } else { /** * This mark the variable as used */ $variable = $context->symbolTable->getVariableForRead($resolvedParam->getCode(), $context, $expression); } $variableSymbol = $context->backend->getVariableCodePointer($variable); /** * let a = var_export(val); */ if ($symbolVariable) { if ($symbolVariable->getName() == 'return_value') { $symbolVariable = $context->symbolTable->getTempVariableForWrite('variable', $context); } else { $symbolVariable->initVariant($context); } $symbol = $context->backend->getVariableCode($symbolVariable); $context->codePrinter->output('zephir_var_export_ex(' . $symbol . ', ' . $variableSymbol . ' TSRMLS_CC);'); return new CompiledExpression('variable', $symbolVariable->getRealName(), $expression); } $context->codePrinter->output('zephir_var_export(' . $variableSymbol . ' TSRMLS_CC);'); return new CompiledExpression('null', 'null', $expression); }
/** * @param array $expression * @param Call $call * @param CompilationContext $context * @return CompiledExpression|mixed * @throws CompilerException */ public function optimize(array $expression, Call $call, CompilationContext $context) { if (!isset($expression['parameters'])) { throw new CompilerException("This function requires parameters", $expression); } if (count($expression['parameters']) != 1) { throw new CompilerException("This function only requires one parameter", $expression); } /** * Process the expected symbol to be returned */ $call->processExpectedReturn($context); $symbolVariable = $call->getSymbolVariable(true, $context); if (!$symbolVariable->isVariable()) { throw new CompilerException("Returned values by functions can only be assigned to variant variables", $expression); } /** * Add the last call status to the current symbol table */ $call->addCallStatusFlag($context); $context->headersManager->add('kernel/object'); $symbolVariable->setDynamicTypes('object'); $resolvedParams = $call->getReadOnlyResolvedParams($expression['parameters'], $context, $expression); if ($call->mustInitSymbolVariable()) { $symbolVariable->initVariant($context); } /** * Add the last call status to the current symbol table */ $call->addCallStatusFlag($context); $context->codePrinter->output('ZEPHIR_LAST_CALL_STATUS = zephir_create_instance(' . $symbolVariable->getName() . ', ' . $resolvedParams[0] . ' TSRMLS_CC);'); $call->checkTempParameters($context); $call->addCallStatusOrJump($context); return new CompiledExpression('variable', $symbolVariable->getRealName(), $expression); }
/** * @param array $expression * @param Call $call * @param CompilationContext $context * @return bool|CompiledExpression|mixed */ public function optimize(array $expression, Call $call, CompilationContext $context) { if (!isset($expression['parameters'])) { return false; } if (count($expression['parameters']) != 1) { return false; } $resolvedParams = $call->getReadOnlyResolvedParams($expression['parameters'], $context, $expression); return new CompiledExpression('bool', 'zephir_is_callable(' . $resolvedParams[0] . ' TSRMLS_CC)', $expression); }
/** * @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; } if (count($expression['parameters']) != 1) { return false; } $resolvedParams = $call->getReadOnlyResolvedParams($expression['parameters'], $context, $expression); return new CompiledExpression('bool', 'Z_TYPE_P(' . $resolvedParams[0] . ') == ' . $this->getType(), $expression); }
/** * @param array $expression * @param Call $call * @param CompilationContext $context * @return bool|CompiledExpression|mixed * @throws CompilerException */ public function optimize(array $expression, Call $call, CompilationContext $context) { /** this optimizer has bugs */ return false; if (!isset($expression['parameters'])) { return false; } if (count($expression['parameters']) < 2) { throw new CompilerException("'substr' require two or three parameters"); } /** * Process parameters */ $lengthOffset = 2; if (isset($expression['parameters'][2]) && $expression['parameters'][2]['parameter']['type'] == 'int') { $length = $expression['parameters'][2]['parameter']['value'] . ' '; unset($expression['parameters'][2]); } if (isset($expression['parameters'][1]) && $expression['parameters'][1]['parameter']['type'] == 'int') { $from = $expression['parameters'][1]['parameter']['value'] . ' '; unset($expression['parameters'][1]); $lengthOffset = 1; } $resolvedParams = $call->getReadOnlyResolvedParams($expression['parameters'], $context, $expression); if (!isset($length) && isset($resolvedParams[$lengthOffset])) { $context->headersManager->add('kernel/operators'); $length = 'zephir_get_intval(' . $resolvedParams[$lengthOffset] . ') '; } if (!isset($from) && isset($resolvedParams[1])) { $context->headersManager->add('kernel/operators'); $from = 'zephir_get_intval(' . $resolvedParams[1] . ') '; } if (!isset($from)) { $from = '0 '; } if (!isset($length)) { $length = '0 '; } /** * Process the expected symbol to be returned */ $call->processExpectedReturn($context); $symbolVariable = $call->getSymbolVariable(); if ($symbolVariable->isNotVariableAndString()) { throw new CompilerException("Returned values by functions can only be assigned to variant variables", $expression); } if ($call->mustInitSymbolVariable()) { $symbolVariable->initVariant($context); } $context->headersManager->add('kernel/string'); $symbolVariable->setDynamicTypes('string'); $context->codePrinter->output('zephir_substr(' . $symbolVariable->getName() . ', ' . $resolvedParams[0] . ', ' . $from . ', ' . $length . ');'); return new CompiledExpression('variable', $symbolVariable->getRealName(), $expression); }
/** * @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; } if (count($expression['parameters']) != 2) { return false; } $context->headersManager->add('kernel/array'); $resolvedParams = $call->getReadOnlyResolvedParams($expression['parameters'], $context, $expression); return new CompiledExpression('bool', 'zephir_fast_in_array(' . $resolvedParams[0] . ', ' . $resolvedParams[1] . ' TSRMLS_CC)', $expression); }
/** * @todo This optimizer doesn`t work at while and etc statements * * @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; } if (count($expression['parameters']) > 0) { return false; } $context->headersManager->add('kernel/array'); $resolvedParams = $call->getReadOnlyResolvedParams($expression['parameters'], $context, $expression); return new CompiledExpression('null', 'zephir_ob_start(TSRMLS_C)', $expression); }
/** * @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; } if (count($expression['parameters']) != 1) { return false; } $context->headersManager->add('kernel/operators'); $resolvedParams = $call->getReadOnlyResolvedParams($expression['parameters'], $context, $expression); return new CompiledExpression('long', 'zephir_get_intval(' . $resolvedParams[0] . ')', $expression); }
/** * @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; } if (count($expression['parameters']) < 2) { throw new CompilerException("'explode' require two parameter"); } /** * 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); } /** * Process limit */ $limit = 'LONG_MAX'; $limitOffset = 2; if (count($expression['parameters']) == 3 && $expression['parameters'][2]['parameter']['type'] == 'int') { $limit = $expression['parameters'][2]['parameter']['value'] . ' '; unset($expression['parameters'][2]); } if ($expression['parameters'][0]['parameter']['type'] == 'string') { $str = Utils::addSlashes($expression['parameters'][0]['parameter']['value']); unset($expression['parameters'][0]); if (count($expression['parameters']) == 2) { $limitOffset = 1; } } $resolvedParams = $call->getReadOnlyResolvedParams($expression['parameters'], $context, $expression); if (isset($resolvedParams[$limitOffset])) { $context->headersManager->add('kernel/operators'); $limit = 'zephir_get_intval(' . $resolvedParams[$limitOffset] . ') '; } $context->headersManager->add('kernel/string'); $symbolVariable->setDynamicTypes('array'); if ($call->mustInitSymbolVariable()) { $symbolVariable->initVariant($context); } $symbol = $context->backend->getVariableCode($symbolVariable); if (isset($str)) { $context->codePrinter->output('zephir_fast_explode_str(' . $symbol . ', SL("' . $str . '"), ' . $resolvedParams[0] . ', ' . $limit . ' TSRMLS_CC);'); return new CompiledExpression('variable', $symbolVariable->getRealName(), $expression); } $context->codePrinter->output('zephir_fast_explode(' . $symbol . ', ' . $resolvedParams[0] . ', ' . $resolvedParams[1] . ', ' . $limit . ' TSRMLS_CC);'); return new CompiledExpression('variable', $symbolVariable->getRealName(), $expression); }
/** * * @param array $expression * @param Call $call * @param CompilationContext $context */ public function optimize(array $expression, Call $call, CompilationContext $context) { if (!isset($expression['parameters'])) { return false; } if (count($expression['parameters']) != 1) { throw new CompilerException("'phql_parse_phql' only accepts one parameter", $expression); } /** * Process the expected symbol to be returned */ $call->processExpectedReturn($context); $symbolVariable = $call->getSymbolVariable(); if ($symbolVariable->getType() != 'variable') { throw new CompilerException("Returned values by functions can only be assigned to variant variables", $expression); } if ($call->mustInitSymbolVariable()) { $symbolVariable->initVariant($context); } $symbolVariable->setDynamicTypes('array'); $resolvedParams = $call->getReadOnlyResolvedParams($expression['parameters'], $context, $expression); $context->headersManager->add('phalcon/mvc/model/query/scanner', HeadersManager::POSITION_LAST); $context->headersManager->add('phalcon/mvc/model/query/phql', HeadersManager::POSITION_LAST); $call->addCallStatusFlag($context); $context->codePrinter->output('ZEPHIR_LAST_CALL_STATUS = phql_parse_phql(' . $symbolVariable->getName() . ', ' . $resolvedParams[0] . ' TSRMLS_CC);'); $call->checkTempParameters($context); $call->addCallStatusOrJump($context); return new CompiledExpression('variable', $symbolVariable->getRealName(), $expression); }
/** * @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']) && count($expression['parameters']) > 1) { return false; } $context->headersManager->add('kernel/exit'); if (!isset($expression['parameters'])) { $context->codePrinter->output('zephir_exit_empty();'); } else { $resolvedParams = $call->getReadOnlyResolvedParams($expression['parameters'], $context, $expression); $context->codePrinter->output('zephir_exit(' . $resolvedParams[0] . ');'); } $context->codePrinter->output('ZEPHIR_MM_RESTORE();'); return new CompiledExpression('null', '', $expression); }
/** * @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; } if (count($expression['parameters']) != 2) { return false; } $context->headersManager->add('kernel/file'); /** * Process the expected symbol to be returned */ $call->processExpectedReturn($context); $resolvedParams = $call->getReadOnlyResolvedParams($expression['parameters'], $context, $expression); return new CompiledExpression('bool', 'zephir_compare_mtime(' . $resolvedParams[0] . ', ' . $resolvedParams[1] . ' TSRMLS_CC)', $expression); }