private function doDoubleAssignment($codePrinter, $resolvedExpr, $symbolVariable, $variable, $statement, $compilationContext)
{
switch ($resolvedExpr->getType()) {
case 'null':
switch ($statement['operator']) {
case 'assign':
$codePrinter->output($variable . ' = 0.0;');
break;
case 'add-assign':
$codePrinter->output($variable . ' += 0.0;');
break;
case 'sub-assign':
$codePrinter->output($variable . ' -= 0.0;');
break;
case 'mul-assign':
$codePrinter->output($variable . ' *= 0.0;');
break;
default:
throw new CompilerException("Operator '" . $statement['operator'] . "' is not supported for variable type: double", $statement);
}
break;
case 'int':
case 'uint':
case 'long':
case 'ulong':
switch ($statement['operator']) {
case 'assign':
$codePrinter->output($variable . ' = (double) (' . $resolvedExpr->getCode() . ');');
break;
case 'add-assign':
$codePrinter->output($variable . ' += (double) (' . $resolvedExpr->getCode() . ');');
break;
case 'sub-assign':
$codePrinter->output($variable . ' -= (double) (' . $resolvedExpr->getCode() . ');');
break;
case 'mul-assign':
$codePrinter->output($variable . ' *= (double) (' . $resolvedExpr->getCode() . ');');
break;
default:
throw new CompilerException("Operator '" . $statement['operator'] . "' is not supported for variable type: double", $statement);
}
break;
case 'double':
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: double", $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;
case 'mul-assign':
$codePrinter->output($variable . ' *= ' . $resolvedExpr->getBooleanCode() . ';');
break;
default:
throw new CompilerException("Operator '" . $statement['operator'] . "' is not supported for variable type: double", $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':
switch ($statement['operator']) {
case 'assign':
$codePrinter->output($variable . ' = (double) ' . $itemVariable->getName() . ';');
break;
case 'add-assign':
$codePrinter->output($variable . ' += (double) ' . $itemVariable->getName() . ';');
break;
case 'sub-assign':
$codePrinter->output($variable . ' -= (double) ' . $itemVariable->getName() . ';');
break;
case 'mul-assign':
$codePrinter->output($variable . ' *= (double) ' . $itemVariable->getName() . ';');
break;
default:
throw new CompilerException("Operator '" . $statement['operator'] . "' is not supported for variable type: double", $statement);
}
break;
case 'double':
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: double", $statement);
}
break;
case 'variable':
$compilationContext->headersManager->add('kernel/operators');
$itemVariable = $compilationContext->backend->getVariableCode($itemVariable);
switch ($statement['operator']) {
case 'assign':
$codePrinter->output($variable . ' = zephir_get_numberval(' . $itemVariable . ');');
break;
case 'add-assign':
$codePrinter->output($variable . ' += zephir_get_numberval(' . $itemVariable . ');');
break;
case 'sub-assign':
$codePrinter->output($variable . ' -= zephir_get_numberval(' . $itemVariable . ');');
break;
case 'mul-assign':
$codePrinter->output($variable . ' *= zephir_get_numberval(' . $itemVariable . ');');
break;
default:
throw new CompilerException("Operator '" . $statement['operator'] . "' is not supported for variable type: double", $statement);
}
break;
default:
throw new CompilerException("Unknown type: " . $itemVariable->getType(), $statement);
}
break;
default:
throw new CompilerException("Unknown type " . $resolvedExpr->getType(), $statement);
}
}