作者:edi
项目:zephi
/**
* @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);
}
作者:edi
项目:zephi
/**
* @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);
}
作者:zhao590
项目:zephi
/**
* @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);
}
作者:zhao590
项目:zephi
/**
* @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);
}
作者:NumbDa
项目:zephi
/**
* @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);
}
作者:zhao590
项目:zephi
/**
* @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);
}
作者:lison
项目:cphalco
/**
* @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);
}
作者:starsw00
项目:cphalco
/**
*
* @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);
}
作者:edi
项目:zephi
/**
* @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);
}
作者:NumbDa
项目:zephi
/**
* @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);
}
作者:NumbDa
项目:zephi
/**
* @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);
}
作者:noiki
项目:ow
/**
* @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);
}
作者:mattvb9
项目:cphalco
/**
* @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);
}
作者:NumbDa
项目:zephi
/**
* @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);
}
作者:edi
项目:zephi
/**
* @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);
}
作者:noiki
项目:core_zephi
/**
*
* @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);
}
作者:zhao590
项目:zephi
/**
* @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);
}
作者:chet0xhenr
项目:zephi
/**
* @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);
}
作者:chet0xhenr
项目:zephi
/**
* @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);
}
作者:edi
项目:zephi
/**
* @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);
}