Skip to content

Commit 17ad94d

Browse files
committed
Optimize out zend_strpprintf() usage for simple concationaton
1 parent 13e4ce3 commit 17ad94d

File tree

1 file changed

+18
-6
lines changed

1 file changed

+18
-6
lines changed

ext/spl/spl_directory.c

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -214,18 +214,24 @@ static inline int spl_filesystem_object_get_file_name(spl_filesystem_object *int
214214
break;
215215
case SPL_FS_DIR:
216216
{
217+
size_t name_len;
217218
size_t path_len = 0;
218219
char *path = spl_filesystem_object_get_path(intern, &path_len);
220+
219221
if (intern->file_name) {
220222
zend_string_release(intern->file_name);
221223
}
222224
/* if there is parent path, amend it, otherwise just use the given path as is */
225+
name_len = strlen(intern->u.dir.entry.d_name);
223226
if (path_len == 0) {
224-
intern->file_name = zend_strpprintf(
225-
0, "%s", intern->u.dir.entry.d_name);
227+
intern->file_name = zend_string_init(intern->u.dir.entry.d_name, name_len, 0);
226228
} else {
227-
intern->file_name = zend_strpprintf(
228-
0, "%s%c%s", path, slash, intern->u.dir.entry.d_name);
229+
zend_string *file_name = zend_string_alloc(path_len + 1 + name_len, 0);
230+
memcpy(ZSTR_VAL(file_name), path, path_len);
231+
ZSTR_VAL(file_name)[path_len] = slash;
232+
memcpy(ZSTR_VAL(file_name) + path_len + 1, intern->u.dir.entry.d_name, name_len);
233+
ZSTR_VAL(file_name)[path_len + 1 + name_len] = 0;
234+
intern->file_name = file_name;
229235
}
230236
}
231237
break;
@@ -1495,10 +1501,16 @@ PHP_METHOD(RecursiveDirectoryIterator, getChildren)
14951501

14961502
subdir = Z_SPLFILESYSTEM_P(return_value);
14971503
if (subdir) {
1504+
size_t name_len = strlen(intern->u.dir.entry.d_name);
14981505
if (intern->u.dir.sub_path && ZSTR_LEN(intern->u.dir.sub_path)) {
1499-
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);
1506+
zend_string *sub_path = zend_string_alloc(ZSTR_LEN(intern->u.dir.sub_path) + 1 + name_len, 0);
1507+
memcpy(ZSTR_VAL(sub_path), ZSTR_VAL(intern->u.dir.sub_path), ZSTR_LEN(intern->u.dir.sub_path));
1508+
ZSTR_VAL(sub_path)[ZSTR_LEN(intern->u.dir.sub_path)] = slash;
1509+
memcpy(ZSTR_VAL(sub_path) + ZSTR_LEN(intern->u.dir.sub_path) + 1, intern->u.dir.entry.d_name, name_len);
1510+
ZSTR_VAL(sub_path)[ZSTR_LEN(intern->u.dir.sub_path) + 1 + name_len] = 0;
1511+
subdir->u.dir.sub_path = sub_path;
15001512
} else {
1501-
subdir->u.dir.sub_path = zend_string_init(intern->u.dir.entry.d_name, strlen(intern->u.dir.entry.d_name), 0);
1513+
subdir->u.dir.sub_path = zend_string_init(intern->u.dir.entry.d_name, name_len, 0);
15021514
}
15031515
subdir->info_class = intern->info_class;
15041516
subdir->file_class = intern->file_class;

0 commit comments

Comments
 (0)