]> granicus.if.org Git - php/commitdiff
Remove HashTable holes in functions and class tables.
authorDmitry Stogov <dmitry@zend.com>
Wed, 10 Jan 2018 07:15:55 +0000 (10:15 +0300)
committerDmitry Stogov <dmitry@zend.com>
Wed, 10 Jan 2018 07:15:55 +0000 (10:15 +0300)
ext/opcache/zend_accelerator_util_funcs.c
ext/opcache/zend_persist_calc.c

index b0db2085f9ae4a3c3b4a83bb3a00f4236d3d6685..ce0c8f4adaea3465afeb6cc53777cdc707f36737 100644 (file)
@@ -195,7 +195,7 @@ static void zend_hash_clone_constants(HashTable *ht, HashTable *source)
        p = source->arData;
        end = p + source->nNumUsed;
        for (; p != end; p++) {
-               if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) continue;
+               ZEND_ASSERT(Z_TYPE(p->val) != IS_UNDEF);
                nIndex = p->h | ht->nTableMask;
 
                /* Insert into hash collision list */
@@ -246,7 +246,7 @@ static void zend_hash_clone_methods(HashTable *ht, HashTable *source, zend_class
        p = source->arData;
        end = p + source->nNumUsed;
        for (; p != end; p++) {
-               if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) continue;
+               ZEND_ASSERT(Z_TYPE(p->val) != IS_UNDEF);
 
                nIndex = p->h | ht->nTableMask;
 
@@ -304,7 +304,7 @@ static void zend_hash_clone_prop_info(HashTable *ht, HashTable *source, zend_cla
        p = source->arData;
        end = p + source->nNumUsed;
        for (; p != end; p++) {
-               if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) continue;
+               ZEND_ASSERT(Z_TYPE(p->val) != IS_UNDEF);
 
                nIndex = p->h | ht->nTableMask;
 
@@ -478,7 +478,7 @@ static void zend_accel_function_hash_copy(HashTable *target, HashTable *source)
        p = source->arData;
        end = p + source->nNumUsed;
        for (; p != end; p++) {
-               if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) continue;
+               ZEND_ASSERT(Z_TYPE(p->val) != IS_UNDEF);
                ZEND_ASSERT(p->key);
                t = zend_hash_find_ex(target, p->key, 1);
                if (UNEXPECTED(t != NULL)) {
@@ -522,7 +522,7 @@ static void zend_accel_function_hash_copy_from_shm(HashTable *target, HashTable
        p = source->arData;
        end = p + source->nNumUsed;
        for (; p != end; p++) {
-               if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) continue;
+               ZEND_ASSERT(Z_TYPE(p->val) != IS_UNDEF);
                ZEND_ASSERT(p->key);
                t = zend_hash_find_ex(target, p->key, 1);
                if (UNEXPECTED(t != NULL)) {
@@ -565,7 +565,7 @@ static void zend_accel_class_hash_copy(HashTable *target, HashTable *source, uni
        p = source->arData;
        end = p + source->nNumUsed;
        for (; p != end; p++) {
-               if (UNEXPECTED(Z_TYPE(p->val) == IS_UNDEF)) continue;
+               ZEND_ASSERT(Z_TYPE(p->val) != IS_UNDEF);
                ZEND_ASSERT(p->key);
                t = zend_hash_find_ex(target, p->key, 1);
                if (UNEXPECTED(t != NULL)) {
index 02e5978fb254a05d9595c6e43bdd16c6945877dc..abf17b7e914e0f328efbd637d677572245a37b1b 100644 (file)
@@ -419,7 +419,13 @@ uint32_t zend_accel_script_persist_calc(zend_persistent_script *new_persistent_s
        new_persistent_script->size = (new_persistent_script->size + 63) & ~63;
 #endif
 
+       if (new_persistent_script->script.class_table.nNumUsed != new_persistent_script->script.class_table.nNumOfElements) {
+               zend_hash_rehash(&new_persistent_script->script.class_table);
+       }
        zend_accel_persist_class_table_calc(&new_persistent_script->script.class_table);
+       if (new_persistent_script->script.function_table.nNumUsed != new_persistent_script->script.function_table.nNumOfElements) {
+               zend_hash_rehash(&new_persistent_script->script.function_table);
+       }
        zend_hash_persist_calc(&new_persistent_script->script.function_table, zend_persist_op_array_calc);
        zend_persist_op_array_calc_ex(&new_persistent_script->script.main_op_array);