@@ -1333,6 +1333,44 @@ static zend_bool needs_live_range(zend_op_array *op_array, zend_op *def_opline)
1333
1333
return 1 ;
1334
1334
}
1335
1335
1336
+ void zend_foreach_op_array (zend_script * script , zend_op_array_func_t func , void * context )
1337
+ {
1338
+ zend_class_entry * ce ;
1339
+ zend_string * key ;
1340
+ zend_op_array * op_array ;
1341
+
1342
+ func (& script -> main_op_array , context );
1343
+
1344
+ ZEND_HASH_FOREACH_PTR (& script -> function_table , op_array ) {
1345
+ func (op_array , context );
1346
+ } ZEND_HASH_FOREACH_END ();
1347
+
1348
+ ZEND_HASH_FOREACH_STR_KEY_PTR (& script -> class_table , key , ce ) {
1349
+ if (ce -> refcount > 1 && !zend_string_equals_ci (key , ce -> name )) {
1350
+ continue ;
1351
+ }
1352
+ ZEND_HASH_FOREACH_PTR (& ce -> function_table , op_array ) {
1353
+ if (op_array -> scope == ce
1354
+ && op_array -> type == ZEND_USER_FUNCTION
1355
+ && !(op_array -> fn_flags & ZEND_ACC_TRAIT_CLONE )) {
1356
+ func (op_array , context );
1357
+ }
1358
+ } ZEND_HASH_FOREACH_END ();
1359
+ } ZEND_HASH_FOREACH_END ();
1360
+ }
1361
+
1362
+ static void step_optimize_op_array (zend_op_array * op_array , void * context ) {
1363
+ zend_optimize_op_array (op_array , (zend_optimizer_ctx * ) context );
1364
+ }
1365
+
1366
+ static void step_adjust_fcall_stack_size (zend_op_array * op_array , void * context ) {
1367
+ zend_adjust_fcall_stack_size (op_array , (zend_optimizer_ctx * ) context );
1368
+ }
1369
+
1370
+ static void step_dump_after_optimizer (zend_op_array * op_array , void * context ) {
1371
+ zend_dump_op_array (op_array , ZEND_DUMP_LIVE_RANGES , "after optimizer" , NULL );
1372
+ }
1373
+
1336
1374
int zend_optimize_script (zend_script * script , zend_long optimization_level , zend_long debug_level )
1337
1375
{
1338
1376
zend_class_entry * ce ;
@@ -1441,44 +1479,10 @@ int zend_optimize_script(zend_script *script, zend_long optimization_level, zend
1441
1479
ZEND_SET_FUNC_INFO (call_graph .op_arrays [i ], NULL );
1442
1480
}
1443
1481
} else {
1444
- zend_optimize_op_array (& script -> main_op_array , & ctx );
1445
-
1446
- ZEND_HASH_FOREACH_PTR (& script -> function_table , op_array ) {
1447
- zend_optimize_op_array (op_array , & ctx );
1448
- } ZEND_HASH_FOREACH_END ();
1449
-
1450
- ZEND_HASH_FOREACH_STR_KEY_PTR (& script -> class_table , key , ce ) {
1451
- if (ce -> refcount > 1 && !zend_string_equals_ci (key , ce -> name )) {
1452
- continue ;
1453
- }
1454
- ZEND_HASH_FOREACH_STR_KEY_PTR (& ce -> function_table , name , op_array ) {
1455
- if (op_array -> scope == ce
1456
- && op_array -> type == ZEND_USER_FUNCTION
1457
- && !(op_array -> fn_flags & ZEND_ACC_TRAIT_CLONE )) {
1458
- zend_optimize_op_array (op_array , & ctx );
1459
- }
1460
- } ZEND_HASH_FOREACH_END ();
1461
- } ZEND_HASH_FOREACH_END ();
1482
+ zend_foreach_op_array (script , step_optimize_op_array , & ctx );
1462
1483
1463
1484
if (ZEND_OPTIMIZER_PASS_12 & optimization_level ) {
1464
- zend_adjust_fcall_stack_size (& script -> main_op_array , & ctx );
1465
-
1466
- ZEND_HASH_FOREACH_PTR (& script -> function_table , op_array ) {
1467
- zend_adjust_fcall_stack_size (op_array , & ctx );
1468
- } ZEND_HASH_FOREACH_END ();
1469
-
1470
- ZEND_HASH_FOREACH_STR_KEY_PTR (& script -> class_table , key , ce ) {
1471
- if (ce -> refcount > 1 && !zend_string_equals_ci (key , ce -> name )) {
1472
- continue ;
1473
- }
1474
- ZEND_HASH_FOREACH_STR_KEY_PTR (& ce -> function_table , name , op_array ) {
1475
- if (op_array -> scope == ce
1476
- && op_array -> type == ZEND_USER_FUNCTION
1477
- && !(op_array -> fn_flags & ZEND_ACC_TRAIT_CLONE )) {
1478
- zend_adjust_fcall_stack_size (op_array , & ctx );
1479
- }
1480
- } ZEND_HASH_FOREACH_END ();
1481
- } ZEND_HASH_FOREACH_END ();
1485
+ zend_foreach_op_array (script , step_adjust_fcall_stack_size , & ctx );
1482
1486
}
1483
1487
}
1484
1488
@@ -1507,25 +1511,8 @@ int zend_optimize_script(zend_script *script, zend_long optimization_level, zend
1507
1511
} ZEND_HASH_FOREACH_END ();
1508
1512
1509
1513
if ((debug_level & ZEND_DUMP_AFTER_OPTIMIZER ) &&
1510
- (ZEND_OPTIMIZER_PASS_7 & optimization_level )) {
1511
- zend_dump_op_array (& script -> main_op_array ,
1512
- ZEND_DUMP_LIVE_RANGES , "after optimizer" , NULL );
1513
-
1514
- ZEND_HASH_FOREACH_PTR (& script -> function_table , op_array ) {
1515
- zend_dump_op_array (op_array ,
1516
- ZEND_DUMP_LIVE_RANGES , "after optimizer" , NULL );
1517
- } ZEND_HASH_FOREACH_END ();
1518
-
1519
- ZEND_HASH_FOREACH_PTR (& script -> class_table , ce ) {
1520
- ZEND_HASH_FOREACH_STR_KEY_PTR (& ce -> function_table , name , op_array ) {
1521
- if (op_array -> scope == ce
1522
- && op_array -> type == ZEND_USER_FUNCTION
1523
- && !(op_array -> fn_flags & ZEND_ACC_TRAIT_CLONE )) {
1524
- zend_dump_op_array (op_array ,
1525
- ZEND_DUMP_LIVE_RANGES , "after optimizer" , NULL );
1526
- }
1527
- } ZEND_HASH_FOREACH_END ();
1528
- } ZEND_HASH_FOREACH_END ();
1514
+ (ZEND_OPTIMIZER_PASS_7 & optimization_level )) {
1515
+ zend_foreach_op_array (script , step_dump_after_optimizer , NULL );
1529
1516
}
1530
1517
1531
1518
if (ctx .constants ) {
0 commit comments