@@ -402,23 +402,17 @@ static void zend_dump_range_constraint(const zend_op_array *op_array, const zend
402
402
}
403
403
}
404
404
405
- static void zend_dump_op (const zend_op_array * op_array , const zend_basic_block * b , const zend_op * opline , uint32_t dump_flags , const void * data )
405
+ void zend_dump_op (const zend_op_array * op_array , const zend_basic_block * b , const zend_op * opline , uint32_t dump_flags , const void * data )
406
406
{
407
407
const char * name = zend_get_opcode_name (opline -> opcode );
408
408
uint32_t flags = zend_get_opcode_flags (opline -> opcode );
409
409
uint32_t n = 0 ;
410
- int len = 0 ;
411
410
const zend_ssa * ssa = NULL ;
412
411
413
412
if (dump_flags & ZEND_DUMP_SSA ) {
414
413
ssa = (const zend_ssa * )data ;
415
414
}
416
415
417
- if (!b ) {
418
- len = fprintf (stderr , "L%u (%u):" , (uint32_t )(opline - op_array -> opcodes ), opline -> lineno );
419
- }
420
- fprintf (stderr , "%*c" , 12 - len , ' ' );
421
-
422
416
if (!ssa || !ssa -> ops || ssa -> ops [opline - op_array -> opcodes ].result_use < 0 ) {
423
417
if (opline -> result_type & (IS_CV |IS_VAR |IS_TMP_VAR )) {
424
418
if (ssa && ssa -> ops && ssa -> ops [opline - op_array -> opcodes ].result_def >= 0 ) {
@@ -611,7 +605,9 @@ static void zend_dump_op(const zend_op_array *op_array, const zend_basic_block *
611
605
} else {
612
606
uint32_t op1_flags = ZEND_VM_OP1_FLAGS (flags );
613
607
if (ZEND_VM_OP_JMP_ADDR == (op1_flags & ZEND_VM_OP_MASK )) {
614
- if (b ) {
608
+ if (dump_flags & ZEND_DUMP_NUMERIC_OPLINES ) {
609
+ fprintf (stderr , " %04u" , (uint32_t )(OP_JMP_ADDR (opline , opline -> op1 ) - op_array -> opcodes ));
610
+ } else if (b ) {
615
611
fprintf (stderr , " BB%d" , b -> successors [n ++ ]);
616
612
} else {
617
613
fprintf (stderr , " L%u" , (uint32_t )(OP_JMP_ADDR (opline , opline -> op1 ) - op_array -> opcodes ));
@@ -634,7 +630,9 @@ static void zend_dump_op(const zend_op_array *op_array, const zend_basic_block *
634
630
} else {
635
631
fprintf (stderr , " " ZEND_LONG_FMT ":" , num_key );
636
632
}
637
- if (b ) {
633
+ if (dump_flags & ZEND_DUMP_NUMERIC_OPLINES ) {
634
+ fprintf (stderr , " %04u," , (uint32_t )ZEND_OFFSET_TO_OPLINE_NUM (op_array , opline , Z_LVAL_P (zv )));
635
+ } else if (b ) {
638
636
fprintf (stderr , " BB%d," , b -> successors [n ++ ]);
639
637
} else {
640
638
fprintf (stderr , " L%u," , (uint32_t )ZEND_OFFSET_TO_OPLINE_NUM (op_array , opline , Z_LVAL_P (zv )));
@@ -669,7 +667,9 @@ static void zend_dump_op(const zend_op_array *op_array, const zend_basic_block *
669
667
uint32_t op2_flags = ZEND_VM_OP2_FLAGS (flags );
670
668
if (ZEND_VM_OP_JMP_ADDR == (op2_flags & ZEND_VM_OP_MASK )) {
671
669
if (opline -> opcode != ZEND_CATCH || !(opline -> extended_value & ZEND_LAST_CATCH )) {
672
- if (b ) {
670
+ if (dump_flags & ZEND_DUMP_NUMERIC_OPLINES ) {
671
+ fprintf (stderr , " %04u" , (uint32_t )(OP_JMP_ADDR (opline , opline -> op2 ) - op_array -> opcodes ));
672
+ } else if (b ) {
673
673
fprintf (stderr , " BB%d" , b -> successors [n ++ ]);
674
674
} else {
675
675
fprintf (stderr , " L%u" , (uint32_t )(OP_JMP_ADDR (opline , opline -> op2 ) - op_array -> opcodes ));
@@ -681,7 +681,9 @@ static void zend_dump_op(const zend_op_array *op_array, const zend_basic_block *
681
681
}
682
682
683
683
if (ZEND_VM_EXT_JMP_ADDR == (flags & ZEND_VM_EXT_MASK )) {
684
- if (b ) {
684
+ if (dump_flags & ZEND_DUMP_NUMERIC_OPLINES ) {
685
+ fprintf (stderr , " %04u" , (uint32_t )ZEND_OFFSET_TO_OPLINE_NUM (op_array , opline , opline -> extended_value ));
686
+ } else if (b ) {
685
687
fprintf (stderr , " BB%d" , b -> successors [n ++ ]);
686
688
} else {
687
689
fprintf (stderr , " L%u" , (uint32_t )ZEND_OFFSET_TO_OPLINE_NUM (op_array , opline , opline -> extended_value ));
@@ -716,6 +718,20 @@ static void zend_dump_op(const zend_op_array *op_array, const zend_basic_block *
716
718
}
717
719
}
718
720
}
721
+ }
722
+
723
+ static void zend_dump_op_line (const zend_op_array * op_array , const zend_basic_block * b , const zend_op * opline , uint32_t dump_flags , const void * data )
724
+ {
725
+ int len = 0 ;
726
+
727
+ if (dump_flags & ZEND_DUMP_NUMERIC_OPLINES ) {
728
+ len = fprintf (stderr , "%04u:" , (uint32_t )(opline - op_array -> opcodes ));
729
+ } else if (!b ) {
730
+ len = fprintf (stderr , "L%u (%u):" , (uint32_t )(opline - op_array -> opcodes ), opline -> lineno );
731
+ }
732
+ fprintf (stderr , "%*c" , 12 - len , ' ' );
733
+
734
+ zend_dump_op (op_array , b , opline , dump_flags , data );
719
735
fprintf (stderr , "\n" );
720
736
}
721
737
@@ -997,15 +1013,18 @@ void zend_dump_op_array(const zend_op_array *op_array, uint32_t dump_flags, cons
997
1013
opline = op_array -> opcodes + b -> start ;
998
1014
end = opline + b -> len ;
999
1015
while (opline < end ) {
1000
- zend_dump_op (op_array , b , opline , dump_flags , data );
1016
+ zend_dump_op_line (op_array , b , opline , dump_flags , data );
1001
1017
opline ++ ;
1002
1018
}
1003
1019
}
1004
1020
}
1005
1021
if (op_array -> last_live_range && (dump_flags & ZEND_DUMP_LIVE_RANGES )) {
1006
1022
fprintf (stderr , "LIVE RANGES:\n" );
1007
1023
for (i = 0 ; i < op_array -> last_live_range ; i ++ ) {
1008
- fprintf (stderr , " %u: L%u - L%u " ,
1024
+ fprintf (stderr ,
1025
+ (dump_flags & ZEND_DUMP_NUMERIC_OPLINES ) ?
1026
+ " %u: %04u - %04u " :
1027
+ " %u: L%u - L%u " ,
1009
1028
EX_VAR_TO_NUM (op_array -> live_range [i ].var & ~ZEND_LIVE_MASK ),
1010
1029
op_array -> live_range [i ].start ,
1011
1030
op_array -> live_range [i ].end );
@@ -1058,13 +1077,16 @@ void zend_dump_op_array(const zend_op_array *op_array, uint32_t dump_flags, cons
1058
1077
const zend_op * end = opline + op_array -> last ;
1059
1078
1060
1079
while (opline < end ) {
1061
- zend_dump_op (op_array , NULL , opline , dump_flags , data );
1080
+ zend_dump_op_line (op_array , NULL , opline , dump_flags , data );
1062
1081
opline ++ ;
1063
1082
}
1064
1083
if (op_array -> last_live_range && (dump_flags & ZEND_DUMP_LIVE_RANGES )) {
1065
1084
fprintf (stderr , "LIVE RANGES:\n" );
1066
1085
for (i = 0 ; i < op_array -> last_live_range ; i ++ ) {
1067
- fprintf (stderr , " %u: L%u - L%u " ,
1086
+ fprintf (stderr ,
1087
+ (dump_flags & ZEND_DUMP_NUMERIC_OPLINES ) ?
1088
+ " %u: %04u - %04u " :
1089
+ " %u: L%u - L%u " ,
1068
1090
EX_VAR_TO_NUM (op_array -> live_range [i ].var & ~ZEND_LIVE_MASK ),
1069
1091
op_array -> live_range [i ].start ,
1070
1092
op_array -> live_range [i ].end );
@@ -1090,22 +1112,35 @@ void zend_dump_op_array(const zend_op_array *op_array, uint32_t dump_flags, cons
1090
1112
if (op_array -> last_try_catch ) {
1091
1113
fprintf (stderr , "EXCEPTION TABLE:\n" );
1092
1114
for (i = 0 ; i < op_array -> last_try_catch ; i ++ ) {
1093
- fprintf (stderr , " L%u" ,
1115
+ fprintf (stderr ,
1116
+ (dump_flags & ZEND_DUMP_NUMERIC_OPLINES ) ?
1117
+ " %04u" :
1118
+ " L%u" ,
1094
1119
op_array -> try_catch_array [i ].try_op );
1120
+
1095
1121
if (op_array -> try_catch_array [i ].catch_op ) {
1096
- fprintf (stderr , ", L%u" ,
1122
+ fprintf (stderr ,
1123
+ (dump_flags & ZEND_DUMP_NUMERIC_OPLINES ) ?
1124
+ ", %04u" :
1125
+ ", L%u" ,
1097
1126
op_array -> try_catch_array [i ].catch_op );
1098
1127
} else {
1099
1128
fprintf (stderr , ", -" );
1100
1129
}
1101
1130
if (op_array -> try_catch_array [i ].finally_op ) {
1102
- fprintf (stderr , ", L%u" ,
1131
+ fprintf (stderr ,
1132
+ (dump_flags & ZEND_DUMP_NUMERIC_OPLINES ) ?
1133
+ ", %04u" :
1134
+ ", L%u" ,
1103
1135
op_array -> try_catch_array [i ].finally_op );
1104
1136
} else {
1105
1137
fprintf (stderr , ", -" );
1106
1138
}
1107
1139
if (op_array -> try_catch_array [i ].finally_end ) {
1108
- fprintf (stderr , ", L%u\n" ,
1140
+ fprintf (stderr ,
1141
+ (dump_flags & ZEND_DUMP_NUMERIC_OPLINES ) ?
1142
+ ", %04u" :
1143
+ ", L%u\n" ,
1109
1144
op_array -> try_catch_array [i ].finally_end );
1110
1145
} else {
1111
1146
fprintf (stderr , ", -\n" );
0 commit comments