summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/zend_hash.c11
-rw-r--r--Zend/zend_hash.h16
2 files changed, 24 insertions, 3 deletions
diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c
index b97cfb2ba4..8cb666a708 100644
--- a/Zend/zend_hash.c
+++ b/Zend/zend_hash.c
@@ -92,8 +92,8 @@ static zend_always_inline uint32_t zend_hash_check_size(uint32_t nSize)
/* Use big enough power of 2 */
/* size should be between HT_MIN_SIZE and HT_MAX_SIZE */
- if (nSize < HT_MIN_SIZE) {
- nSize = HT_MIN_SIZE;
+ if (nSize <= HT_MIN_SIZE) {
+ return HT_MIN_SIZE;
} else if (UNEXPECTED(nSize >= HT_MAX_SIZE)) {
zend_error_noreturn(E_ERROR, "Possible integer overflow in memory allocation (%u * %zu + %zu)", nSize, sizeof(Bucket), sizeof(Bucket));
}
@@ -214,6 +214,13 @@ ZEND_API void ZEND_FASTCALL _zend_hash_init(HashTable *ht, uint32_t nSize, dtor_
_zend_hash_init_int(ht, nSize, pDestructor, persistent);
}
+ZEND_API HashTable* ZEND_FASTCALL _zend_new_array_0(ZEND_FILE_LINE_D)
+{
+ HashTable *ht = emalloc(sizeof(HashTable));
+ _zend_hash_init_int(ht, HT_MIN_SIZE, ZVAL_PTR_DTOR, 0);
+ return ht;
+}
+
ZEND_API HashTable* ZEND_FASTCALL _zend_new_array(uint32_t nSize ZEND_FILE_LINE_DC)
{
HashTable *ht = emalloc(sizeof(HashTable));
diff --git a/Zend/zend_hash.h b/Zend/zend_hash.h
index 220bccbb76..f2399ca937 100644
--- a/Zend/zend_hash.h
+++ b/Zend/zend_hash.h
@@ -289,9 +289,23 @@ ZEND_API zval* ZEND_FASTCALL zend_hash_minmax(const HashTable *ht, compare_func_
ZEND_API int ZEND_FASTCALL zend_hash_rehash(HashTable *ht);
-#define zend_new_array(size) \
+#if !ZEND_DEBUG && defined(HAVE_BUILTIN_CONSTANT_P)
+# define zend_new_array(size) \
+ (__builtin_constant_p(size) ? \
+ ((((uint32_t)(size)) <= HT_MIN_SIZE) ? \
+ _zend_new_array_0(ZEND_FILE_LINE_C) \
+ : \
+ _zend_new_array((size) ZEND_FILE_LINE_CC) \
+ ) \
+ : \
+ _zend_new_array((size) ZEND_FILE_LINE_CC) \
+ )
+#else
+# define zend_new_array(size) \
_zend_new_array(size ZEND_FILE_LINE_CC)
+#endif
+ZEND_API HashTable* ZEND_FASTCALL _zend_new_array_0(ZEND_FILE_LINE_D);
ZEND_API HashTable* ZEND_FASTCALL _zend_new_array(uint32_t size ZEND_FILE_LINE_DC);
ZEND_API uint32_t zend_array_count(HashTable *ht);
ZEND_API HashTable* ZEND_FASTCALL zend_array_dup(HashTable *source);