summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2021-03-09 17:37:24 +0300
committerDmitry Stogov <dmitry@zend.com>2021-03-09 17:37:24 +0300
commit1d5f359f5671dc26df5369b00aab1bbf1f40c65b (patch)
tree3077aeca0496934416bbce6b59fda362662e3ed8
parent9f826e8ce9a7b51a5b8be48339c9febd749cd946 (diff)
downloadphp-git-1d5f359f5671dc26df5369b00aab1bbf1f40c65b.tar.gz
Use spl_filesystem_object.file_name for SPL_FS_DIR as a cache and prevent multiple file name reconstruction.
-rw-r--r--ext/spl/spl_directory.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c
index fe5043e375..15d792360f 100644
--- a/ext/spl/spl_directory.c
+++ b/ext/spl/spl_directory.c
@@ -202,25 +202,25 @@ PHPAPI char* spl_filesystem_object_get_path(spl_filesystem_object *intern, size_
static inline int spl_filesystem_object_get_file_name(spl_filesystem_object *intern) /* {{{ */
{
- char slash = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_UNIXPATHS) ? '/' : DEFAULT_SLASH;
+ if (intern->file_name) {
+ /* already known */
+ return SUCCESS;
+ }
switch (intern->type) {
case SPL_FS_INFO:
case SPL_FS_FILE:
- if (!intern->file_name) {
- zend_throw_error(NULL, "Object not initialized");
- return FAILURE;
- }
+ zend_throw_error(NULL, "Object not initialized");
+ return FAILURE;
break;
case SPL_FS_DIR:
{
size_t name_len;
size_t path_len = 0;
- char *path = spl_filesystem_object_get_path(intern, &path_len);
+ char *path;
+ char slash = SPL_HAS_FLAG(intern->flags, SPL_FILE_DIR_UNIXPATHS) ? '/' : DEFAULT_SLASH;
- if (intern->file_name) {
- zend_string_release(intern->file_name);
- }
+ path = spl_filesystem_object_get_path(intern, &path_len);
/* if there is parent path, amend it, otherwise just use the given path as is */
name_len = strlen(intern->u.dir.entry.d_name);
if (path_len == 0) {
@@ -241,6 +241,11 @@ static inline int spl_filesystem_object_get_file_name(spl_filesystem_object *int
static int spl_filesystem_dir_read(spl_filesystem_object *intern) /* {{{ */
{
+ if (intern->file_name) {
+ /* invalidate */
+ zend_string_release(intern->file_name);
+ intern->file_name = NULL;
+ }
if (!intern->u.dir.dirp || !php_stream_readdir(intern->u.dir.dirp, &intern->u.dir.entry)) {
intern->u.dir.entry.d_name[0] = '\0';
return 0;