diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c index 602627df7ed..5d2277a9192 100644 --- a/ext/opcache/Optimizer/zend_optimizer.c +++ b/ext/opcache/Optimizer/zend_optimizer.c @@ -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);