/* 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));
}
_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));
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);