Commit 9687652b3f6 for php.net
commit 9687652b3f6b306feb9b26f1c99d810252c8e61b
Author: Weilin Du <weilindu@php.net>
Date: Tue Sep 15 15:50:40 2026 +0800
ext/standard: Preallocate stat result arrays
stat(), lstat() and fstat() return 13 integer keys and 13 string keys.
Allocate a mixed table for all 26 entries up front to avoid growing and
converting an intermediate packed array. Use append-new insertion for
the unique numeric keys.
diff --git a/ext/standard/file.c b/ext/standard/file.c
index fa0d3079bcc..0f94acd4c7c 100644
--- a/ext/standard/file.c
+++ b/ext/standard/file.c
@@ -1408,7 +1408,7 @@ PHPAPI void php_fstat(php_stream *stream, zval *return_value)
php_stream_statbuf stat_ssb;
zval stat_dev, stat_ino, stat_mode, stat_nlink, stat_uid, stat_gid, stat_rdev,
stat_size, stat_atime, stat_mtime, stat_ctime, stat_blksize, stat_blocks;
- char *stat_sb_names[13] = {
+ char *stat_sb_names[] = {
"dev", "ino", "mode", "nlink", "uid", "gid", "rdev",
"size", "atime", "mtime", "ctime", "blksize", "blocks"
};
@@ -1417,7 +1417,8 @@ PHPAPI void php_fstat(php_stream *stream, zval *return_value)
RETURN_FALSE;
}
- array_init(return_value);
+ array_init_size(return_value, 2 * (sizeof(stat_sb_names) / sizeof(*stat_sb_names)));
+ zend_hash_real_init_mixed(Z_ARRVAL_P(return_value));
ZVAL_LONG(&stat_dev, stat_ssb.sb.st_dev);
ZVAL_LONG(&stat_ino, stat_ssb.sb.st_ino);
@@ -1445,19 +1446,19 @@ PHPAPI void php_fstat(php_stream *stream, zval *return_value)
ZVAL_LONG(&stat_blocks,-1);
#endif
/* Store numeric indexes in proper order */
- zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &stat_dev);
- zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &stat_ino);
- zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &stat_mode);
- zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &stat_nlink);
- zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &stat_uid);
- zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &stat_gid);
- zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &stat_rdev);
- zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &stat_size);
- zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &stat_atime);
- zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &stat_mtime);
- zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &stat_ctime);
- zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &stat_blksize);
- zend_hash_next_index_insert(Z_ARRVAL_P(return_value), &stat_blocks);
+ zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &stat_dev);
+ zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &stat_ino);
+ zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &stat_mode);
+ zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &stat_nlink);
+ zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &stat_uid);
+ zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &stat_gid);
+ zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &stat_rdev);
+ zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &stat_size);
+ zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &stat_atime);
+ zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &stat_mtime);
+ zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &stat_ctime);
+ zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &stat_blksize);
+ zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), &stat_blocks);
/* Store string indexes referencing the same zval*/
zend_hash_str_add_new(Z_ARRVAL_P(return_value), stat_sb_names[0], strlen(stat_sb_names[0]), &stat_dev);
diff --git a/ext/standard/filestat.c b/ext/standard/filestat.c
index 13478b6f5c3..2a52a6c5f1d 100644
--- a/ext/standard/filestat.c
+++ b/ext/standard/filestat.c
@@ -935,7 +935,8 @@ PHPAPI void php_stat(zend_string *filename, int type, zval *return_value)
};
size_t i, size_stat_sb = sizeof(stat_sb_addresses) / sizeof(*stat_sb_addresses);
- array_init(return_value);
+ array_init_size(return_value, 2 * size_stat_sb);
+ zend_hash_real_init_mixed(Z_ARRVAL_P(return_value));
ZVAL_LONG(&stat_dev, stat_sb->st_dev);
ZVAL_LONG(&stat_ino, stat_sb->st_ino);
@@ -964,7 +965,7 @@ PHPAPI void php_stat(zend_string *filename, int type, zval *return_value)
#endif
for (i = 0; i < size_stat_sb; i++) {
/* Store numeric indexes in proper order */
- zend_hash_next_index_insert(Z_ARRVAL_P(return_value), stat_sb_addresses[i]);
+ zend_hash_next_index_insert_new(Z_ARRVAL_P(return_value), stat_sb_addresses[i]);
}
for (i = 0; i < size_stat_sb; i++) {