@@ -24,6 +24,13 @@ final class Filter
2424 */
2525 private $ whitelistedFiles = [];
2626
27+ /**
28+ * Remembers the result of the `is_file()` calls.
29+ *
30+ * @var bool[]
31+ */
32+ private $ isFileCallsCache = [];
33+
2734 /**
2835 * Adds a directory to the whitelist (recursively).
2936 */
@@ -85,18 +92,22 @@ public function removeFileFromWhitelist(string $filename): void
8592 */
8693 public function isFile (string $ filename ): bool
8794 {
88- if ($ filename === '- ' ||
89- \strpos ($ filename , 'vfs:// ' ) === 0 ||
90- \strpos ($ filename , 'xdebug://debug-eval ' ) !== false ||
91- \strpos ($ filename , 'eval() \'d code ' ) !== false ||
92- \strpos ($ filename , 'runtime-created function ' ) !== false ||
93- \strpos ($ filename , 'runkit created function ' ) !== false ||
94- \strpos ($ filename , 'assert code ' ) !== false ||
95- \strpos ($ filename , 'regexp code ' ) !== false ) {
96- return false ;
95+ if (!isset ($ this ->isFileCallsCache [$ filename ])) {
96+ if ($ filename === '- ' ||
97+ \strpos ($ filename , 'vfs:// ' ) === 0 ||
98+ \strpos ($ filename , 'xdebug://debug-eval ' ) !== false ||
99+ \strpos ($ filename , 'eval() \'d code ' ) !== false ||
100+ \strpos ($ filename , 'runtime-created function ' ) !== false ||
101+ \strpos ($ filename , 'runkit created function ' ) !== false ||
102+ \strpos ($ filename , 'assert code ' ) !== false ||
103+ \strpos ($ filename , 'regexp code ' ) !== false ) {
104+ $ isFile = false ;
105+ } else {
106+ $ isFile = \file_exists ($ filename );
107+ }
108+ $ this ->isFileCallsCache [$ filename ] = $ isFile ;
97109 }
98-
99- return \file_exists ($ filename );
110+ return $ this ->isFileCallsCache [$ filename ];
100111 }
101112
102113 /**
0 commit comments