diff --git a/examples/fib.php b/examples/fib.php index 833da104..32a7ca57 100644 --- a/examples/fib.php +++ b/examples/fib.php @@ -12,6 +12,16 @@ function main() { global $argv; $n = $argv[2]; + var_dump($argv, $n); + + if ($n > 100) { + echo "Too big number\n"; + exit(1); + } elseif ($n < 1) { + echo "Too small number\n"; + exit(1); + } + $begin = microtime(true); echo fib($n) . "\n"; echo "Time: " . (microtime(true) - $begin) . "\n"; diff --git a/src/Php/Translator.php b/src/Php/Translator.php index addda55b..a7692696 100644 --- a/src/Php/Translator.php +++ b/src/Php/Translator.php @@ -361,6 +361,8 @@ class Translator extends \PhpAot\Core\Translator return $this->parseUnaryMinus($expr); case 'InterpolatedStringPart': return $this->parseInterpolatedStringPart($expr); + case 'Expr_Exit': + return $this->parseExit($expr); default: debug($expr); } @@ -399,12 +401,7 @@ class Translator extends \PhpAot\Core\Translator { $type = $this->detectType($v->expr); $expr = $this->parseExpr($v->expr); - if ($this->returnType == self::TYPE_INT and $type == self::TYPE_VAR) { - return 'return (' . $expr . ').toInt()'; - } elseif ($this->returnType == self::TYPE_FLOAT and $type == self::TYPE_VAR) { - return 'return (' . $expr . ').toFloat()'; - } - return 'return ' . $expr; + return 'return ' . $this->convertExprType($expr, $this->returnType, $type); } private function parseBinaryOpMul(mixed $expr): string @@ -1063,15 +1060,25 @@ class Translator extends \PhpAot\Core\Translator { $expr = $this->parseArg($arg); $type = $this->detectType($arg->value); - if ($argInfo->type === self::TYPE_INT && $type !== self::TYPE_INT) { + return $this->convertExprType($expr, $argInfo->type, $type); + } + + private function convertExprType(string $expr, $leftType, $rightType): string + { + if ($leftType === self::TYPE_INT && $rightType !== self::TYPE_INT) { return '(' . $expr . ').toInt()'; } - if ($argInfo->type === self::TYPE_FLOAT && $type !== self::TYPE_FLOAT) { + if ($leftType === self::TYPE_FLOAT && $rightType !== self::TYPE_FLOAT) { return '(' . $expr . ').toFloat()'; } - if ($argInfo->type === self::TYPE_BOOL && $type !== self::TYPE_BOOL) { + if ($leftType === self::TYPE_BOOL && $rightType !== self::TYPE_BOOL) { return '(' . $expr . ').toBool()'; } return $expr; } + + private function parseExit(Node $node): string + { + return 'php::exit(' . $this->parseIdentifier($node->expr) . ')'; + } }