本文整理汇总了PHP中Zephir\Variable::getType方法的典型用法代码示例。如果您正苦于以下问题:PHP Variable::getType方法的具体用法?PHP Variable::getType怎么用?PHP Variable::getType使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Zephir\Variable
的用法示例。
在下文中一共展示了Variable::getType方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的PHP代码示例。
示例1: assign
/**
* Compiles obj->x++
*
* @param string $variable
* @param string $property
* @param ZephirVariable $symbolVariable
* @param CompilationContext $compilationContext
* @param array $statement
*/
public function assign($variable, $property, ZephirVariable $symbolVariable, CompilationContext $compilationContext, $statement)
{
if (!$symbolVariable->isInitialized()) {
throw new CompilerException("Cannot mutate variable '" . $variable . "' because it is not initialized", $statement);
}
/**
* Arrays must be stored in the HEAP
*/
if ($symbolVariable->isLocalOnly()) {
throw new CompilerException("Cannot mutate variable '" . $variable . "' because it is local only", $statement);
}
if (!$symbolVariable->isInitialized()) {
throw new CompilerException("Cannot mutate variable '" . $variable . "' because it is not initialized", $statement);
}
/**
* Only dynamic variables can be used as arrays
*/
if ($symbolVariable->getType() != 'variable') {
throw new CompilerException("Cannot use variable type: '" . $symbolVariable->getType() . "' as array", $statement);
}
if ($symbolVariable->hasAnyDynamicType('unknown')) {
throw new CompilerException("Cannot use non-initialized variable as an object", $statement);
}
/**
* Trying to use a non-object dynamic variable as object
*/
if ($symbolVariable->hasDifferentDynamicType(array('undefined', 'object', 'null'))) {
$compilationContext->logger->warning('Possible attempt to increment non-object dynamic variable', 'non-object-update', $statement);
}
$compilationContext->headersManager->add('kernel/object');
$compilationContext->codePrinter->output('RETURN_ON_FAILURE(zephir_property_incr(' . $symbolVariable->getName() . ', SL("' . $property . '") TSRMLS_CC));');
}
示例2: getVariableCode
public function getVariableCode(Variable $variable)
{
if ($variable->isLocalOnly() && !in_array($variable->getType(), array('int'))) {
return '&' . $variable->getName();
}
return $variable->getName();
}
示例3: getVariableCode
public function getVariableCode(Variable $variable)
{
if ($variable->isDoublePointer() || in_array($variable->getName(), array('this_ptr', 'return_value')) || in_array($variable->getType(), array('int', 'long'))) {
return $variable->getName();
}
return '&' . $variable->getName();
}
示例4: assign
/**
* Compiles obj->x++
*
* @param string $variable
* @param string $property
* @param ZephirVariable $symbolVariable
* @param CompilationContext $compilationContext
* @param array $statement
*/
public function assign($variable, $property, ZephirVariable $symbolVariable, CompilationContext $compilationContext, $statement)
{
if (!$symbolVariable->isInitialized()) {
throw new CompilerException("Cannot mutate variable '" . $variable . "' because it is not initialized", $statement);
}
/**
* Arrays must be stored in the HEAP
*/
if ($symbolVariable->isLocalOnly()) {
throw new CompilerException("Cannot mutate variable '" . $variable . "' because it is local only", $statement);
}
if (!$symbolVariable->isInitialized()) {
throw new CompilerException("Cannot mutate variable '" . $variable . "' because it is not initialized", $statement);
}
/**
* Only dynamic variables can be used as arrays
*/
if (!$symbolVariable->isVariable()) {
throw new CompilerException("Cannot use variable type: '" . $symbolVariable->getType() . "' as array", $statement);
}
if ($symbolVariable->hasAnyDynamicType('unknown')) {
throw new CompilerException("Cannot use non-initialized variable as an object", $statement);
}
/**
* Trying to use a non-object dynamic variable as object
*/
if ($symbolVariable->hasDifferentDynamicType(array('undefined', 'object', 'null'))) {
$compilationContext->logger->warning('Possible attempt to increment non-object dynamic variable', 'non-object-update', $statement);
}
/**
* Check if the variable to update is defined
*/
if ($symbolVariable->getRealName() == 'this') {
$classDefinition = $compilationContext->classDefinition;
if (!$classDefinition->hasProperty($property)) {
throw new CompilerException("Class '" . $classDefinition->getCompleteName() . "' does not have a property called: '" . $property . "'", $statement);
}
$propertyDefinition = $classDefinition->getProperty($property);
} else {
/**
* If we know the class related to a variable we could check if the property
* is defined on that class
*/
if ($symbolVariable->hasAnyDynamicType('object')) {
$classType = current($symbolVariable->getClassTypes());
$compiler = $compilationContext->compiler;
if ($compiler->isClass($classType)) {
$classDefinition = $compiler->getClassDefinition($classType);
if (!$classDefinition) {
throw new CompilerException("Cannot locate class definition for class: " . $classType, $statement);
}
if (!$classDefinition->hasProperty($property)) {
throw new CompilerException("Class '" . $classType . "' does not have a property called: '" . $property . "'", $statement);
}
}
}
}
$compilationContext->headersManager->add('kernel/object');
$compilationContext->codePrinter->output('RETURN_ON_FAILURE(zephir_property_incr(' . $symbolVariable->getName() . ', SL("' . $property . '") TSRMLS_CC));');
}
示例5: assign
/**
* Compiles x--
*
* @param string $variable
* @param ZephirVariable $symbolVariable
* @param CompilationContext $compilationContext
* @param array $statement
*/
public function assign($variable, ZephirVariable $symbolVariable, CompilationContext $compilationContext, $statement)
{
if (!$symbolVariable->isInitialized()) {
throw new CompilerException("Cannot mutate variable '" . $variable . "' because it is not initialized", $statement);
}
if ($symbolVariable->isReadOnly()) {
throw new CompilerException("Cannot mutate variable '" . $variable . "' because it is read only", $statement);
}
$codePrinter = $compilationContext->codePrinter;
switch ($symbolVariable->getType()) {
case 'int':
case 'uint':
case 'long':
case 'ulong':
case 'double':
case 'char':
case 'uchar':
$codePrinter->output($variable . '--;');
break;
case 'variable':
/**
* Variable is probably not initialized here
*/
if ($symbolVariable->hasAnyDynamicType('unknown')) {
throw new CompilerException("Attempt to increment uninitialized variable", $statement);
}
/**
* Decrement non-numeric variables could be expensive
*/
if (!$symbolVariable->hasAnyDynamicType(array('undefined', 'int', 'long', 'double', 'uint'))) {
$compilationContext->logger->warning('Possible attempt to decrement non-numeric dynamic variable', 'non-valid-decrement', $statement);
}
$compilationContext->headersManager->add('kernel/operators');
if ($symbolVariable->isLocalOnly()) {
$codePrinter->output('zephir_decrement(&' . $variable . ');');
} else {
$symbolVariable->separate($compilationContext);
$codePrinter->output('zephir_decrement(' . $variable . ');');
}
break;
default:
throw new CompilerException("Cannot decrement variable: " . $symbolVariable->getType(), $statement);
}
}
示例6: assign
/**
* Compiles x++
*
* @param string $variable
* @param ZephirVariable $symbolVariable
* @param CompilationContext $compilationContext
* @param array $statement
*
* @throws CompilerException
*/
public function assign($variable, ZephirVariable $symbolVariable, CompilationContext $compilationContext, $statement)
{
if (!$symbolVariable->isInitialized()) {
throw new CompilerException("Cannot mutate variable '" . $variable . "' because it is not initialized", $statement);
}
if ($symbolVariable->isReadOnly()) {
/**
* @TODO implement increment of objects members
*/
throw new CompilerException("Cannot mutate variable '" . $variable . "' because it is read only", $statement);
}
$codePrinter =& $compilationContext->codePrinter;
switch ($symbolVariable->getType()) {
case 'int':
case 'uint':
case 'long':
case 'ulong':
case 'double':
case 'char':
case 'uchar':
$codePrinter->output($variable . '++;');
break;
case 'variable':
/**
* Update non-numeric dynamic variables could be expensive
*/
if (!$symbolVariable->hasAnyDynamicType(array('undefined', 'long', 'double'))) {
$compilationContext->logger->warning('Possible attempt to increment non-numeric dynamic variable', 'non-valid-increment', $statement);
}
$compilationContext->headersManager->add('kernel/operators');
if (!$symbolVariable->isLocalOnly()) {
$symbolVariable->separate($compilationContext);
}
$symbol = $compilationContext->backend->getVariableCode($symbolVariable);
$codePrinter->output('zephir_increment(' . $symbol . ');');
break;
default:
throw new CompilerException("Cannot increment: " . $symbolVariable->getType(), $statement);
}
}
示例7: _accessDimensionArray
/**
* @param array $expression
* @param Variable $variableVariable
* @param CompilationContext $compilationContext
*/
protected function _accessDimensionArray($expression, Variable $variableVariable, CompilationContext $compilationContext)
{
$arrayAccess = $expression;
if ($variableVariable->getType() == 'variable') {
if ($variableVariable->hasAnyDynamicType('unknown')) {
throw new CompilerException("Cannot use non-initialized variable as an array", $arrayAccess['left']);
}
/**
* Trying to use a non-object dynamic variable as object
*/
if ($variableVariable->hasDifferentDynamicType(array('undefined', 'array', 'null'))) {
$compilationContext->logger->warning('Possible attempt to access array-index on a non-array dynamic variable', 'non-array-access', $arrayAccess['left']);
}
}
$codePrinter = $compilationContext->codePrinter;
/**
* Resolves the symbol that expects the value
*/
$readOnly = false;
$symbolVariable = $this->_expectingVariable;
if ($this->_readOnly) {
if ($this->_expecting && $this->_expectingVariable) {
/**
* If a variable is assigned once in the method, we try to promote it
* to a read only variable
*/
if ($symbolVariable->getName() != 'return_value') {
$line = $compilationContext->symbolTable->getLastCallLine();
if ($line === false || $line > 0 && $line < $expression['line']) {
$numberMutations = $compilationContext->symbolTable->getExpectedMutations($symbolVariable->getName());
if ($numberMutations == 1) {
if ($symbolVariable->getNumberMutations() == $numberMutations) {
$symbolVariable->setMemoryTracked(false);
$readOnly = true;
}
}
}
}
/**
* Variable is not read-only or it wasn't promoted
*/
if (!$readOnly) {
if ($symbolVariable->getName() != 'return_value') {
$symbolVariable->observeVariant($compilationContext);
$this->_readOnly = false;
} else {
$symbolVariable = $compilationContext->symbolTable->getTempNonTrackedUninitializedVariable('variable', $compilationContext, $expression);
}
}
} else {
$symbolVariable = $compilationContext->symbolTable->getTempNonTrackedUninitializedVariable('variable', $compilationContext, $expression);
}
} else {
if ($this->_expecting && $this->_expectingVariable) {
/**
* If a variable is assigned once in the method, we try to promote it
* to a read only variable
*/
if ($symbolVariable->getName() != 'return_value') {
$line = $compilationContext->symbolTable->getLastCallLine();
if ($line === false || $line > 0 && $line < $expression['line']) {
$numberMutations = $compilationContext->symbolTable->getExpectedMutations($symbolVariable->getName());
if ($numberMutations == 1) {
if ($symbolVariable->getNumberMutations() == $numberMutations) {
$symbolVariable->setMemoryTracked(false);
$readOnly = true;
}
}
}
}
/**
* Variable is not read-only or it wasn't promoted
*/
if (!$readOnly) {
if ($symbolVariable->getName() != 'return_value') {
$symbolVariable->observeVariant($compilationContext);
$this->_readOnly = false;
} else {
$symbolVariable = $compilationContext->symbolTable->getTempVariableForObserve('variable', $compilationContext, $expression);
}
}
} else {
$symbolVariable = $compilationContext->symbolTable->getTempVariableForObserve('variable', $compilationContext, $expression);
}
}
/**
* Variable that receives property accesses must be polimorphic
*/
if ($symbolVariable->getType() != 'variable') {
throw new CompilerException("Cannot use variable: " . $symbolVariable->getType() . " to assign array index", $expression);
}
/**
* At this point, we don't know the type fetched from the index
*/
$symbolVariable->setDynamicTypes('undefined');
//.........这里部分代码省略.........
示例8: assign
/**
* Compiles foo->x = {expr}
*
* @param string $variable
* @param ZephirVariable $symbolVariable
* @param CompiledExpression $resolvedExpr
* @param CompilationContext $compilationContext
* @param array $statement
*/
public function assign($variable, ZephirVariable $symbolVariable, CompiledExpression $resolvedExpr, CompilationContext $compilationContext, $statement)
{
if (!$symbolVariable->isInitialized()) {
throw new CompilerException("Cannot mutate variable '" . $variable . "' because it is not initialized", $statement);
}
if (!$symbolVariable->isVariable()) {
throw new CompilerException("Variable type '" . $symbolVariable->getType() . "' cannot be used as object", $statement);
}
$propertyName = $statement['property'];
$className = $compilationContext->classDefinition->getCompleteName();
if (!$symbolVariable->isInitialized()) {
throw new CompilerException("Cannot mutate static property '" . $className . "::" . $propertyName . "' because it is not initialized", $statement);
}
if (!$symbolVariable->isVariable()) {
throw new CompilerException("Cannot use variable type: " . $symbolVariable->getType() . " as an object", $statement);
}
if ($symbolVariable->hasAnyDynamicType('unknown')) {
throw new CompilerException("Cannot use non-initialized variable as an object", $statement);
}
/**
* Trying to use a non-object dynamic variable as object
*/
if ($symbolVariable->hasDifferentDynamicType(array('undefined', 'object'))) {
$compilationContext->logger->warning('Possible attempt to update property on non-object dynamic property', 'non-valid-objectupdate', $statement);
}
/**
* Try to check if property is implemented on related object
*/
if ($variable == 'this') {
if (!$compilationContext->classDefinition->hasProperty($propertyName)) {
throw new CompilerException("Property '" . $propertyName . "' is not defined on class '" . $className . "'", $statement);
}
}
$codePrinter = $compilationContext->codePrinter;
$compilationContext->headersManager->add('kernel/object');
switch ($resolvedExpr->getType()) {
case 'null':
$compilationContext->backend->updateProperty($symbolVariable, $propertyName, 'null', $compilationContext);
break;
case 'int':
case 'long':
case 'uint':
$tempVariable = $compilationContext->symbolTable->getTempNonTrackedVariable('variable', $compilationContext);
switch ($statement['operator']) {
case 'mul-assign':
case 'sub-assign':
case 'add-assign':
switch ($statement['operator']) {
case 'mul-assign':
$functionName = 'ZEPHIR_MUL_ASSIGN';
break;
case 'sub-assign':
$functionName = 'ZEPHIR_SUB_ASSIGN';
break;
case 'add-assign':
$functionName = 'ZEPHIR_ADD_ASSIGN';
break;
}
$resolvedVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext);
$compilationContext->backend->assignLong($resolvedVariable, $resolvedExpr->getBooleanCode(), $compilationContext);
$codePrinter->output($functionName . '(' . $compilationContext->backend->getVariableCode($tempVariable) . ', ' . $compilationContext->backend->getVariableCode($resolvedVariable) . ')');
break;
case 'assign':
$tempVariable->initNonReferenced($compilationContext);
$compilationContext->backend->assignLong($tempVariable, $resolvedExpr->getBooleanCode(), $compilationContext);
break;
default:
throw new CompilerException("Operator '" . $statement['operator'] . "' is not supported for object property: " . $tempVariable->getType(), $statement);
}
$compilationContext->backend->updateProperty($symbolVariable, $propertyName, $tempVariable, $compilationContext);
$tempVariable->setIdle(true);
break;
case 'char':
$tempVariable = $compilationContext->symbolTable->getTempNonTrackedVariable('variable', $compilationContext);
switch ($statement['operator']) {
case 'assign':
$tempVariable->initNonReferenced($compilationContext);
$compilationContext->backend->assignLong($tempVariable, '\'' . $resolvedExpr->getBooleanCode() . '\'', $compilationContext);
break;
default:
throw new CompilerException("Operator '" . $statement['operator'] . "' is not supported for object property: " . $tempVariable->getType(), $statement);
}
$compilationContext->backend->updateProperty($symbolVariable, $propertyName, $tempVariable, $compilationContext);
$tempVariable->setIdle(true);
break;
case 'double':
$tempVariable = $compilationContext->symbolTable->getTempNonTrackedVariable('variable', $compilationContext);
switch ($statement['operator']) {
case 'mul-assign':
case 'sub-assign':
case 'add-assign':
//.........这里部分代码省略.........
示例9: assign
/**
* Compiles foo[] = {expr}
*
* @param $variable
* @param ZephirVariable $symbolVariable
* @param CompiledExpression $resolvedExpr
* @param CompilationContext $compilationContext
* @param $statement
* @throws CompilerException
*/
public function assign($variable, ZephirVariable $symbolVariable, CompiledExpression $resolvedExpr, CompilationContext $compilationContext, $statement)
{
if (!$symbolVariable->isInitialized()) {
throw new CompilerException("Cannot mutate variable '" . $variable . "' because it is not initialized", $statement);
}
if ($symbolVariable->isReadOnly()) {
throw new CompilerException("Cannot mutate variable '" . $variable . "' because it is read only", $statement);
}
if ($symbolVariable->isLocalOnly()) {
throw new CompilerException("Cannot mutate variable '" . $variable . "' because it is local only", $statement);
}
/**
* Only dynamic variables and arrays can be used as arrays
*/
if ($symbolVariable->isNotVariableAndArray()) {
throw new CompilerException("Cannot use variable type: '" . $symbolVariable->getType() . "' as an array", $statement);
}
if ($symbolVariable->getType() == 'variable') {
if ($symbolVariable->hasDifferentDynamicType(array('undefined', 'array'))) {
$compilationContext->logger->warning('Possible attempt to append elements on a non-array dynamic variable', 'non-array-append', $statement);
}
}
$codePrinter = $compilationContext->codePrinter;
$compilationContext->headersManager->add('kernel/array');
$type = $symbolVariable->getType();
switch ($type) {
case 'array':
case 'variable':
switch ($resolvedExpr->getType()) {
case 'null':
$compilationContext->backend->addArrayEntry($symbolVariable, null, 'null', $compilationContext, $statement);
break;
case 'int':
case 'uint':
case 'long':
$tempVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext, $statement);
$compilationContext->backend->assignLong($tempVariable, $resolvedExpr->getCode(), $compilationContext);
$compilationContext->backend->addArrayEntry($symbolVariable, null, $tempVariable, $compilationContext, $statement);
$tempVariable->setIdle(true);
break;
case 'double':
$tempVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext, $statement);
$compilationContext->backend->assignDouble($tempVariable, $resolvedExpr->getCode(), $compilationContext);
$compilationContext->backend->addArrayEntry($symbolVariable, null, $tempVariable, $compilationContext, $statement);
$tempVariable->setIdle(true);
break;
case 'bool':
$tempVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext, $statement);
$compilationContext->backend->assignBool($tempVariable, $resolvedExpr->getBooleanCode(), $compilationContext);
$compilationContext->backend->addArrayEntry($symbolVariable, null, $tempVariable, $compilationContext, $statement);
$tempVariable->setIdle(true);
break;
case 'ulong':
case 'string':
$tempVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext, $statement);
$compilationContext->backend->assignString($tempVariable, $resolvedExpr->getBooleanCode(), $compilationContext);
$compilationContext->backend->addArrayEntry($symbolVariable, null, $tempVariable, $compilationContext, $statement);
$tempVariable->setIdle(true);
break;
case 'array':
$exprVariable = $compilationContext->symbolTable->getVariableForRead($resolvedExpr->getCode(), $compilationContext, $statement);
$compilationContext->backend->addArrayEntry($symbolVariable, null, $exprVariable, $compilationContext, $statement);
break;
case 'variable':
$exprVariable = $compilationContext->symbolTable->getVariableForRead($resolvedExpr->getCode(), $compilationContext, $statement);
switch ($exprVariable->getType()) {
case 'int':
case 'uint':
case 'long':
$tempVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext, $statement);
$compilationContext->backend->assignLong($tempVariable, $exprVariable, $compilationContext);
$compilationContext->backend->addArrayEntry($symbolVariable, null, $tempVariable, $compilationContext, $statement);
$tempVariable->setIdle(true);
break;
case 'double':
$tempVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext, $statement);
$compilationContext->backend->assignDouble($tempVariable, $exprVariable, $compilationContext);
$compilationContext->backend->addArrayEntry($symbolVariable, null, $tempVariable, $compilationContext, $statement);
$tempVariable->setIdle(true);
break;
case 'bool':
$tempVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext, $statement);
$compilationContext->backend->assignBool($tempVariable, $exprVariable, $compilationContext);
$compilationContext->backend->addArrayEntry($symbolVariable, null, $tempVariable, $compilationContext, $statement);
$tempVariable->setIdle(true);
break;
case 'variable':
case 'string':
case 'array':
$compilationContext->backend->addArrayEntry($symbolVariable, null, $exprVariable, $compilationContext, $statement);
//.........这里部分代码省略.........
示例10: assign
/**
* Compiles foo->{x} = {expr}
*
* @param string $variable
* @param Variable $symbolVariable
* @param CompiledExpression $resolvedExpr
* @param CompilationContext $compilationContext
* @param array $statement
*/
public function assign($variable, ZephirVariable $symbolVariable, CompiledExpression $resolvedExpr, CompilationContext $compilationContext, $statement)
{
if (!$symbolVariable->isInitialized()) {
throw new CompilerException("Cannot mutate variable '" . $variable . "' because it is not initialized", $statement);
}
if ($symbolVariable->getType() != 'variable') {
throw new CompilerException("Variable type '" . $symbolVariable->getType() . "' cannot be used as object", $statement);
}
$propertyName = $statement['property'];
$propertyVariable = $compilationContext->symbolTable->getVariableForRead($propertyName, $compilationContext, $statement);
if ($propertyVariable->isNotVariableAndString()) {
throw new CompilerException("Cannot use variable type '" . $propertyVariable->getType() . "' to update object property", $statement);
}
if (!$symbolVariable->isInitialized()) {
throw new CompilerException("Cannot mutate static property '" . $compilationContext->classDefinition->getCompleteName() . "::" . $propertyName . "' because it is not initialized", $statement);
}
if ($symbolVariable->getType() != 'variable') {
throw new CompilerException("Cannot use variable type: " . $symbolVariable->getType() . " as an object", $statement);
}
if ($symbolVariable->hasAnyDynamicType('unknown')) {
throw new CompilerException("Cannot use non-initialized variable as an object", $statement);
}
/**
* Trying to use a non-object dynamic variable as object
*/
if ($symbolVariable->hasDifferentDynamicType(array('undefined', 'object', 'null'))) {
$compilationContext->logger->warning('Possible attempt to update property on non-object dynamic property', 'non-valid-objectupdate', $statement);
}
$codePrinter = $compilationContext->codePrinter;
$compilationContext->headersManager->add('kernel/object');
$propertyVariableName = $compilationContext->symbolTable->getVariable($propertyName);
switch ($resolvedExpr->getType()) {
case 'null':
if ($variable == 'this') {
$codePrinter->output('zephir_update_property_this(this_ptr, Z_STRVAL_P(' . $propertyVariableName->getName() . '), Z_STRLEN_P(' . $propertyVariableName->getName() . '), ZEPHIR_GLOBAL(global_null) TSRMLS_CC);');
} else {
$codePrinter->output('zephir_update_property_zval(' . $symbolVariable->getName() . ', Z_STRVAL_P(' . $propertyVariableName->getName() . '), Z_STRLEN_P(' . $propertyVariableName->getName() . '), ZEPHIR_GLOBAL(global_null) TSRMLS_CC);');
}
break;
case 'int':
case 'long':
$tempVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext);
$codePrinter->output('ZVAL_LONG(' . $tempVariable->getName() . ', ' . $resolvedExpr->getBooleanCode() . ');');
if ($variable == 'this') {
$codePrinter->output('zephir_update_property_this(this_ptr, Z_STRVAL_P(' . $propertyVariableName->getName() . '), Z_STRLEN_P(' . $propertyVariableName->getName() . '), ' . $tempVariable->getName() . ' TSRMLS_CC);');
} else {
$codePrinter->output('zephir_update_property_zval(' . $symbolVariable->getName() . ', Z_STRVAL_P(' . $propertyVariableName->getName() . '), Z_STRLEN_P(' . $propertyVariableName->getName() . '), ' . $tempVariable->getName() . ' TSRMLS_CC);');
}
break;
case 'string':
$tempVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext);
$codePrinter->output('ZVAL_STRING(' . $tempVariable->getName() . ', "' . $resolvedExpr->getCode() . '", 1);');
if ($variable == 'this') {
$codePrinter->output('zephir_update_property_this(this_ptr, Z_STRVAL_P(' . $propertyVariableName->getName() . '), Z_STRLEN_P(' . $propertyVariableName->getName() . '), ' . $tempVariable->getName() . ' TSRMLS_CC);');
} else {
$codePrinter->output('zephir_update_property_zval(' . $symbolVariable->getName() . ', Z_STRVAL_P(' . $propertyVariableName->getName() . '), Z_STRLEN_P(' . $propertyVariableName->getName() . '), ' . $tempVariable->getName() . ' TSRMLS_CC);');
}
break;
case 'bool':
if ($variable == 'this') {
if ($resolvedExpr->getBooleanCode() == '1') {
$codePrinter->output('zephir_update_property_this(this_ptr, Z_STRVAL_P(' . $propertyVariableName->getName() . '), Z_STRLEN_P(' . $propertyVariableName->getName() . '), ZEPHIR_GLOBAL(global_true) TSRMLS_CC);');
} else {
$codePrinter->output('zephir_update_property_this(this_ptr, Z_STRVAL_P(' . $propertyVariableName->getName() . '), Z_STRLEN_P(' . $propertyVariableName->getName() . '), ZEPHIR_GLOBAL(global_false) TSRMLS_CC);');
}
} else {
if ($resolvedExpr->getBooleanCode() == '1') {
$codePrinter->output('zephir_update_property_zval(' . $symbolVariable->getName() . ', Z_STRVAL_P(' . $propertyVariableName->getName() . '), Z_STRLEN_P(' . $propertyVariableName->getName() . '), ZEPHIR_GLOBAL(global_true) TSRMLS_CC);');
} else {
$codePrinter->output('zephir_update_property_zval(' . $symbolVariable->getName() . ', Z_STRVAL_P(' . $propertyVariableName->getName() . '), Z_STRLEN_P(' . $propertyVariableName->getName() . '), ZEPHIR_GLOBAL(global_false) TSRMLS_CC);');
}
}
break;
case 'empty-array':
$tempVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext);
$codePrinter->output('array_init(' . $tempVariable->getName() . ');');
if ($variable == 'this') {
$codePrinter->output('zephir_update_property_this(this_ptr, Z_STRVAL_P(' . $propertyVariableName->getName() . '), Z_STRLEN_P(' . $propertyVariableName->getName() . '), ' . $tempVariable->getName() . ' TSRMLS_CC);');
} else {
$codePrinter->output('zephir_update_property_zval(' . $symbolVariable->getName() . ', Z_STRVAL_P(' . $propertyVariableName->getName() . '), Z_STRLEN_P(' . $propertyVariableName->getName() . '), ' . $tempVariable->getName() . ' TSRMLS_CC);');
}
break;
case 'variable':
$variableVariable = $compilationContext->symbolTable->getVariableForRead($resolvedExpr->getCode(), $compilationContext, $statement);
switch ($variableVariable->getType()) {
case 'int':
case 'uint':
case 'long':
case 'ulong':
case 'char':
case 'uchar':
//.........这里部分代码省略.........
示例11: assign
/**
* Compiles x->y[z] = foo
*
* @param string $variable
* @param ZephirVariable $symbolVariable
* @param CompiledExpression $resolvedExpr
* @param CompilationContext $compilationContext,
* @param array $statement
*/
public function assign($variable, ZephirVariable $symbolVariable, CompiledExpression $resolvedExpr, CompilationContext $compilationContext, $statement)
{
if (!$symbolVariable->isInitialized()) {
throw new CompilerException("Cannot mutate variable '" . $variable . "' because it is not initialized", $statement);
}
if (!$symbolVariable->isVariable()) {
throw new CompilerException("Attempt to use variable type: " . $symbolVariable->getType() . " as object", $statement);
}
/**
* Update the property according to the number of array-offsets
*/
if (count($statement['index-expr']) == 1) {
$this->_assignPropertyArraySingleIndex($variable, $symbolVariable, $resolvedExpr, $compilationContext, $statement);
} else {
$this->_assignPropertyArrayMultipleIndex($variable, $symbolVariable, $resolvedExpr, $compilationContext, $statement);
}
}
示例12: assign
/**
* Compiles foo = {expr}
* Changes the value of a mutable variable
*
* @param $variable
* @param Variable $symbolVariable
* @param CompiledExpression $resolvedExpr
* @param ReadDetector $readDetector
* @param CompilationContext $compilationContext
* @param $statement
* @throws CompilerException
*/
public function assign($variable, ZephirVariable $symbolVariable, CompiledExpression $resolvedExpr, ReadDetector $readDetector, CompilationContext $compilationContext, $statement)
{
if ($symbolVariable->isReadOnly()) {
throw new CompilerException("Cannot mutate variable '" . $variable . "' because it is read only", $statement);
}
$codePrinter = $compilationContext->codePrinter;
/**
* Only initialize variables if it's direct assignment
*/
if ($statement['operator'] == 'assign') {
$symbolVariable->setIsInitialized(true, $compilationContext, $statement);
} else {
if (!$symbolVariable->isInitialized()) {
throw new CompilerException("Cannot mutate variable '" . $variable . "' because it is not initialized", $statement);
}
}
/**
* Set the assigned value to the variable as a CompiledExpression
* We could use this expression for further analysis
*/
$symbolVariable->setPossibleValue($resolvedExpr, $compilationContext);
$type = $symbolVariable->getType();
switch ($type) {
case 'int':
case 'uint':
case 'long':
case 'ulong':
case 'char':
case 'uchar':
switch ($resolvedExpr->getType()) {
case 'null':
switch ($statement['operator']) {
case 'assign':
$codePrinter->output($variable . ' = 0;');
break;
case 'add-assign':
$codePrinter->output($variable . ' += 0;');
break;
case 'sub-assign':
$codePrinter->output($variable . ' -= 0;');
break;
case 'mul-assign':
$codePrinter->output($variable . ' *= 0;');
break;
default:
throw new CompilerException("Operator '" . $statement['operator'] . "' is not supported for variable type: int", $statement);
}
break;
case 'int':
case 'uint':
case 'long':
case 'ulong':
switch ($statement['operator']) {
case 'assign':
$codePrinter->output($variable . ' = ' . $resolvedExpr->getCode() . ';');
break;
case 'add-assign':
$codePrinter->output($variable . ' += ' . $resolvedExpr->getCode() . ';');
break;
case 'sub-assign':
$codePrinter->output($variable . ' -= ' . $resolvedExpr->getCode() . ';');
break;
case 'mul-assign':
$codePrinter->output($variable . ' *= ' . $resolvedExpr->getCode() . ';');
break;
case 'div-assign':
$codePrinter->output($variable . ' /= ' . $resolvedExpr->getCode() . ';');
break;
case 'mod-assign':
$codePrinter->output($variable . ' %= ' . $resolvedExpr->getCode() . ';');
break;
default:
throw new CompilerException("Operator '" . $statement['operator'] . "' is not supported for variable type: int", $statement);
}
break;
case 'char':
case 'uchar':
switch ($statement['operator']) {
case 'assign':
$codePrinter->output($variable . ' = \'' . $resolvedExpr->getCode() . '\';');
break;
case 'add-assign':
$codePrinter->output($variable . ' += \'' . $resolvedExpr->getCode() . '\';');
break;
case 'sub-assign':
$codePrinter->output($variable . ' -= \'' . $resolvedExpr->getCode() . '\';');
break;
case 'mul-assign':
//.........这里部分代码省略.........
示例13: assign
/**
* Compiles foo[] = {expr}
*
* @param $variable
* @param ZephirVariable $symbolVariable
* @param CompiledExpression $resolvedExpr
* @param CompilationContext $compilationContext
* @param $statement
* @throws CompilerException
*/
public function assign($variable, ZephirVariable $symbolVariable, CompiledExpression $resolvedExpr, CompilationContext $compilationContext, $statement)
{
if (!$symbolVariable->isInitialized()) {
throw new CompilerException("Cannot mutate variable '" . $variable . "' because it is not initialized", $statement);
}
if ($symbolVariable->isReadOnly()) {
throw new CompilerException("Cannot mutate variable '" . $variable . "' because it is read only", $statement);
}
if ($symbolVariable->isLocalOnly()) {
throw new CompilerException("Cannot mutate variable '" . $variable . "' because it is local only", $statement);
}
if ($symbolVariable->getType() != 'variable') {
throw new CompilerException("Cannot use variable type: '" . $symbolVariable->getType() . "' as array", $statement);
}
if ($symbolVariable->hasDifferentDynamicType(array('undefined', 'array'))) {
$compilationContext->logger->warning('Possible attempt to append elements on a non-array dynamic variable', 'non-array-append', $statement);
}
$codePrinter = $compilationContext->codePrinter;
$compilationContext->headersManager->add('kernel/array');
$type = $symbolVariable->getType();
switch ($type) {
case 'variable':
switch ($resolvedExpr->getType()) {
case 'null':
$codePrinter->output('zephir_array_append(&' . $variable . ', ZEPHIR_GLOBAL(global_null), PH_SEPARATE, "' . Compiler::getShortUserPath($statement['file']) . '", ' . $statement['line'] . ');');
break;
case 'int':
case 'uint':
case 'long':
$symbolVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext, $statement);
$codePrinter->output('ZVAL_LONG(' . $symbolVariable->getName() . ', ' . $resolvedExpr->getCode() . ');');
$codePrinter->output('zephir_array_append(&' . $variable . ', ' . $symbolVariable->getName() . ', PH_SEPARATE, "' . Compiler::getShortUserPath($statement['file']) . '", ' . $statement['line'] . ');');
$symbolVariable->setIdle(true);
break;
case 'double':
$symbolVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext, $statement);
$codePrinter->output('ZVAL_DOUBLE(' . $symbolVariable->getName() . ', ' . $resolvedExpr->getCode() . ');');
$codePrinter->output('zephir_array_append(&' . $variable . ', ' . $symbolVariable->getName() . ', PH_SEPARATE, "' . Compiler::getShortUserPath($statement['file']) . '", ' . $statement['line'] . ');');
$symbolVariable->setIdle(true);
break;
case 'bool':
$symbolVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext, $statement);
$codePrinter->output('ZVAL_BOOL(' . $symbolVariable->getName() . ', ' . $resolvedExpr->getBooleanCode() . ');');
$codePrinter->output('zephir_array_append(&' . $variable . ', ' . $symbolVariable->getName() . ', PH_SEPARATE, "' . Compiler::getShortUserPath($statement['file']) . '", ' . $statement['line'] . ');');
$symbolVariable->setIdle(true);
break;
case 'ulong':
case 'string':
$symbolVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext, $statement);
$codePrinter->output('ZVAL_STRING(' . $symbolVariable->getName() . ', "' . Utils::addSlashes($resolvedExpr->getCode(), true) . '", 1);');
$codePrinter->output('zephir_array_append(&' . $variable . ', ' . $symbolVariable->getName() . ', PH_SEPARATE, "' . Compiler::getShortUserPath($statement['file']) . '", ' . $statement['line'] . ');');
$symbolVariable->setIdle(true);
break;
case 'array':
$exprVariable = $compilationContext->symbolTable->getVariableForRead($resolvedExpr->getCode(), $compilationContext, $statement);
$codePrinter->output('zephir_array_append(&' . $variable . ', ' . $exprVariable->getName() . ', PH_SEPARATE, "' . Compiler::getShortUserPath($statement['file']) . '", ' . $statement['line'] . ');');
break;
case 'variable':
$exprVariable = $compilationContext->symbolTable->getVariableForRead($resolvedExpr->getCode(), $compilationContext, $statement);
switch ($exprVariable->getType()) {
case 'int':
case 'uint':
case 'long':
$symbolVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext, $statement);
$codePrinter->output('ZVAL_LONG(' . $symbolVariable->getName() . ', ' . $exprVariable->getName() . ');');
$codePrinter->output('zephir_array_append(&' . $variable . ', ' . $symbolVariable->getName() . ', PH_SEPARATE, "' . Compiler::getShortUserPath($statement['file']) . '", ' . $statement['line'] . ');');
$symbolVariable->setIdle(true);
break;
case 'double':
$symbolVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext, $statement);
$codePrinter->output('ZVAL_DOUBLE(' . $symbolVariable->getName() . ', ' . $exprVariable->getName() . ');');
$codePrinter->output('zephir_array_append(&' . $variable . ', ' . $symbolVariable->getName() . ', PH_SEPARATE, "' . Compiler::getShortUserPath($statement['file']) . '", ' . $statement['line'] . ');');
$symbolVariable->setIdle(true);
break;
case 'bool':
$symbolVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext, $statement);
$codePrinter->output('ZVAL_BOOL(' . $symbolVariable->getName() . ', ' . $exprVariable->getName() . ');');
$codePrinter->output('zephir_array_append(&' . $variable . ', ' . $symbolVariable->getName() . ', PH_SEPARATE, "' . Compiler::getShortUserPath($statement['file']) . '", ' . $statement['line'] . ');');
$symbolVariable->setIdle(true);
break;
case 'variable':
case 'string':
case 'array':
$codePrinter->output('zephir_array_append(&' . $variable . ', ' . $exprVariable->getName() . ', PH_SEPARATE, "' . Compiler::getShortUserPath($statement['file']) . '", ' . $statement['line'] . ');');
break;
default:
throw new CompilerException("Unknown type " . $exprVariable->getType(), $statement);
}
break;
default:
//.........这里部分代码省略.........
示例14: assign
/**
* Compiles foo->{"x"} = {expr}
*
* @param string $variable
* @param ZephirVariable $symbolVariable
* @param CompiledExpression $resolvedExpr
* @param CompilationContext $compilationContext
* @param array $statement
* @throws CompilerException
* @throws \Exception
*/
public function assign($variable, ZephirVariable $symbolVariable, CompiledExpression $resolvedExpr, CompilationContext $compilationContext, array $statement)
{
if (!$symbolVariable->isInitialized()) {
throw new CompilerException("Cannot mutate variable '" . $variable . "' because it is not initialized", $statement);
}
if ($symbolVariable->getType() != 'variable') {
throw new CompilerException("Variable type '" . $symbolVariable->getType() . "' cannot be used as object", $statement);
}
$propertyName = $statement['property'];
if (!is_string($propertyName)) {
throw new CompilerException("Expected string to update object property, " . gettype($propertyName) . " received", $statement);
}
if (!$symbolVariable->isInitialized()) {
throw new CompilerException("Cannot mutate static property '" . $compilationContext->classDefinition->getCompleteName() . "::" . $propertyName . "' because it is not initialized", $statement);
}
if ($symbolVariable->getType() != 'variable') {
throw new CompilerException("Cannot use variable type: " . $symbolVariable->getType() . " as an object", $statement);
}
if ($symbolVariable->hasAnyDynamicType('unknown')) {
throw new CompilerException("Cannot use non-initialized variable as an object", $statement);
}
/**
* Trying to use a non-object dynamic variable as object
*/
if ($symbolVariable->hasDifferentDynamicType(array('undefined', 'object', 'null'))) {
$compilationContext->logger->warning('Possible attempt to update property on non-object dynamic property', 'non-valid-objectupdate', $statement);
}
$codePrinter = $compilationContext->codePrinter;
$compilationContext->headersManager->add('kernel/object');
switch ($resolvedExpr->getType()) {
case 'null':
$compilationContext->backend->updateProperty($symbolVariable, $propertyName, 'null', $compilationContext);
break;
case 'int':
case 'long':
$tempVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext);
$compilationContext->backend->assignLong($tempVariable, $resolvedExpr->getCode(), $compilationContext);
$compilationContext->backend->updateProperty($symbolVariable, $propertyName, $tempVariable, $compilationContext);
break;
case 'string':
$tempVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext);
$compilationContext->backend->assignString($tempVariable, $resolvedExpr->getCode(), $compilationContext);
$compilationContext->backend->updateProperty($symbolVariable, $propertyName, $tempVariable, $compilationContext);
break;
case 'bool':
if ($resolvedExpr->getBooleanCode() == '1') {
$value = 'true';
} else {
if ($resolvedExpr->getBooleanCode() == '0') {
$value = 'false';
} else {
throw new \Exception("?");
}
}
$compilationContext->backend->updateProperty($symbolVariable, $propertyName, $value, $compilationContext);
break;
case 'empty-array':
$tempVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext);
$compilationContext->backend->initArray($tempVariable, $compilationContext);
$compilationContext->backend->updateProperty($symbolVariable, $propertyName, $tempVariable, $compilationContext);
break;
case 'array':
$variableVariable = $compilationContext->symbolTable->getVariableForRead($resolvedExpr->getCode(), $compilationContext, $statement);
$compilationContext->backend->updateProperty($symbolVariable, $propertyName, $variableVariable, $compilationContext);
break;
case 'variable':
$variableVariable = $compilationContext->symbolTable->getVariableForRead($resolvedExpr->getCode(), $compilationContext, $statement);
switch ($variableVariable->getType()) {
case 'int':
case 'uint':
case 'long':
case 'ulong':
case 'char':
case 'uchar':
$tempVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext);
$compilationContext->backend->assignLong($tempVariable, $variableVariable, $compilationContext);
$compilationContext->backend->updateProperty($symbolVariable, $propertyName, $tempVariable, $compilationContext);
break;
case 'bool':
$tempVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext);
$compilationContext->backend->assignBool($tempVariable, $variableVariable, $compilationContext);
$compilationContext->backend->updateProperty($symbolVariable, $propertyName, $tempVariable, $compilationContext);
break;
case 'string':
case 'variable':
case 'array':
$compilationContext->backend->updateProperty($symbolVariable, $propertyName, $resolvedExpr, $compilationContext);
if ($symbolVariable->isTemporal()) {
$symbolVariable->setIdle(true);
//.........这里部分代码省略.........
示例15: get
/**
* Retrieves/Creates a function cache for a method call
*
* @param CompilationContext $compilationContext
* @param ClassMethod $method
* @param Variable $caller
*/
public function get(CompilationContext $compilationContext, $methodName, Variable $caller)
{
$compiler = $compilationContext->compiler;
$numberPoly = 0;
if ($caller->getRealName() == 'this') {
$classDefinition = $compilationContext->classDefinition;
if ($classDefinition->hasMethod($methodName)) {
$numberPoly++;
$method = $classDefinition->getMethod($methodName);
}
} else {
$classTypes = $caller->getClassTypes();
foreach ($classTypes as $classType) {
if ($compiler->isClass($classType) || $compiler->isInterface($classType) || $compiler->isBundledClass($classType) || $compiler->isBundledInterface($classType)) {
if ($compiler->isInterface($classType)) {
continue;
}
if ($compiler->isClass($classType)) {
$classDefinition = $compiler->getClassDefinition($classType);
} else {
$classDefinition = $compiler->getInternalClassDefinition($classType);
}
if (!$classDefinition) {
continue;
}
if ($classDefinition->hasMethod($methodName) && !$classDefinition->isInterface()) {
$numberPoly++;
$method = $classDefinition->getMethod($methodName);
}
}
}
}
if (!$numberPoly) {
// Try to generate a cache based on the fact the variable is not modified within the loop block
if ($compilationContext->insideCycle && !$caller->isTemporal()) {
if (count($compilationContext->cycleBlocks) && $caller->getType() == 'variable') {
$currentBlock = $compilationContext->cycleBlocks[count($compilationContext->cycleBlocks) - 1];
if ($currentBlock->getMutateGatherer(true)->getNumberOfMutations($caller->getName()) == 0) {
$functionCache = $compilationContext->symbolTable->getTempVariableForWrite('zephir_fcall_cache_entry', $compilationContext);
$functionCache->setMustInitNull(true);
$functionCache->setReusable(false);
return '&' . $functionCache->getName() . ', 0';
}
}
}
return 'NULL, 0';
}
if (!$method instanceof \ReflectionMethod) {
if ($method->getClassDefinition()->isExternal()) {
return 'NULL, 0';
}
$completeName = $method->getClassDefinition()->getCompleteName();
if (isset($this->cache[$completeName][$method->getName()])) {
return $this->cache[$completeName][$method->getName()] . ', ' . SlotsCache::getExistingMethodSlot($method);
}
$gatherer = $this->gatherer;
if (is_object($gatherer)) {
$number = $gatherer->getNumberOfMethodCalls($method->getClassDefinition()->getCompleteName(), $method->getName());
} else {
$number = 0;
}
$staticCacheable = !$method->getClassDefinition()->isInterface() && ($compilationContext->currentMethod == $method || $method->getClassDefinition()->isFinal() || $method->isFinal() || $method->isPrivate());
if ($number > 1 || $compilationContext->insideCycle) {
$cacheable = true;
} else {
$cacheable = false;
}
} else {
$staticCacheable = false;
$cacheable = false;
}
// Recursive methods require warm-up
if ($compilationContext->currentMethod == $method) {
if (!$compilationContext->methodWarmUp) {
$compilationContext->methodWarmUp = new MethodCallWarmUp();
}
}
$associatedClass = false;
if ($caller->getName() != 'this_ptr') {
$associatedClass = $caller->getAssociatedClass();
if ($this->isClassCacheable($associatedClass)) {
$staticCacheable = true;
}
}
if ($staticCacheable) {
$cacheSlot = SlotsCache::getMethodSlot($method);
} else {
$cacheSlot = '0';
}
if ($cacheable) {
$functionCacheVar = $compilationContext->symbolTable->getTempVariableForWrite('zephir_fcall_cache_entry', $compilationContext);
$functionCacheVar->setMustInitNull(true);
$functionCacheVar->setReusable(false);
//.........这里部分代码省略.........