diff options
| -rw-r--r-- | Zend/zend_hash.c | 11 | ||||
| -rw-r--r-- | Zend/zend_hash.h | 16 |
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); |
