diff --git a/src/Symfony/Component/VarExporter/Internal/Exporter.php b/src/Symfony/Component/VarExporter/Internal/Exporter.php index 87b3156d41ef..c0b7fa17f44c 100644 --- a/src/Symfony/Component/VarExporter/Internal/Exporter.php +++ b/src/Symfony/Component/VarExporter/Internal/Exporter.php @@ -155,7 +155,7 @@ public static function prepare($values, $objectsPool, &$refsPool, &$objectsCount } $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 @@ private static function exportRegistry(Registry $value, string $indent, string $ 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:{}'; diff --git a/src/Symfony/Component/VarExporter/Internal/Registry.php b/src/Symfony/Component/VarExporter/Internal/Registry.php index dd2792133e42..19d91c930411 100644 --- a/src/Symfony/Component/VarExporter/Internal/Registry.php +++ b/src/Symfony/Component/VarExporter/Internal/Registry.php @@ -75,7 +75,7 @@ public static function getClassReflector($class, $instantiableWithoutConstructor } 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 @@ public static function getClassReflector($class, $instantiableWithoutConstructor $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:{}')) { diff --git a/src/Symfony/Component/VarExporter/Tests/Fixtures/array-iterator-legacy.php b/src/Symfony/Component/VarExporter/Tests/Fixtures/array-iterator-legacy.php new file mode 100644 index 000000000000..c59573315d18 --- /dev/null +++ b/src/Symfony/Component/VarExporter/Tests/Fixtures/array-iterator-legacy.php @@ -0,0 +1,22 @@ + [ + "\0" => [ + [ + [ + 123, + ], + 1, + ], + ], + ], + ], + $o[0], + [] +); diff --git a/src/Symfony/Component/VarExporter/Tests/Fixtures/array-iterator.php b/src/Symfony/Component/VarExporter/Tests/Fixtures/array-iterator.php index c59573315d18..ed4df00c99e5 100644 --- a/src/Symfony/Component/VarExporter/Tests/Fixtures/array-iterator.php +++ b/src/Symfony/Component/VarExporter/Tests/Fixtures/array-iterator.php @@ -5,18 +5,15 @@ clone (\Symfony\Component\VarExporter\Internal\Registry::$prototypes['ArrayIterator'] ?? \Symfony\Component\VarExporter\Internal\Registry::p('ArrayIterator')), ], null, + [], + $o[0], [ - 'ArrayIterator' => [ - "\0" => [ - [ - [ - 123, - ], - 1, - ], + [ + 1, + [ + 123, ], + [], ], - ], - $o[0], - [] + ] ); diff --git a/src/Symfony/Component/VarExporter/Tests/Fixtures/array-object-custom-legacy.php b/src/Symfony/Component/VarExporter/Tests/Fixtures/array-object-custom-legacy.php new file mode 100644 index 000000000000..35303f822214 --- /dev/null +++ b/src/Symfony/Component/VarExporter/Tests/Fixtures/array-object-custom-legacy.php @@ -0,0 +1,22 @@ + [ + "\0" => [ + [ + [ + 234, + ], + 1, + ], + ], + ], + ], + $o[0], + [] +); diff --git a/src/Symfony/Component/VarExporter/Tests/Fixtures/array-object-custom.php b/src/Symfony/Component/VarExporter/Tests/Fixtures/array-object-custom.php index 35303f822214..530f0d1026ec 100644 --- a/src/Symfony/Component/VarExporter/Tests/Fixtures/array-object-custom.php +++ b/src/Symfony/Component/VarExporter/Tests/Fixtures/array-object-custom.php @@ -5,18 +5,17 @@ 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], - [] + ] ); diff --git a/src/Symfony/Component/VarExporter/Tests/Fixtures/array-object-legacy.php b/src/Symfony/Component/VarExporter/Tests/Fixtures/array-object-legacy.php new file mode 100644 index 000000000000..a461c6ed97f7 --- /dev/null +++ b/src/Symfony/Component/VarExporter/Tests/Fixtures/array-object-legacy.php @@ -0,0 +1,29 @@ + [ + "\0" => [ + [ + [ + 1, + $o[0], + ], + 0, + ], + ], + ], + 'stdClass' => [ + 'foo' => [ + $o[1], + ], + ], + ], + $o[0], + [] +); diff --git a/src/Symfony/Component/VarExporter/Tests/Fixtures/array-object.php b/src/Symfony/Component/VarExporter/Tests/Fixtures/array-object.php index a461c6ed97f7..e2f349e6478f 100644 --- a/src/Symfony/Component/VarExporter/Tests/Fixtures/array-object.php +++ b/src/Symfony/Component/VarExporter/Tests/Fixtures/array-object.php @@ -6,24 +6,23 @@ clone $p['ArrayObject'], ], null, + [], + $o[0], [ - 'ArrayObject' => [ - "\0" => [ - [ - [ - 1, - $o[0], - ], - 0, - ], + [ + 0, + [ + 1, + $o[0], ], - ], - 'stdClass' => [ - 'foo' => [ - $o[1], + [ + 'foo' => $o[1], ], ], - ], - $o[0], - [] + -1 => [ + 0, + [], + [], + ], + ] ); diff --git a/src/Symfony/Component/VarExporter/Tests/Fixtures/final-array-iterator-legacy.php b/src/Symfony/Component/VarExporter/Tests/Fixtures/final-array-iterator-legacy.php new file mode 100644 index 000000000000..9bdb2b366234 --- /dev/null +++ b/src/Symfony/Component/VarExporter/Tests/Fixtures/final-array-iterator-legacy.php @@ -0,0 +1,11 @@ + [ + 'file' => [ + \dirname(__DIR__).\DIRECTORY_SEPARATOR.'VarExporterTest.php', + ], + 'line' => [ + 123, + ], + ], + 'Error' => [ + 'trace' => [ + [], + ], + ], + ], + $o[0], + [ + 1 => 0, + ] +); diff --git a/src/Symfony/Component/VarExporter/Tests/Fixtures/final-error.php b/src/Symfony/Component/VarExporter/Tests/Fixtures/final-error.php index dc260dc0242c..b2e729937b29 100644 --- a/src/Symfony/Component/VarExporter/Tests/Fixtures/final-error.php +++ b/src/Symfony/Component/VarExporter/Tests/Fixtures/final-error.php @@ -1,9 +1,9 @@ [ @@ -14,6 +14,11 @@ 123, ], ], + 'Error' => [ + 'trace' => [ + [], + ], + ], ], $o[0], [ diff --git a/src/Symfony/Component/VarExporter/Tests/Fixtures/spl-object-storage-legacy.php b/src/Symfony/Component/VarExporter/Tests/Fixtures/spl-object-storage-legacy.php new file mode 100644 index 000000000000..5e854a4959a3 --- /dev/null +++ b/src/Symfony/Component/VarExporter/Tests/Fixtures/spl-object-storage-legacy.php @@ -0,0 +1,21 @@ + [ + "\0" => [ + [ + $o[1], + 345, + ], + ], + ], + ], + $o[0], + [] +); diff --git a/src/Symfony/Component/VarExporter/Tests/Fixtures/spl-object-storage.php b/src/Symfony/Component/VarExporter/Tests/Fixtures/spl-object-storage.php index 5e854a4959a3..023a75fdcd3c 100644 --- a/src/Symfony/Component/VarExporter/Tests/Fixtures/spl-object-storage.php +++ b/src/Symfony/Component/VarExporter/Tests/Fixtures/spl-object-storage.php @@ -6,16 +6,15 @@ clone ($p['stdClass'] ?? \Symfony\Component\VarExporter\Internal\Registry::p('stdClass')), ], null, + [], + $o[0], [ - 'SplObjectStorage' => [ - "\0" => [ - [ - $o[1], - 345, - ], + [ + [ + $o[1], + 345, ], + [], ], - ], - $o[0], - [] + ] ); diff --git a/src/Symfony/Component/VarExporter/Tests/VarExporterTest.php b/src/Symfony/Component/VarExporter/Tests/VarExporterTest.php index 8a70d02be5ce..d80c2858ee91 100644 --- a/src/Symfony/Component/VarExporter/Tests/VarExporterTest.php +++ b/src/Symfony/Component/VarExporter/Tests/VarExporterTest.php @@ -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 @@ public function provideFailingSerialization() */ 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 @@ public function testExport(string $testName, $value, bool $staticValueExpected = $dump = "assertStringEqualsFile($fixtureFile, $dump); if ('incomplete-class' === $testName || 'external-references' === $testName) {