]> granicus.if.org Git - php/commitdiff
Set and keep HASH_FLAG_STATIC_KEYS for all HashTables stored in SHM (or file cache).
authorDmitry Stogov <dmitry@zend.com>
Mon, 5 Mar 2018 21:00:13 +0000 (00:00 +0300)
committerDmitry Stogov <dmitry@zend.com>
Mon, 5 Mar 2018 21:00:13 +0000 (00:00 +0300)
ext/opcache/zend_accelerator_util_funcs.c
ext/opcache/zend_persist.c

index f37e577f81d77d6b923387ef62a23982cc0b6e84..f63609417e18325002075c2754da0f306c978299 100644 (file)
@@ -180,7 +180,7 @@ static void zend_hash_clone_constants(HashTable *ht, HashTable *source)
        ht->nNumOfElements = source->nNumOfElements;
        ht->nNextFreeElement = source->nNextFreeElement;
        ht->pDestructor = NULL;
-       HT_FLAGS(ht) = (HT_FLAGS(source) & HASH_FLAG_INITIALIZED);
+       HT_FLAGS(ht) = (HT_FLAGS(source) & (HASH_FLAG_INITIALIZED | HASH_FLAG_STATIC_KEYS));
        ht->nInternalPointer = source->nNumOfElements ? 0 : HT_INVALID_IDX;
 
        if (!(HT_FLAGS(ht) & HASH_FLAG_INITIALIZED)) {
@@ -231,7 +231,7 @@ static void zend_hash_clone_methods(HashTable *ht, HashTable *source, zend_class
        ht->nNumOfElements = source->nNumOfElements;
        ht->nNextFreeElement = source->nNextFreeElement;
        ht->pDestructor = ZEND_FUNCTION_DTOR;
-       HT_FLAGS(ht) = (HT_FLAGS(source) & HASH_FLAG_INITIALIZED);
+       HT_FLAGS(ht) = (HT_FLAGS(source) & (HASH_FLAG_INITIALIZED | HASH_FLAG_STATIC_KEYS));
        ht->nInternalPointer = source->nNumOfElements ? 0 : HT_INVALID_IDX;
 
        if (!(HT_FLAGS(ht) & HASH_FLAG_INITIALIZED)) {
@@ -289,7 +289,7 @@ static void zend_hash_clone_prop_info(HashTable *ht, HashTable *source, zend_cla
        ht->nNumOfElements = source->nNumOfElements;
        ht->nNextFreeElement = source->nNextFreeElement;
        ht->pDestructor = NULL;
-       HT_FLAGS(ht) = (HT_FLAGS(source) & HASH_FLAG_INITIALIZED);
+       HT_FLAGS(ht) = (HT_FLAGS(source) & (HASH_FLAG_INITIALIZED | HASH_FLAG_STATIC_KEYS));
        ht->nInternalPointer = source->nNumOfElements ? 0 : HT_INVALID_IDX;
 
        if (!(HT_FLAGS(ht) & HASH_FLAG_INITIALIZED)) {
index e063f1f4aa35a5555eec2012382f964274b76d1a..132ecab1d00298b52f376b3430c314f11ecae480 100644 (file)
@@ -88,6 +88,8 @@ static void zend_hash_persist(HashTable *ht, zend_persist_func_t pPersistElement
        uint32_t idx, nIndex;
        Bucket *p;
 
+       HT_FLAGS(ht) |= HASH_FLAG_STATIC_KEYS;
+
        if (!(HT_FLAGS(ht) & HASH_FLAG_INITIALIZED)) {
                HT_SET_DATA_ADDR(ht, &uninitialized_bucket);
                return;
@@ -172,6 +174,8 @@ static void zend_hash_persist_immutable(HashTable *ht)
        uint32_t idx, nIndex;
        Bucket *p;
 
+       HT_FLAGS(ht) |= HASH_FLAG_STATIC_KEYS;
+
        if (!(HT_FLAGS(ht) & HASH_FLAG_INITIALIZED)) {
                HT_SET_DATA_ADDR(ht, &uninitialized_bucket);
                return;
@@ -304,7 +308,6 @@ static void zend_persist_zval(zval *z)
                                        Z_TYPE_FLAGS_P(z) = 0;
                                        GC_SET_REFCOUNT(Z_COUNTED_P(z), 2);
                                        GC_ADD_FLAGS(Z_COUNTED_P(z), IS_ARRAY_IMMUTABLE);
-                                       HT_FLAGS(Z_ARRVAL_P(z)) |= HASH_FLAG_STATIC_KEYS;
                                }
                        }
                        break;
@@ -370,7 +373,6 @@ static void zend_persist_op_array_ex(zend_op_array *op_array, zend_persistent_sc
                        /* make immutable array */
                        GC_SET_REFCOUNT(op_array->static_variables, 2);
                        GC_TYPE_INFO(op_array->static_variables) = IS_ARRAY | (IS_ARRAY_IMMUTABLE << GC_FLAGS_SHIFT);
-                       HT_FLAGS(op_array->static_variables) |= HASH_FLAG_STATIC_KEYS;
                }
        }