@@ -1421,6 +1421,7 @@ static void zend_adjust_fcall_stack_size_graph(zend_op_array *op_array)
14211421int zend_optimize_script (zend_script * script , zend_long optimization_level , zend_long debug_level )
14221422{
14231423 zend_class_entry * ce ;
1424+ zend_string * key ;
14241425 zend_op_array * op_array ;
14251426 zend_string * name ;
14261427 zend_optimizer_ctx ctx ;
@@ -1440,9 +1441,12 @@ int zend_optimize_script(zend_script *script, zend_long optimization_level, zend
14401441 zend_optimize_op_array (op_array , & ctx );
14411442 } ZEND_HASH_FOREACH_END ();
14421443
1443- ZEND_HASH_FOREACH_PTR (& script -> class_table , ce ) {
1444+ ZEND_HASH_FOREACH_STR_KEY_PTR (& script -> class_table , key , ce ) {
1445+ if (ce -> refcount > 1 && !zend_string_equals_ci (key , ce -> name )) {
1446+ continue ;
1447+ }
14441448 ZEND_HASH_FOREACH_STR_KEY_PTR (& ce -> function_table , name , op_array ) {
1445- if (op_array -> scope == ce ) {
1449+ if (op_array -> scope == ce && !( op_array -> fn_flags & ZEND_ACC_TRAIT_CLONE ) ) {
14461450 zend_optimize_op_array (op_array , & ctx );
14471451 }
14481452 } ZEND_HASH_FOREACH_END ();
@@ -1544,27 +1548,35 @@ int zend_optimize_script(zend_script *script, zend_long optimization_level, zend
15441548 zend_adjust_fcall_stack_size (op_array , & ctx );
15451549 } ZEND_HASH_FOREACH_END ();
15461550
1547- ZEND_HASH_FOREACH_PTR (& script -> class_table , ce ) {
1551+ ZEND_HASH_FOREACH_STR_KEY_PTR (& script -> class_table , key , ce ) {
1552+ if (ce -> refcount > 1 && !zend_string_equals_ci (key , ce -> name )) {
1553+ continue ;
1554+ }
15481555 ZEND_HASH_FOREACH_STR_KEY_PTR (& ce -> function_table , name , op_array ) {
1549- if (op_array -> scope == ce ) {
1556+ if (op_array -> scope == ce && !( op_array -> fn_flags & ZEND_ACC_TRAIT_CLONE ) ) {
15501557 zend_adjust_fcall_stack_size (op_array , & ctx );
15511558 }
15521559 } ZEND_HASH_FOREACH_END ();
15531560 } ZEND_HASH_FOREACH_END ();
15541561 }
15551562
1556- ZEND_HASH_FOREACH_PTR (& script -> class_table , ce ) {
1563+ ZEND_HASH_FOREACH_STR_KEY_PTR (& script -> class_table , key , ce ) {
1564+ if (ce -> refcount > 1 && !zend_string_equals_ci (key , ce -> name )) {
1565+ continue ;
1566+ }
15571567 ZEND_HASH_FOREACH_STR_KEY_PTR (& ce -> function_table , name , op_array ) {
15581568 if (op_array -> scope != ce && op_array -> type == ZEND_USER_FUNCTION ) {
15591569 zend_op_array * orig_op_array =
15601570 zend_hash_find_ptr (& op_array -> scope -> function_table , name );
15611571
15621572 ZEND_ASSERT (orig_op_array != NULL );
15631573 if (orig_op_array != op_array ) {
1574+ uint32_t fn_flags = op_array -> fn_flags ;
15641575 zend_function * prototype = op_array -> prototype ;
15651576 HashTable * ht = op_array -> static_variables ;
15661577
15671578 * op_array = * orig_op_array ;
1579+ op_array -> fn_flags = fn_flags ;
15681580 op_array -> prototype = prototype ;
15691581 op_array -> static_variables = ht ;
15701582 }
@@ -1582,7 +1594,7 @@ int zend_optimize_script(zend_script *script, zend_long optimization_level, zend
15821594
15831595 ZEND_HASH_FOREACH_PTR (& script -> class_table , ce ) {
15841596 ZEND_HASH_FOREACH_STR_KEY_PTR (& ce -> function_table , name , op_array ) {
1585- if (op_array -> scope == ce ) {
1597+ if (op_array -> scope == ce && !( op_array -> fn_flags & ZEND_ACC_TRAIT_CLONE ) ) {
15861598 zend_dump_op_array (op_array , ZEND_DUMP_RT_CONSTANTS , "after optimizer" , NULL );
15871599 }
15881600 } ZEND_HASH_FOREACH_END ();
0 commit comments