From db53cc0c7f36ce608c7228daacfa255cca47b23e Mon Sep 17 00:00:00 2001 From: Andrii Kasian Date: Thu, 14 Oct 2021 13:50:37 -0500 Subject: [PATCH 1/3] ISSUE-4798: Memory leaks in TestSuite class - Do not store list of classes in property fix: #4798 --- src/Framework/TestSuite.php | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/Framework/TestSuite.php b/src/Framework/TestSuite.php index 144cb6f1b8b..d6da7806c89 100644 --- a/src/Framework/TestSuite.php +++ b/src/Framework/TestSuite.php @@ -120,11 +120,6 @@ class TestSuite implements IteratorAggregate, SelfDescribing, Test */ private $iteratorFilter; - /** - * @var string[] - */ - private $declaredClasses; - /** * Constructs a new TestSuite:. * @@ -155,8 +150,6 @@ public function __construct($theClass = '', string $name = '') ); } - $this->declaredClasses = get_declared_classes(); - if (!$theClass instanceof ReflectionClass) { if (class_exists($theClass, true)) { if ($name === '') { @@ -379,10 +372,11 @@ public function addTestFile(string $filename): void return; } + $declaredClasses = get_declared_classes(); // The given file may contain further stub classes in addition to the // test class itself. Figure out the actual test class. $filename = FileLoader::checkAndLoad($filename); - $newClasses = array_diff(get_declared_classes(), $this->declaredClasses); + $newClasses = array_diff(get_declared_classes(), $declaredClasses); // The diff is empty in case a parent class (with test methods) is added // AFTER a child class that inherited from it. To account for that case, @@ -393,7 +387,6 @@ public function addTestFile(string $filename): void // process discovered classes in approximate LIFO order, so as to // avoid unnecessary reflection. $this->foundClasses = array_merge($newClasses, $this->foundClasses); - $this->declaredClasses = get_declared_classes(); } // The test class's name must match the filename, either in full, or as From aae8ab939a2b6e6d40195077a45f735b15c159a7 Mon Sep 17 00:00:00 2001 From: Andrii Kasian Date: Tue, 9 Nov 2021 11:04:29 -0600 Subject: [PATCH 2/3] ISSUE-4798: Memory leaks in TestSuite class - use pointer to store defined classes state --- src/Framework/TestSuite.php | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/Framework/TestSuite.php b/src/Framework/TestSuite.php index d6da7806c89..27db4de3441 100644 --- a/src/Framework/TestSuite.php +++ b/src/Framework/TestSuite.php @@ -120,6 +120,11 @@ class TestSuite implements IteratorAggregate, SelfDescribing, Test */ private $iteratorFilter; + /** + * @var int + */ + private $declaredClassesPointer; + /** * Constructs a new TestSuite:. * @@ -150,6 +155,8 @@ public function __construct($theClass = '', string $name = '') ); } + $this->declaredClassesPointer = count(get_declared_classes()); + if (!$theClass instanceof ReflectionClass) { if (class_exists($theClass, true)) { if ($name === '') { @@ -372,11 +379,10 @@ public function addTestFile(string $filename): void return; } - $declaredClasses = get_declared_classes(); // The given file may contain further stub classes in addition to the // test class itself. Figure out the actual test class. $filename = FileLoader::checkAndLoad($filename); - $newClasses = array_diff(get_declared_classes(), $declaredClasses); + $newClasses = array_slice(get_declared_classes(), $this->declaredClassesPointer); // The diff is empty in case a parent class (with test methods) is added // AFTER a child class that inherited from it. To account for that case, @@ -386,7 +392,8 @@ public function addTestFile(string $filename): void // On the assumption that test classes are defined first in files, // process discovered classes in approximate LIFO order, so as to // avoid unnecessary reflection. - $this->foundClasses = array_merge($newClasses, $this->foundClasses); + $this->foundClasses = array_merge($newClasses, $this->foundClasses); + $this->declaredClassesPointer = count(get_declared_classes()); } // The test class's name must match the filename, either in full, or as From bf80b0dfe3e17862c119988257eb1e3e3cd38c1c Mon Sep 17 00:00:00 2001 From: Andrii Kasian Date: Mon, 6 Dec 2021 14:11:51 -0600 Subject: [PATCH 3/3] ISSUE-4798: Memory leaks in TestSuite class - remove unused imports --- src/Framework/TestSuite.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Framework/TestSuite.php b/src/Framework/TestSuite.php index 27db4de3441..d3f26188e34 100644 --- a/src/Framework/TestSuite.php +++ b/src/Framework/TestSuite.php @@ -10,7 +10,6 @@ namespace PHPUnit\Framework; use const PHP_EOL; -use function array_diff; use function array_keys; use function array_merge; use function basename;