Merge branch '4.3' into 4.4

* 4.3:
  fix deps=low
  [VarExporter] fix support for PHP 7.4
  Use PHP 7.4 on deps=low
This commit is contained in:
Nicolas Grekas 2019-08-22 10:37:03 +02:00
commit 1981f06c88
33 changed files with 258 additions and 87 deletions

View File

@ -26,9 +26,10 @@ env:
matrix:
include:
- php: 7.1
- php: 7.2
env: deps=high
env: php_extra="7.2"
- php: 7.3
env: deps=high
- php: 7.4snapshot
env: deps=low
fast_finish: true
@ -78,6 +79,12 @@ before_install:
export COMPONENTS=$(find src/Symfony -mindepth 2 -type f -name phpunit.xml.dist -printf '%h\n')
find ~/.phpenv -name xdebug.ini -delete
if [[ $TRAVIS_PHP_VERSION = 7.4* && $deps ]]; then
export PHPUNIT_X="$PHPUNIT_X,issue-32995"
elif [[ $TRAVIS_PHP_VERSION = 7.4* ]]; then
export PHPUNIT_X="$PHPUNIT --group issue-32995"
fi
nanoseconds () {
local cmd="date"
local format="+%s%N"

View File

@ -37,12 +37,12 @@
"symfony/expression-language": "^3.4|^4.0|^5.0",
"symfony/validator": "^3.4.31|^4.3.4|^5.0",
"symfony/translation": "^3.4|^4.0|^5.0",
"doctrine/annotations": "~1.0",
"doctrine/annotations": "~1.7",
"doctrine/cache": "~1.6",
"doctrine/collections": "~1.0",
"doctrine/data-fixtures": "1.0.*",
"doctrine/dbal": "~2.4",
"doctrine/orm": "^2.4.5",
"doctrine/orm": "^2.6.3",
"doctrine/reflection": "~1.0"
},
"conflict": {

View File

@ -21,7 +21,7 @@
"twig/twig": "^1.41|^2.10"
},
"require-dev": {
"egulias/email-validator": "^2.0",
"egulias/email-validator": "^2.1.10",
"symfony/asset": "^3.4|^4.0|^5.0",
"symfony/dependency-injection": "^3.4|^4.0|^5.0",
"symfony/finder": "^3.4|^4.0|^5.0",

View File

@ -21,6 +21,8 @@ use Symfony\Component\Validator\ValidatorBuilder;
class ValidatorCacheWarmerTest extends TestCase
{
/**
* @group issue-32995
*
* @runInSeparateProcess https://github.com/symfony/symfony/issues/32995
*/
public function testWarmUp()

View File

@ -30,10 +30,11 @@
"symfony/routing": "^4.4|^5.0"
},
"require-dev": {
"doctrine/annotations": "~1.7",
"doctrine/cache": "~1.0",
"symfony/asset": "^3.4|^4.0|^5.0",
"symfony/browser-kit": "^4.3|^5.0",
"symfony/console": "^4.3|^5.0",
"symfony/console": "^4.3.4|^5.0",
"symfony/css-selector": "^3.4|^4.0|^5.0",
"symfony/dom-crawler": "^4.3|^5.0",
"symfony/polyfill-intl-icu": "~1.0",
@ -58,9 +59,8 @@
"symfony/yaml": "^3.4|^4.0|^5.0",
"symfony/property-info": "^3.4|^4.0|^5.0",
"symfony/web-link": "^4.4|^5.0",
"doctrine/annotations": "~1.0",
"phpdocumentor/reflection-docblock": "^3.0|^4.0",
"twig/twig": "~1.34|~2.4"
"twig/twig": "~1.41|~2.10"
},
"conflict": {
"phpdocumentor/reflection-docblock": "<3.0",

View File

@ -44,7 +44,7 @@
"symfony/yaml": "^3.4|^4.0|^5.0",
"symfony/expression-language": "^3.4|^4.0|^5.0",
"doctrine/doctrine-bundle": "~1.5",
"twig/twig": "~1.34|~2.4"
"twig/twig": "~1.41|~2.10"
},
"conflict": {
"symfony/browser-kit": "<4.2",

View File

@ -37,7 +37,7 @@
"symfony/yaml": "^3.4|^4.0|^5.0",
"symfony/framework-bundle": "^4.4|^5.0",
"symfony/web-link": "^3.4|^4.0|^5.0",
"doctrine/annotations": "~1.0",
"doctrine/annotations": "~1.7",
"doctrine/cache": "~1.0"
},
"conflict": {

View File

@ -254,6 +254,8 @@ abstract class AdapterTestCase extends CachePoolTest
}
/**
* @group issue-32995
*
* @runInSeparateProcess https://github.com/symfony/symfony/issues/32995
*/
public function testSavingObject()

View File

@ -76,6 +76,8 @@ EOF
}
/**
* @group issue-32995
*
* @runInSeparateProcess https://github.com/symfony/symfony/issues/32995
*/
public function testBadParentWithTimestamp()
@ -85,6 +87,8 @@ EOF
}
/**
* @group issue-32995
*
* @runInSeparateProcess https://github.com/symfony/symfony/issues/32995
*/
public function testBadParentWithNoTimestamp()

