]> granicus.if.org Git - php/commitdiff
Added zend_hash_add_new_mem/zend_hash_str_add_new_mem. Use them to add new elements...
authorDmitry Stogov <dmitry@zend.com>
Tue, 31 Oct 2017 07:43:10 +0000 (10:43 +0300)
committerDmitry Stogov <dmitry@zend.com>
Tue, 31 Oct 2017 07:43:10 +0000 (10:43 +0300)
Zend/zend_hash.h
ext/pcre/php_pcre.c

index ca1be3b0d0c18590b23ae2494993281e21a0e745..def2fe576d4c6aa061bda8a6d7e3d70b449bffcd 100644 (file)
@@ -634,6 +634,19 @@ static zend_always_inline void *zend_hash_add_mem(HashTable *ht, zend_string *ke
        return NULL;
 }
 
+static zend_always_inline void *zend_hash_add_new_mem(HashTable *ht, zend_string *key, void *pData, size_t size)
+{
+       zval tmp, *zv;
+
+       ZVAL_PTR(&tmp, NULL);
+       if ((zv = zend_hash_add_new(ht, key, &tmp))) {
+               Z_PTR_P(zv) = pemalloc(size, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT);
+               memcpy(Z_PTR_P(zv), pData, size);
+               return Z_PTR_P(zv);
+       }
+       return NULL;
+}
+
 static zend_always_inline void *zend_hash_str_add_mem(HashTable *ht, const char *str, size_t len, void *pData, size_t size)
 {
        zval tmp, *zv;
@@ -647,6 +660,19 @@ static zend_always_inline void *zend_hash_str_add_mem(HashTable *ht, const char
        return NULL;
 }
 
+static zend_always_inline void *zend_hash_str_add_new_mem(HashTable *ht, const char *str, size_t len, void *pData, size_t size)
+{
+       zval tmp, *zv;
+
+       ZVAL_PTR(&tmp, NULL);
+       if ((zv = zend_hash_str_add_new(ht, str, len, &tmp))) {
+               Z_PTR_P(zv) = pemalloc(size, GC_FLAGS(ht) & IS_ARRAY_PERSISTENT);
+               memcpy(Z_PTR_P(zv), pData, size);
+               return Z_PTR_P(zv);
+       }
+       return NULL;
+}
+
 static zend_always_inline void *zend_hash_update_mem(HashTable *ht, zend_string *key, void *pData, size_t size)
 {
        void *p;
index 44b5ff55b03ebaf385c7fe50c1b8e2b57ff8696b..adedcd8d9fb5cc34ded6be6f291b31050fdb0413 100644 (file)
@@ -592,7 +592,7 @@ PHPAPI pcre_cache_entry* pcre_get_compiled_regex_cache(zend_string *regex)
         * See bug #63180
         */
        if (!ZSTR_IS_INTERNED(key) || !(GC_FLAGS(key) & IS_STR_PERMANENT)) {
-               pce = zend_hash_str_update_mem(&PCRE_G(pcre_cache),
+               pce = zend_hash_str_add_new_mem(&PCRE_G(pcre_cache),
                                ZSTR_VAL(key), ZSTR_LEN(key), &new_entry, sizeof(pcre_cache_entry));
 #if HAVE_SETLOCALE
                if (key != regex) {
@@ -600,7 +600,7 @@ PHPAPI pcre_cache_entry* pcre_get_compiled_regex_cache(zend_string *regex)
                }
 #endif
        } else {
-               pce = zend_hash_update_mem(&PCRE_G(pcre_cache), key, &new_entry, sizeof(pcre_cache_entry));
+               pce = zend_hash_add_new_mem(&PCRE_G(pcre_cache), key, &new_entry, sizeof(pcre_cache_entry));
        }
 
        return pce;