Ejemplo n.º 1
0
 /**
  * Resolves an item that will be assigned to an array offset
  *
  * @param CompiledExpression $resolvedExpr
  * @param CompilationContext $compilationContext
  */
 protected function _getResolvedArrayItem(CompiledExpression $resolvedExpr, CompilationContext $compilationContext)
 {
     $codePrinter = $compilationContext->codePrinter;
     switch ($resolvedExpr->getType()) {
         case 'null':
             $symbolVariable = new GlobalConstant('ZEPHIR_GLOBAL(global_null)');
             break;
         case 'int':
         case 'uint':
         case 'long':
             $symbolVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext, $resolvedExpr->getOriginal());
             $codePrinter->output('ZVAL_LONG(' . $symbolVariable->getName() . ', ' . $resolvedExpr->getCode() . ');');
             break;
         case 'char':
             $symbolVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext, $resolvedExpr->getOriginal());
             $codePrinter->output('ZVAL_LONG(' . $symbolVariable->getName() . ', \'' . $resolvedExpr->getCode() . '\');');
             break;
         case 'double':
             $symbolVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext, $resolvedExpr->getOriginal());
             $codePrinter->output('ZVAL_DOUBLE(' . $symbolVariable->getName() . ', ' . $resolvedExpr->getCode() . ');');
             break;
         case 'bool':
             if ($resolvedExpr->getBooleanCode() == '1') {
                 $symbolVariable = new GlobalConstant('ZEPHIR_GLOBAL(global_true)');
             } else {
                 if ($resolvedExpr->getBooleanCode() == '0') {
                     $symbolVariable = new GlobalConstant('ZEPHIR_GLOBAL(global_false)');
                 } else {
                     $symbolVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext, $resolvedExpr->getOriginal());
                     $codePrinter->output('ZVAL_BOOL(' . $symbolVariable->getName() . ', ' . $resolvedExpr->getBooleanCode() . ');');
                 }
             }
             break;
         case 'string':
             $symbolVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext, $resolvedExpr->getOriginal());
             $codePrinter->output('ZVAL_STRING(' . $symbolVariable->getName() . ', "' . $resolvedExpr->getCode() . '", 1);');
             break;
         case 'array':
             $symbolVariable = $compilationContext->symbolTable->getVariableForRead($resolvedExpr->getCode(), $compilationContext, $resolvedExpr->getOriginal());
             break;
         case 'variable':
             $variableExpr = $compilationContext->symbolTable->getVariableForRead($resolvedExpr->getCode(), $compilationContext, $resolvedExpr->getOriginal());
             switch ($variableExpr->getType()) {
                 case 'int':
                 case 'uint':
                 case 'long':
                 case 'ulong':
                     $symbolVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext, $resolvedExpr->getOriginal());
                     $codePrinter->output('ZVAL_LONG(' . $symbolVariable->getName() . ', ' . $variableExpr->getName() . ');');
                     break;
                 case 'double':
                     $symbolVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext, $resolvedExpr->getOriginal());
                     $codePrinter->output('ZVAL_DOUBLE(' . $symbolVariable->getName() . ', ' . $variableExpr->getName() . ');');
                     break;
                 case 'bool':
                     $symbolVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext, $resolvedExpr->getOriginal());
                     $codePrinter->output('ZVAL_BOOL(' . $symbolVariable->getName() . ', ' . $variableExpr->getName() . ');');
                     break;
                 case 'variable':
                 case 'string':
                 case 'array':
                     $symbolVariable = $variableExpr;
                     break;
                 default:
                     throw new CompilerException("Variable: " . $variableExpr->getType() . " cannot be assigned to array offset", $resolvedExpr->getOriginal());
             }
             break;
         default:
             throw new CompilerException("Expression: " . $resolvedExpr->getType() . " cannot be assigned to array offset", $resolvedExpr->getOriginal());
     }
     return $symbolVariable;
 }