View File

@ -350,6 +350,8 @@ class AutowirePassTest extends TestCase
}
/**
* @group issue-32995
*
* @runInSeparateProcess https://github.com/symfony/symfony/issues/32995
*/
public function testParentClassNotFoundThrowsException()
@ -626,6 +628,8 @@ class AutowirePassTest extends TestCase
}
/**
* @group issue-32995
*
* @runInSeparateProcess https://github.com/symfony/symfony/issues/32995
*/
public function testIgnoreServiceWithClassNotExisting()
@ -831,6 +835,8 @@ class AutowirePassTest extends TestCase
}
/**
* @group issue-32995
*
* @runInSeparateProcess https://github.com/symfony/symfony/issues/32995
*/
public function testExceptionWhenAliasDoesNotExist()

View File

@ -62,6 +62,8 @@ class ResolveBindingsPassTest extends TestCase
}
/**
* @group issue-32995
*
* @runInSeparateProcess https://github.com/symfony/symfony/issues/32995
*/
public function testMissingParent()

View File

@ -1099,6 +1099,8 @@ class PhpDumperTest extends TestCase
}
/**
* @group issue-32995
*
* @runInSeparateProcess https://github.com/symfony/symfony/issues/32995
*/
public function testHotPathOptimizations()

View File

@ -107,6 +107,8 @@ class FileLoaderTest extends TestCase
}
/**
* @group issue-32995
*
* @runInSeparateProcess https://github.com/symfony/symfony/issues/32995
*/
public function testRegisterClassesWithExclude()
@ -139,6 +141,8 @@ class FileLoaderTest extends TestCase
}
/**
* @group issue-32995
*
* @runInSeparateProcess https://github.com/symfony/symfony/issues/32995
*/
public function testRegisterClassesWithExcludeAsArray()
@ -161,6 +165,8 @@ class FileLoaderTest extends TestCase
}
/**
* @group issue-32995
*
* @runInSeparateProcess https://github.com/symfony/symfony/issues/32995
*/
public function testNestedRegisterClasses()
@ -192,6 +198,8 @@ class FileLoaderTest extends TestCase
}
/**
* @group issue-32995
*
* @runInSeparateProcess https://github.com/symfony/symfony/issues/32995
*/
public function testMissingParentClass()

View File

