Optimize discarded trailing return values

pull/20/head
韩天峰 1 month ago
parent 5f735e2fc0
commit 8be62dafb3
  1. 8
      phpunit/code/multi-return-tuple.php
  2. 8
      phpunit/src/MultiReturnTest.php
  3. 8
      src/Parser/AssignOpTrait.php
  4. 18
      tests/compiler/array/multi-return-discard-tail.phpt

@ -10,6 +10,14 @@ function phpunit_multi_consumer(): void
{
[$first, $second] = phpunit_multi_values();
$array = phpunit_multi_values();
[$partialFirst, $partialSecond] = phpunit_multi_three_values();
[$overflowFirst, $overflowSecond, $overflowThird] = phpunit_multi_values();
}
function phpunit_multi_three_values(): array
{
return [1, 2, 3];
}
function phpunit_multi_side_effect(): array

@ -32,6 +32,14 @@ final class MultiReturnTest extends TestCase
'array = php_phpunit_multi_values()',
$code,
);
$this->assertStringContainsString(
'std::tie(partialFirst, partialSecond, std::ignore) = typephp::detail::php_phpunit_multi_three_values()',
$code,
);
$this->assertStringNotContainsString(
'std::tie(overflowFirst, overflowSecond, overflowThird)',
$code,
);
$this->assertStringNotContainsString(
'typephp::detail::php_phpunit_multi_side_effect',
$code,

@ -123,7 +123,7 @@ trait AssignOpTrait
}
$functionDef = $this->getFunction($nativeFunc);
if (!$functionDef->hasMultiReturn()
|| $functionDef->multiReturnCount !== count($left->items)
|| $functionDef->multiReturnCount < count($left->items)
|| $this->shouldUseDynamicCallForNativeArgs($nativeFunc, $right->args)) {
return null;
}
@ -146,8 +146,12 @@ trait AssignOpTrait
$this->addLocalVar($name, Type::VAR);
}
}
$tieItems = array_merge(
$variables,
array_fill(0, $functionDef->multiReturnCount - count($variables), 'std::ignore'),
);
$right->setAttribute(self::ATTR_MULTI_RETURN_IMPL, true);
return 'std::tie(' . implode(', ', $variables) . ') = ' . $this->parseFuncCall($right);
return 'std::tie(' . implode(', ', $tieItems) . ') = ' . $this->parseFuncCall($right);
}
protected function parseAssignToList(Expr $left, Expr $right): string

@ -0,0 +1,18 @@
--TEST--
Tuple multi-return fast path can discard trailing values
--FILE--
<?php
function multi_return_three_values(): array
{
return [1, 2, 3];
}
function main(): void
{
[$first, $second] = multi_return_three_values();
var_dump($first, $second);
}
?>
--EXPECT--
int(1)
int(2)
Loading…
Cancel
Save