Ejemplo n.º 2
0
 /**
  * Resolves an item to be added in an array
  *
  * @param CompiledExpression $exprCompiled
  * @param CompilationContext $compilationContext
  * @return Variable
  */
 public function getArrayValue($exprCompiled, CompilationContext $compilationContext)
 {
     $codePrinter = $compilationContext->codePrinter;
     switch ($exprCompiled->getType()) {
         case 'int':
         case 'uint':
         case 'long':
             $tempVar = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext);
             $codePrinter->output('ZVAL_LONG(' . $tempVar->getName() . ', ' . $exprCompiled->getCode() . ');');
             return $tempVar;
         case 'char':
         case 'uchar':
             $tempVar = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext);
             $codePrinter->output('ZVAL_LONG(' . $tempVar->getName() . ', \'' . $exprCompiled->getCode() . '\');');
             return $tempVar;
         case 'double':
             $tempVar = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext);
             $codePrinter->output('ZVAL_DOUBLE(' . $tempVar->getName() . ', ' . $exprCompiled->getCode() . ');');
             return $tempVar;
         case 'bool':
             if ($exprCompiled->getCode() == 'true') {
                 return new GlobalConstant('ZEPHIR_GLOBAL(global_true)');
             } else {
                 if ($exprCompiled->getCode() == 'false') {
                     return new GlobalConstant('ZEPHIR_GLOBAL(global_false)');
                 } else {
                     throw new Exception('?');
                 }
             }
             break;
         case 'null':
             return new GlobalConstant('ZEPHIR_GLOBAL(global_null)');
         case 'string':
         case 'ulong':
             $tempVar = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext);
             $codePrinter->output('ZVAL_STRING(' . $tempVar->getName() . ', "' . $exprCompiled->getCode() . '", 1);');
             return $tempVar;
         case 'array':
             return $compilationContext->symbolTable->getVariableForRead($exprCompiled->getCode(), $compilationContext, $exprCompiled->getOriginal());
         case 'variable':
             $itemVariable = $compilationContext->symbolTable->getVariableForRead($exprCompiled->getCode(), $compilationContext, $exprCompiled->getOriginal());
             switch ($itemVariable->getType()) {
                 case 'int':
                 case 'uint':
                 case 'long':
                 case 'ulong':
                     $tempVar = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext);
                     $codePrinter->output('ZVAL_LONG(' . $tempVar->getName() . ', ' . $itemVariable->getName() . ');');
                     return $tempVar;
                 case 'double':
                     $tempVar = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext);
                     $codePrinter->output('ZVAL_DOUBLE(' . $tempVar->getName() . ', ' . $itemVariable->getName() . ');');
                     return $tempVar;
                 case 'bool':
                     $tempVar = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext);
                     $codePrinter->output('ZVAL_BOOL(' . $tempVar->getName() . ', ' . $itemVariable->getName() . ');');
                     return $tempVar;
                 case 'string':
                 case 'variable':
                 case 'array':
                     return $itemVariable;
                 default:
                     throw new CompilerException("Unknown " . $itemVariable->getType(), $itemVariable);
             }
             break;
         default:
             throw new CompilerException("Unknown", $exprCompiled);
     }
 }
Ejemplo n.º 3
0
 /**
  * Resolves an item to be added in an array
  *
  * @param CompiledExpression $exprCompiled
  * @param CompilationContext $compilationContext
  * @return Variable
  */
 public function getArrayValue(CompiledExpression $exprCompiled, CompilationContext $compilationContext)
 {
     $codePrinter = $compilationContext->codePrinter;
     switch ($exprCompiled->getType()) {
         case 'int':
         case 'uint':
         case 'long':
             $tempVar = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext);
             $compilationContext->backend->assignLong($tempVar, $exprCompiled->getCode(), $compilationContext);
             return $tempVar;
         case 'char':
         case 'uchar':
             $tempVar = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext);
             $compilationContext->backend->assignLong($tempVar, '\'' . $exprCompiled->getCode() . '\'', $compilationContext);
             return $tempVar;
         case 'double':
             $tempVar = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext);
             $compilationContext->backend->assignDouble($tempVar, $exprCompiled->getCode(), $compilationContext);
             return $tempVar;
         case 'bool':
             if ($exprCompiled->getCode() == 'true') {
                 return new GlobalConstant('ZEPHIR_GLOBAL(global_true)');
             }
             if ($exprCompiled->getCode() == 'false') {
                 return new GlobalConstant('ZEPHIR_GLOBAL(global_false)');
             }
             $tempVar = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext);
             $compilationContext->backend->assignBool($tempVar, $exprCompiled->getCode(), $compilationContext);
             return $tempVar;
         case 'null':
             return new GlobalConstant('ZEPHIR_GLOBAL(global_null)');
         case 'string':
         case 'ulong':
             $tempVar = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext);
             $compilationContext->backend->assignString($tempVar, $exprCompiled->getCode(), $compilationContext);
             return $tempVar;
         case 'array':
             return $compilationContext->symbolTable->getVariableForRead($exprCompiled->getCode(), $compilationContext, $exprCompiled->getOriginal());
         case 'variable':
             $itemVariable = $compilationContext->symbolTable->getVariableForRead($exprCompiled->getCode(), $compilationContext, $exprCompiled->getOriginal());
             switch ($itemVariable->getType()) {
                 case 'int':
                 case 'uint':
                 case 'long':
                 case 'ulong':
                     $tempVar = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext);
                     $compilationContext->backend->assignLong($tempVar, $itemVariable, $compilationContext);
                     return $tempVar;
                 case 'double':
                     $tempVar = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext);
                     $compilationContext->backend->assignDouble($tempVar, $itemVariable, $compilationContext);
                     return $tempVar;
                 case 'bool':
                     $tempVar = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext);
                     $compilationContext->backend->assignBool($tempVar, $itemVariable, $compilationContext);
                     return $tempVar;
                 case 'string':
                 case 'variable':
                 case 'array':
                     return $itemVariable;
                 default:
                     throw new CompilerException("Unknown " . $itemVariable->getType(), $itemVariable);
             }
             break;
         default:
             throw new CompilerException("Unknown", $exprCompiled);
     }
 }