]> granicus.if.org Git - php/commitdiff
Fixed store of "shared" zend_strings
authorDmitry Stogov <dmitry@zend.com>
Wed, 9 Apr 2014 05:43:42 +0000 (09:43 +0400)
committerDmitry Stogov <dmitry@zend.com>
Wed, 9 Apr 2014 05:43:42 +0000 (09:43 +0400)
ext/opcache/zend_persist.c
ext/opcache/zend_shared_alloc.c

index 20f57525cdae422efc774b40e3f533a68154bf53..776359e6be86744af17490f8814ae8598fbaf802 100644 (file)
            _zend_shared_memdup((void*)p, size, 0 TSRMLS_CC)
 
 #if ZEND_EXTENSION_API_NO > PHP_5_3_X_API_NO
-# define zend_accel_store_string(str) \
-       zend_accel_store(str, sizeof(zend_string) + (str)->len)
+# define zend_accel_store_string(str) do { \
+               zend_string *new_str = zend_shared_alloc_get_xlat_entry(str); \
+               if (new_str) { \
+                       str = new_str; \
+               } else { \
+               new_str = _zend_shared_memdup((void*)str, sizeof(zend_string) + (str)->len, 0 TSRMLS_CC); \
+               efree(str); \
+               str = new_str; \
+               } \
+    } while (0)
 # define zend_accel_memdup_string(str) \
        zend_accel_memdup(str, sizeof(zend_string) + (str)->len)
-# define zend_accel_store_interned_string(str) \
-       (IS_ACCEL_INTERNED(str) ? str : zend_accel_store_string(str))
+# define zend_accel_store_interned_string(str) do { \
+               if (!IS_ACCEL_INTERNED(str)) { \
+                       zend_accel_store_string(str); \
+               } \
+       } while (0)
 # define zend_accel_memdup_interned_string(str) \
        (IS_ACCEL_INTERNED(str) ? str : zend_accel_memdup_string(str))
 #else
index 73f331de6f2fc4232b1b8296b5bac717ed069672..4a31d3de6a4a770ae91f049817c7dcd406e78a24 100644 (file)
@@ -348,7 +348,6 @@ void *_zend_shared_memdup(void *source, size_t size, zend_bool free_source TSRML
        memcpy(retval, source, size);
        if (free_source) {
                efree(source);
-//???          interned_efree((char*)source);
        }
        zend_shared_alloc_register_xlat_entry(source, retval);
        return retval;