From 0a7e0617ccf24a8ceba8e483bf510c1a72fab9bc Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Thu, 14 Aug 2014 15:38:55 +0200 Subject: [PATCH 1/6] DDC-3120 - add failing test for un-serialization of an internal PHP class --- .../Tests/ORM/Mapping/ClassMetadataTest.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataTest.php b/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataTest.php index aa284db89..84385eb86 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataTest.php +++ b/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataTest.php @@ -1101,6 +1101,16 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase $this->assertFalse($class->isIdentifier('foo')); } + + /** + * @group DDC-3120 + */ + public function testCanInstantiateInternalPhpClassSubclass() + { + $classMetadata = new ClassMetadata(__NAMESPACE__ . '\\MyArrayObjectEntity'); + + $this->assertInstanceOf(__NAMESPACE__ . '\\MyArrayObjectEntity', $classMetadata->newInstance()); + } } /** @@ -1137,3 +1147,7 @@ class MyPrefixNamingStrategy extends \Doctrine\ORM\Mapping\DefaultNamingStrategy return strtolower($this->classToTableName($className)) . '_' . $propertyName; } } + +class MyArrayObjectEntity extends \ArrayObject +{ +} From 60b75fefede59ede555f4a172608a0697ac57b79 Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Thu, 14 Aug 2014 15:39:58 +0200 Subject: [PATCH 2/6] DDC-3120 - add failing test for un-serialization of an internal PHP class from cached metadata instance --- .../Doctrine/Tests/ORM/Mapping/ClassMetadataTest.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataTest.php b/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataTest.php index 84385eb86..f97eb29e8 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataTest.php +++ b/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataTest.php @@ -1111,6 +1111,17 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase $this->assertInstanceOf(__NAMESPACE__ . '\\MyArrayObjectEntity', $classMetadata->newInstance()); } + + /** + * @group DDC-3120 + */ + public function testCanInstantiateInternalPhpClassSubclassFromUnserializedMetadata() + { + /* @var $classMetadata ClassMetadata */ + $classMetadata = unserialize(serialize(new ClassMetadata(__NAMESPACE__ . '\\MyArrayObjectEntity'))); + + $this->assertInstanceOf(__NAMESPACE__ . '\\MyArrayObjectEntity', $classMetadata->newInstance()); + } } /** From 0d683c1897681763ddd312e9625ac16f412f67d9 Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Mon, 6 Oct 2014 14:22:06 +0200 Subject: [PATCH 3/6] DDC-3120 - metadata should be initialized before attempting new instance creation --- tests/Doctrine/Tests/ORM/Mapping/ClassMetadataTest.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataTest.php b/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataTest.php index f97eb29e8..429cf0dc6 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataTest.php +++ b/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataTest.php @@ -1109,6 +1109,8 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase { $classMetadata = new ClassMetadata(__NAMESPACE__ . '\\MyArrayObjectEntity'); + $classMetadata->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); + $this->assertInstanceOf(__NAMESPACE__ . '\\MyArrayObjectEntity', $classMetadata->newInstance()); } @@ -1120,6 +1122,8 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase /* @var $classMetadata ClassMetadata */ $classMetadata = unserialize(serialize(new ClassMetadata(__NAMESPACE__ . '\\MyArrayObjectEntity'))); + $classMetadata->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); + $this->assertInstanceOf(__NAMESPACE__ . '\\MyArrayObjectEntity', $classMetadata->newInstance()); } } From 8fc1c34b2920227ae776e9ae8c98cf10dd723814 Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Mon, 6 Oct 2014 14:25:16 +0200 Subject: [PATCH 4/6] DDC-3120 - metadata should be waked up before attempting new instance creation --- tests/Doctrine/Tests/ORM/Mapping/ClassMetadataTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataTest.php b/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataTest.php index 429cf0dc6..9c1ea3e6c 100644 --- a/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataTest.php +++ b/tests/Doctrine/Tests/ORM/Mapping/ClassMetadataTest.php @@ -1122,7 +1122,7 @@ class ClassMetadataTest extends \Doctrine\Tests\OrmTestCase /* @var $classMetadata ClassMetadata */ $classMetadata = unserialize(serialize(new ClassMetadata(__NAMESPACE__ . '\\MyArrayObjectEntity'))); - $classMetadata->initializeReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); + $classMetadata->wakeupReflection(new \Doctrine\Common\Persistence\Mapping\RuntimeReflectionService); $this->assertInstanceOf(__NAMESPACE__ . '\\MyArrayObjectEntity', $classMetadata->newInstance()); } From a69584a841efdb1312c8410ade2489c3f558752f Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Mon, 6 Oct 2014 14:26:00 +0200 Subject: [PATCH 5/6] DDC-3120 - Using `ReflectionClass#newInstanceWithoutConstructor()` also with PHP 5.6+ --- lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php b/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php index 4880055b3..88c905baf 100644 --- a/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php +++ b/lib/Doctrine/ORM/Mapping/ClassMetadataInfo.php @@ -866,7 +866,7 @@ class ClassMetadataInfo implements ClassMetadata public function newInstance() { if ($this->_prototype === null) { - if (PHP_VERSION_ID === 50429 || PHP_VERSION_ID === 50513) { + if (PHP_VERSION_ID === 50429 || PHP_VERSION_ID === 50513 || PHP_VERSION_ID >= 50600) { $this->_prototype = $this->reflClass->newInstanceWithoutConstructor(); } else { $this->_prototype = unserialize(sprintf('O:%d:"%s":0:{}', strlen($this->name), $this->name)); From 64061bafaf17bca8e1c3b19d4830f73a190f3da4 Mon Sep 17 00:00:00 2001 From: Marco Pivetta Date: Mon, 6 Oct 2014 14:28:05 +0200 Subject: [PATCH 6/6] DDC-3120 - Adding PHP 5.6 to build matrix --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index adbf643c2..2119b575c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,6 +4,7 @@ php: - 5.3 - 5.4 - 5.5 + - 5.6 env: - DB=mysql