]> granicus.if.org Git - php/commitdiff
Reslove inherited op_array references once afrer all optimizations.
authorDmitry Stogov <dmitry@zend.com>
Tue, 30 Oct 2018 10:16:49 +0000 (13:16 +0300)
committerDmitry Stogov <dmitry@zend.com>
Tue, 30 Oct 2018 10:16:49 +0000 (13:16 +0300)
ext/opcache/Optimizer/zend_optimizer.c

index 602627df7eddbcba8c9c52f613e4126650f14a84..5d2277a91928dab9fc54030474c408ad885cf860 100644 (file)
@@ -1444,13 +1444,6 @@ int zend_optimize_script(zend_script *script, zend_long optimization_level, zend
                ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->function_table, name, op_array) {
                        if (op_array->scope == ce) {
                                zend_optimize_op_array(op_array, &ctx);
-                       } else if (op_array->type == ZEND_USER_FUNCTION) {
-                               zend_op_array *orig_op_array;
-                               if ((orig_op_array = zend_hash_find_ptr(&op_array->scope->function_table, name)) != NULL) {
-                                       HashTable *ht = op_array->static_variables;
-                                       *op_array = *orig_op_array;
-                                       op_array->static_variables = ht;
-                               }
                        }
                } ZEND_HASH_FOREACH_END();
        } ZEND_HASH_FOREACH_END();
@@ -1540,19 +1533,6 @@ int zend_optimize_script(zend_script *script, zend_long optimization_level, zend
                        ZEND_SET_FUNC_INFO(call_graph.op_arrays[i], NULL);
                }
 
-               ZEND_HASH_FOREACH_PTR(&script->class_table, ce) {
-                       ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->function_table, name, op_array) {
-                               if (op_array->scope != ce && op_array->type == ZEND_USER_FUNCTION) {
-                                       zend_op_array *orig_op_array;
-                                       if ((orig_op_array = zend_hash_find_ptr(&op_array->scope->function_table, name)) != NULL) {
-                                               HashTable *ht = op_array->static_variables;
-                                               *op_array = *orig_op_array;
-                                               op_array->static_variables = ht;
-                                       }
-                               }
-                       } ZEND_HASH_FOREACH_END();
-               } ZEND_HASH_FOREACH_END();
-
                zend_arena_release(&ctx.arena, checkpoint);
        } else
 #endif
@@ -1568,18 +1548,28 @@ int zend_optimize_script(zend_script *script, zend_long optimization_level, zend
                        ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->function_table, name, op_array) {
                                if (op_array->scope == ce) {
                                        zend_adjust_fcall_stack_size(op_array, &ctx);
-                               } else if (op_array->type == ZEND_USER_FUNCTION) {
-                                       zend_op_array *orig_op_array;
-                                       if ((orig_op_array = zend_hash_find_ptr(&op_array->scope->function_table, name)) != NULL) {
-                                               HashTable *ht = op_array->static_variables;
-                                               *op_array = *orig_op_array;
-                                               op_array->static_variables = ht;
-                                       }
                                }
                        } ZEND_HASH_FOREACH_END();
                } ZEND_HASH_FOREACH_END();
        }
 
+       ZEND_HASH_FOREACH_PTR(&script->class_table, ce) {
+               ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->function_table, name, op_array) {
+                       if (op_array->scope != ce && op_array->type == ZEND_USER_FUNCTION) {
+                               zend_op_array *orig_op_array =
+                                       zend_hash_find_ptr(&op_array->scope->function_table, name);
+
+                               ZEND_ASSERT(orig_op_array != NULL);
+                               if (orig_op_array != op_array) {
+                                       HashTable *ht = op_array->static_variables;
+
+                                       *op_array = *orig_op_array;
+                                       op_array->static_variables = ht;
+                               }
+                       }
+               } ZEND_HASH_FOREACH_END();
+       } ZEND_HASH_FOREACH_END();
+
        if ((debug_level & ZEND_DUMP_AFTER_OPTIMIZER) &&
            (ZEND_OPTIMIZER_PASS_7 & optimization_level)) {
                zend_dump_op_array(&script->main_op_array, ZEND_DUMP_RT_CONSTANTS, "after optimizer", NULL);