@ -17,7 +17,7 @@
],
"require": {
"php": "^7.1.3",
"egulias/email-validator": "^2.0",
"egulias/email-validator": "^2.1.10",
"psr/log": "~1.0",
"symfony/event-dispatcher": "^4.3",
"symfony/mime": "^4.3.3|^5.0",

View File

@ -21,7 +21,7 @@
"symfony/polyfill-mbstring": "^1.0"
},
"require-dev": {
"egulias/email-validator": "^2.0",
"egulias/email-validator": "^2.1.10",
"symfony/dependency-injection": "^3.4|^4.1|^5.0"
},
"conflict": {

View File

@ -31,7 +31,7 @@
"symfony/cache": "^3.4|^4.0|^5.0",
"symfony/dependency-injection": "^3.4|^4.0|^5.0",
"phpdocumentor/reflection-docblock": "^3.0|^4.0",
"doctrine/annotations": "~1.0"
"doctrine/annotations": "~1.7"
},
"conflict": {
"phpdocumentor/reflection-docblock": "<3.0||>=3.2.0,<3.2.2",

View File

@ -35,11 +35,12 @@
"symfony/property-access": "^3.4|^4.0|^5.0",
"symfony/property-info": "^3.4|^4.0|^5.0",
"symfony/translation": "^4.2",
"doctrine/annotations": "~1.0",
"doctrine/annotations": "~1.7",
"doctrine/cache": "~1.0",
"egulias/email-validator": "^1.2.8|~2.0"
"egulias/email-validator": "^2.1.10"
},
"conflict": {
"doctrine/lexer": "<1.0.2",
"phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0",
"symfony/dependency-injection": "<3.4",
"symfony/http-kernel": "<3.4",

View File

@ -155,7 +155,7 @@ class Exporter
}
$sleep[$n] = false;
}
if (!\array_key_exists($name, $proto) || $proto[$name] !== $v) {
if (!\array_key_exists($name, $proto) || $proto[$name] !== $v || "\x00Error\x00trace" === $name || "\x00Exception\x00trace" === $name) {
$properties[$c][$n] = $v;
}
}
@ -291,7 +291,7 @@ class Exporter
continue;
}
if (!Registry::$instantiableWithoutConstructor[$class]) {
if (is_subclass_of($class, 'Serializable')) {
if (is_subclass_of($class, 'Serializable') && !method_exists($class, '__unserialize')) {
$serializables[$k] = 'C:'.\strlen($class).':"'.$class.'":0:{}';
} else {
$serializables[$k] = 'O:'.\strlen($class).':"'.$class.'":0:{}';

View File

@ -75,7 +75,7 @@ class Registry
} elseif (!$isClass || $reflector->isAbstract()) {
throw new NotInstantiableTypeException($class);
} elseif ($reflector->name !== $class) {
$reflector = self::$reflectors[$name = $reflector->name] ?? self::getClassReflector($name, $instantiableWithoutConstructor, $cloneable);
$reflector = self::$reflectors[$name = $reflector->name] ?? self::getClassReflector($name, false, $cloneable);
self::$cloneable[$class] = self::$cloneable[$name];
self::$instantiableWithoutConstructor[$class] = self::$instantiableWithoutConstructor[$name];
self::$prototypes[$class] = self::$prototypes[$name];
@ -86,7 +86,7 @@ class Registry
$proto = $reflector->newInstanceWithoutConstructor();
$instantiableWithoutConstructor = true;
} catch (\ReflectionException $e) {
$proto = $reflector->implementsInterface('Serializable') && (\PHP_VERSION_ID < 70400 || !method_exists($class, '__unserialize')) ? 'C:' : 'O:';
$proto = $reflector->implementsInterface('Serializable') && !method_exists($class, '__unserialize') ? 'C:' : 'O:';
if ('C:' === $proto && !$reflector->getMethod('unserialize')->isInternal()) {
$proto = null;
} elseif (false === $proto = @unserialize($proto.\strlen($class).':"'.$class.'":0:{}')) {

View File

@ -0,0 +1,22 @@
<?php
return \Symfony\Component\VarExporter\Internal\Hydrator::hydrate(
$o = [
clone (\Symfony\Component\VarExporter\Internal\Registry::$prototypes['ArrayIterator'] ?? \Symfony\Component\VarExporter\Internal\Registry::p('ArrayIterator')),
],
null,
[
'ArrayIterator' => [
"\0" => [
[
[
123,
],
1,
],
],
],
],
$o[0],
[]
);

View File

@ -5,18 +5,15 @@ return \Symfony\Component\VarExporter\Internal\Hydrator::hydrate(
clone (\Symfony\Component\VarExporter\Internal\Registry::$prototypes['ArrayIterator'] ?? \Symfony\Component\VarExporter\Internal\Registry::p('ArrayIterator')),
],
null,
[
'ArrayIterator' => [
"\0" => [
[
[
123,
],
1,
],
],
],
],
[],
$o[0],
[]
[
[
1,
[
123,
],
[],
],
]
);

View File

@ -0,0 +1,22 @@
<?php
return \Symfony\Component\VarExporter\Internal\Hydrator::hydrate(
$o = [
clone (\Symfony\Component\VarExporter\Internal\Registry::$prototypes['Symfony\\Component\\VarExporter\\Tests\\MyArrayObject'] ?? \Symfony\Component\VarExporter\Internal\Registry::p('Symfony\\Component\\VarExporter\\Tests\\MyArrayObject')),
],
null,
[
'ArrayObject' => [
"\0" => [
[
[
234,
],
1,
],
],
],
],
$o[0],
[]
);

View File

@ -5,18 +5,17 @@ return \Symfony\Component\VarExporter\Internal\Hydrator::hydrate(
clone (\Symfony\Component\VarExporter\Internal\Registry::$prototypes['Symfony\\Component\\VarExporter\\Tests\\MyArrayObject'] ?? \Symfony\Component\VarExporter\Internal\Registry::p('Symfony\\Component\\VarExporter\\Tests\\MyArrayObject')),
],
null,
[],
$o[0],
[
'ArrayObject' => [
"\0" => [
[
[
234,
],
1,
],
[
1,
[
234,
],
[
"\0".'Symfony\\Component\\VarExporter\\Tests\\MyArrayObject'."\0".'unused' => 123,
],
],
],
$o[0],
[]
]
);

View File

@ -0,0 +1,29 @@
<?php
return \Symfony\Component\VarExporter\Internal\Hydrator::hydrate(
$o = [
clone (($p = &\Symfony\Component\VarExporter\Internal\Registry::$prototypes)['ArrayObject'] ?? \Symfony\Component\VarExporter\Internal\Registry::p('ArrayObject')),
clone $p['ArrayObject'],
],
null,
[
'ArrayObject' => [
"\0" => [
[
[
1,
$o[0],
],
0,
],
],
],
'stdClass' => [
'foo' => [
$o[1],
],
],
],
$o[0],
[]
);

View File

@ -6,24 +6,23 @@ return \Symfony\Component\VarExporter\Internal\Hydrator::hydrate(
clone $p['ArrayObject'],
],
null,
[
'ArrayObject' => [
"\0" => [
[
[
1,
$o[0],
],
0,
],
],
],
'stdClass' => [
'foo' => [
$o[1],
],
],
],
[],
$o[0],
[]
[
[
0,
[
1,
$o[0],
],
[
'foo' => $o[1],
],
],
-1 => [
0,
[],
[],
],
]
);

View File

@ -0,0 +1,11 @@
<?php
return \Symfony\Component\VarExporter\Internal\Hydrator::hydrate(
$o = \Symfony\Component\VarExporter\Internal\Registry::unserialize([], [
'C:54:"Symfony\\Component\\VarExporter\\Tests\\FinalArrayIterator":49:{a:2:{i:0;i:123;i:1;s:21:"x:i:0;a:0:{};m:a:0:{}";}}',
]),
null,
[],
$o[0],
[]
);

View File

@ -1,11 +1,17 @@
<?php
return \Symfony\Component\VarExporter\Internal\Hydrator::hydrate(
$o = \Symfony\Component\VarExporter\Internal\Registry::unserialize([], [
'C:54:"Symfony\\Component\\VarExporter\\Tests\\FinalArrayIterator":49:{a:2:{i:0;i:123;i:1;s:21:"x:i:0;a:0:{};m:a:0:{}";}}',
]),
$o = [
clone (\Symfony\Component\VarExporter\Internal\Registry::$prototypes['Symfony\\Component\\VarExporter\\Tests\\FinalArrayIterator'] ?? \Symfony\Component\VarExporter\Internal\Registry::p('Symfony\\Component\\VarExporter\\Tests\\FinalArrayIterator')),
],
null,
[],
$o[0],
[]
[
[
0,
[],
[],
],
]
);

View File

@ -0,0 +1,27 @@
<?php
return \Symfony\Component\VarExporter\Internal\Hydrator::hydrate(
$o = \Symfony\Component\VarExporter\Internal\Registry::unserialize([], [
'O:46:"Symfony\\Component\\VarExporter\\Tests\\FinalError":1:{s:12:"'."\0".'Error'."\0".'trace";a:0:{}}',
]),
null,
[
'TypeError' => [
'file' => [
\dirname(__DIR__).\DIRECTORY_SEPARATOR.'VarExporterTest.php',
],
'line' => [
123,
],
],
'Error' => [
'trace' => [
[],
],
],
],
$o[0],
[
1 => 0,
]
);

View File

@ -1,9 +1,9 @@
<?php
return \Symfony\Component\VarExporter\Internal\Hydrator::hydrate(
$o = \Symfony\Component\VarExporter\Internal\Registry::unserialize([], [
'O:46:"Symfony\\Component\\VarExporter\\Tests\\FinalError":1:{s:12:"'."\0".'Error'."\0".'trace";a:0:{}}',
]),
$o = [
(\Symfony\Component\VarExporter\Internal\Registry::$factories['Symfony\\Component\\VarExporter\\Tests\\FinalError'] ?? \Symfony\Component\VarExporter\Internal\Registry::f('Symfony\\Component\\VarExporter\\Tests\\FinalError'))(),
],
null,
[
'TypeError' => [
@ -14,6 +14,11 @@ return \Symfony\Component\VarExporter\Internal\Hydrator::hydrate(
123,
],
],
'Error' => [
'trace' => [
[],
],
],
],
$o[0],
[

View File

@ -0,0 +1,21 @@
<?php
return \Symfony\Component\VarExporter\Internal\Hydrator::hydrate(
$o = [
clone (($p = &\Symfony\Component\VarExporter\Internal\Registry::$prototypes)['SplObjectStorage'] ?? \Symfony\Component\VarExporter\Internal\Registry::p('SplObjectStorage')),
clone ($p['stdClass'] ?? \Symfony\Component\VarExporter\Internal\Registry::p('stdClass')),
],
null,
[
'SplObjectStorage' => [
"\0" => [
[
$o[1],
345,
],
],
],
],
$o[0],
[]
);

View File

@ -6,16 +6,15 @@ return \Symfony\Component\VarExporter\Internal\Hydrator::hydrate(
clone ($p['stdClass'] ?? \Symfony\Component\VarExporter\Internal\Registry::p('stdClass')),
],
null,
[
'SplObjectStorage' => [
"\0" => [
[
$o[1],
345,
],
],
],
],
[],
$o[0],
[]
[
[
[
$o[1],
345,
],
[],
],
]
);

View File

@ -12,7 +12,6 @@
namespace Symfony\Component\VarExporter\Tests;
use PHPUnit\Framework\TestCase;
use PHPUnit\Framework\Warning;
use Symfony\Component\VarDumper\Test\VarDumperTestTrait;
use Symfony\Component\VarExporter\Internal\Registry;
use Symfony\Component\VarExporter\VarExporter;
@ -76,10 +75,6 @@ class VarExporterTest extends TestCase
*/
public function testExport(string $testName, $value, bool $staticValueExpected = false)
{
if (\PHP_VERSION_ID >= 70400 && \in_array($testName, ['spl-object-storage', 'array-object-custom', 'array-iterator', 'array-object', 'final-array-iterator'])) {
throw new Warning('PHP 7.4 breaks this test.');
}
$dumpedValue = $this->getDump($value);
$isStaticValue = true;
$marshalledValue = VarExporter::export($value, $isStaticValue);
@ -91,7 +86,12 @@ class VarExporterTest extends TestCase
$dump = "<?php\n\nreturn ".$marshalledValue.";\n";
$dump = str_replace(var_export(__FILE__, true), "\\dirname(__DIR__).\\DIRECTORY_SEPARATOR.'VarExporterTest.php'", $dump);
$fixtureFile = __DIR__.'/Fixtures/'.$testName.'.php';
if (\PHP_VERSION_ID < 70400 && \in_array($testName, ['array-object', 'array-iterator', 'array-object-custom', 'spl-object-storage', 'final-array-iterator', 'final-error'], true)) {
$fixtureFile = __DIR__.'/Fixtures/'.$testName.'-legacy.php';
} else {
$fixtureFile = __DIR__.'/Fixtures/'.$testName.'.php';
}
$this->assertStringEqualsFile($fixtureFile, $dump);
if ('incomplete-class' === $testName || 'external-references' === $testName) {

View File

@ -21,7 +21,7 @@
],
"require": {
"php": "^7.1.3",
"symfony/property-access": "^3.4|^4.0|^5.0"
"symfony/property-access": "~3.4.31|^4.3.4|^5.0"
},
"require-dev": {
"psr/log": "~1.0",