Zephir\Statements\Let\Variable::doNumericAssignment PHP Method

doNumericAssignment() private method

private doNumericAssignment ( $codePrinter, $resolvedExpr, $symbolVariable, $variable, $statement, $compilationContext )
    private function doNumericAssignment($codePrinter, $resolvedExpr, $symbolVariable, $variable, $statement, $compilationContext)
    {
        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: " . $resolvedExpr->getType(), $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: " . $resolvedExpr->getType(), $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':
                        $codePrinter->output($variable . ' *= \'' . $resolvedExpr->getCode() . '\';');
                        break;
                    default:
                        throw new CompilerException("Operator '" . $statement['operator'] . "' is not supported for variable type: " . $resolvedExpr->getType(), $statement);
                }
                break;
            case 'double':
                switch ($statement['operator']) {
                    case 'assign':
                        $codePrinter->output($variable . ' = (long) (' . $resolvedExpr->getCode() . ');');
                        break;
                    case 'add-assign':
                        $codePrinter->output($variable . ' += (long) (' . $resolvedExpr->getCode() . ');');
                        break;
                    case 'sub-assign':
                        $codePrinter->output($variable . ' -= (long) (' . $resolvedExpr->getCode() . ');');
                        break;
                    case 'mul-assign':
                        $codePrinter->output($variable . ' *= (long) (' . $resolvedExpr->getCode() . ');');
                        break;
                    default:
                        throw new CompilerException("Operator '" . $statement['operator'] . "' is not supported for variable type: " . $resolvedExpr->getType(), $statement);
                }
                break;
            case 'bool':
                switch ($statement['operator']) {
                    case 'assign':
                        $codePrinter->output($variable . ' = ' . $resolvedExpr->getBooleanCode() . ';');
                        break;
                    case 'add-assign':
                        $codePrinter->output($variable . ' += ' . $resolvedExpr->getBooleanCode() . ';');
                        break;
                    case 'sub-assign':
                        $codePrinter->output($variable . ' -= ' . $resolvedExpr->getBooleanCode() . ';');
                        break;
                    default:
                        throw new CompilerException("Operator '" . $statement['operator'] . "' is not supported for variable type: " . $resolvedExpr->getType(), $statement);
                }
                break;
            case 'variable':
                $itemVariable = $compilationContext->symbolTable->getVariableForRead($resolvedExpr->getCode(), $compilationContext, $statement);
                switch ($itemVariable->getType()) {
                    case 'int':
                    case 'uint':
                    case 'long':
                    case 'ulong':
                    case 'bool':
                    case 'char':
                    case 'uchar':
                        switch ($statement['operator']) {
                            case 'assign':
                                $codePrinter->output($variable . ' = ' . $itemVariable->getName() . ';');
                                break;
                            case 'add-assign':
                                $codePrinter->output($variable . ' += ' . $itemVariable->getName() . ';');
                                break;
                            case 'sub-assign':
                                $codePrinter->output($variable . ' -= ' . $itemVariable->getName() . ';');
                                break;
                            case 'mul-assign':
                                $codePrinter->output($variable . ' *= ' . $itemVariable->getName() . ';');
                                break;
                            default:
                                throw new CompilerException("Operator '" . $statement['operator'] . "' is not supported for variable type: int", $statement);
                        }
                        break;
                    case 'double':
                        switch ($statement['operator']) {
                            case 'assign':
                                $codePrinter->output($variable . ' = (long) ' . $itemVariable->getName() . ';');
                                break;
                            case 'add-assign':
                                $codePrinter->output($variable . ' += (long) ' . $itemVariable->getName() . ';');
                                break;
                            case 'sub-assign':
                                $codePrinter->output($variable . ' -= (long) ' . $itemVariable->getName() . ';');
                                break;
                            case 'mul-assign':
                                $codePrinter->output($variable . ' *= (long) ' . $itemVariable->getName() . ';');
                                break;
                            default:
                                throw new CompilerException("Operator '" . $statement['operator'] . "' is not supported for variable type: int", $statement);
                        }
                        break;
                    case 'variable':
                        $compilationContext->headersManager->add('kernel/operators');
                        $exprVariable = $compilationContext->symbolTable->getVariableForWrite($resolvedExpr->resolve(null, $compilationContext), $compilationContext);
                        $exprVariableCode = $compilationContext->backend->getVariableCode($exprVariable);
                        switch ($statement['operator']) {
                            case 'assign':
                                $codePrinter->output($variable . ' = zephir_get_numberval(' . $exprVariableCode . ');');
                                break;
                            case 'add-assign':
                                $codePrinter->output($variable . ' += zephir_get_numberval(' . $exprVariableCode . ');');
                                break;
                            case 'sub-assign':
                                $codePrinter->output($variable . ' -= zephir_get_numberval(' . $exprVariableCode . ');');
                                break;
                            case 'mul-assign':
                                $codePrinter->output($variable . ' *= zephir_get_numberval(' . $exprVariableCode . ');');
                                break;
                            default:
                                throw new CompilerException("Operator '" . $statement['operator'] . "' is not supported for variable type: int", $statement);
                        }
                        break;
                    default:
                        throw new CompilerException("Unknown type: " . $itemVariable->getType(), $statement);
                }
                break;
            default:
                throw new CompilerException("Value type '" . $resolvedExpr->getType() . "' cannot be assigned to variable: int", $statement);
        }
    }