summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2021-02-26 10:34:30 +0300
committerDmitry Stogov <dmitry@zend.com>2021-02-26 10:34:30 +0300
commit17ad94df124ad3594efc2e7b1a0d3065d2221d3f (patch)
tree60190c7501b2f883af31e57d142e804390a7fce4
parent13e4ce386bb7257dbbe3167b070382ea959ec763 (diff)
downloadphp-git-17ad94df124ad3594efc2e7b1a0d3065d2221d3f.tar.gz
Optimize out zend_strpprintf() usage for simple concationaton
-rw-r--r--ext/spl/spl_directory.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c
index cd796ae048..e459cce8cf 100644
--- a/ext/spl/spl_directory.c
+++ b/ext/spl/spl_directory.c
@@ -214,18 +214,24 @@ static inline int spl_filesystem_object_get_file_name(spl_filesystem_object *int
break;
case SPL_FS_DIR:
{
+ size_t name_len;
size_t path_len = 0;
char *path = spl_filesystem_object_get_path(intern, &path_len);
+
if (intern->file_name) {
zend_string_release(intern->file_name);
}
/* 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) {
- intern->file_name = zend_strpprintf(
- 0, "%s", intern->u.dir.entry.d_name);
+ intern->file_name = zend_string_init(intern->u.dir.entry.d_name, name_len, 0);
} else {
- intern->file_name = zend_strpprintf(
- 0, "%s%c%s", path, slash, intern->u.dir.entry.d_name);
+ zend_string *file_name = zend_string_alloc(path_len + 1 + name_len, 0);
+ memcpy(ZSTR_VAL(file_name), path, path_len);
+ ZSTR_VAL(file_name)[path_len] = slash;
+ memcpy(ZSTR_VAL(file_name) + path_len + 1, intern->u.dir.entry.d_name, name_len);
+ ZSTR_VAL(file_name)[path_len + 1 + name_len] = 0;
+ intern->file_name = file_name;
}
}
break;
@@ -1495,10 +1501,16 @@ PHP_METHOD(RecursiveDirectoryIterator, getChildren)
subdir = Z_SPLFILESYSTEM_P(return_value);
if (subdir) {
+ size_t name_len = strlen(intern->u.dir.entry.d_name);
if (intern->u.dir.sub_path && ZSTR_LEN(intern->u.dir.sub_path)) {
- subdir->u.dir.sub_path = zend_strpprintf(0, "%s%c%s", ZSTR_VAL(intern->u.dir.sub_path), slash, intern->u.dir.entry.d_name);
+ zend_string *sub_path = zend_string_alloc(ZSTR_LEN(intern->u.dir.sub_path) + 1 + name_len, 0);
+ memcpy(ZSTR_VAL(sub_path), ZSTR_VAL(intern->u.dir.sub_path), ZSTR_LEN(intern->u.dir.sub_path));
+ ZSTR_VAL(sub_path)[ZSTR_LEN(intern->u.dir.sub_path)] = slash;
+ memcpy(ZSTR_VAL(sub_path) + ZSTR_LEN(intern->u.dir.sub_path) + 1, intern->u.dir.entry.d_name, name_len);
+ ZSTR_VAL(sub_path)[ZSTR_LEN(intern->u.dir.sub_path) + 1 + name_len] = 0;
+ subdir->u.dir.sub_path = sub_path;
} else {
- subdir->u.dir.sub_path = zend_string_init(intern->u.dir.entry.d_name, strlen(intern->u.dir.entry.d_name), 0);
+ subdir->u.dir.sub_path = zend_string_init(intern->u.dir.entry.d_name, name_len, 0);
}
subdir->info_class = intern->info_class;
subdir->file_class = intern->file_class;