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++) {