@@ -51,7 +51,24 @@ static inline char *phpdbg_decode_op(zend_op_array *ops, znode_op *op, uint32_t
5151
5252char * phpdbg_decode_opline (zend_op_array * ops , zend_op * op ) /*{{{ */
5353{
54- char * decode [4 ] = {NULL , NULL , NULL , NULL };
54+ const char * opcode_name = phpdbg_decode_opcode (op -> opcode );
55+ char * result , * decode [4 ] = {NULL , NULL , NULL , NULL };
56+
57+ /* EX */
58+ switch (op -> opcode ) {
59+ case ZEND_FAST_CALL :
60+ if (op -> extended_value != 0 ) {
61+ asprintf (& decode [0 ], "FAST_CALL<%s>" ,
62+ op -> extended_value == ZEND_FAST_CALL_FROM_CATCH ? "FROM_CATCH" : "FROM_FINALLY" );
63+ }
64+ break ;
65+ case ZEND_FAST_RET :
66+ if (op -> extended_value != 0 ) {
67+ asprintf (& decode [0 ], "FAST_RET<%s>" ,
68+ op -> extended_value == ZEND_FAST_RET_TO_CATCH ? "TO_CATCH" : "TO_FINALLY" );
69+ }
70+ break ;
71+ }
5572
5673 /* OP1 */
5774 switch (op -> opcode ) {
@@ -74,9 +91,8 @@ char *phpdbg_decode_opline(zend_op_array *ops, zend_op *op) /*{{{ */
7491
7592 /* OP2 */
7693 switch (op -> opcode ) {
77- /* TODO: ZEND_FAST_CALL, ZEND_FAST_RET op2 */
7894 case ZEND_JMPZNZ :
79- asprintf (& decode [2 ], "J%u or J%" PRIu32 , OP_JMP_ADDR (op , op -> op2 ) - ops -> opcodes , ZEND_OFFSET_TO_OPLINE (op , op -> extended_value ) - ops -> opcodes );
95+ asprintf (& decode [2 ], "J%ld or J%ld" , OP_JMP_ADDR (op , op -> op2 ) - ops -> opcodes , ZEND_OFFSET_TO_OPLINE (op , op -> extended_value ) - ops -> opcodes );
8096 break ;
8197
8298 case ZEND_JMPZ :
@@ -88,6 +104,13 @@ char *phpdbg_decode_opline(zend_op_array *ops, zend_op *op) /*{{{ */
88104 asprintf (& decode [2 ], "J%ld" , OP_JMP_ADDR (op , op -> op2 ) - ops -> opcodes );
89105 break ;
90106
107+ case ZEND_FAST_CALL :
108+ case ZEND_FAST_RET :
109+ if (op -> extended_value != 0 ) {
110+ asprintf (& decode [2 ], "J%" PRIu32 , op -> op2 .opline_num );
111+ }
112+ break ;
113+
91114 case ZEND_SEND_VAL :
92115 case ZEND_SEND_VAL_EX :
93116 case ZEND_SEND_VAR :
@@ -113,20 +136,23 @@ char *phpdbg_decode_opline(zend_op_array *ops, zend_op *op) /*{{{ */
113136 break ;
114137 }
115138
116- asprintf (& decode [0 ],
117- "%-20s %-20s %-20s" ,
139+ asprintf (& result ,
140+ "%-23s %-20s %-20s %-20s" ,
141+ decode [0 ] ? decode [0 ] : opcode_name ,
118142 decode [1 ] ? decode [1 ] : "" ,
119143 decode [2 ] ? decode [2 ] : "" ,
120144 decode [3 ] ? decode [3 ] : "" );
121145
146+ if (decode [0 ])
147+ free (decode [0 ]);
122148 if (decode [1 ])
123149 free (decode [1 ]);
124150 if (decode [2 ])
125151 free (decode [2 ]);
126152 if (decode [3 ])
127153 free (decode [3 ]);
128154
129- return decode [ 0 ] ;
155+ return result ;
130156} /* }}} */
131157
132158void phpdbg_print_opline_ex (zend_execute_data * execute_data , zend_bool ignore_flags ) /* {{{ */
@@ -142,19 +168,17 @@ void phpdbg_print_opline_ex(zend_execute_data *execute_data, zend_bool ignore_fl
142168
143169 if (ignore_flags || (!(PHPDBG_G (flags ) & PHPDBG_IS_QUIET ) || (PHPDBG_G (flags ) & PHPDBG_IS_STEPPING ))) {
144170 /* output line info */
145- phpdbg_notice ("opline" , "line=\"%u\" opline=\"%p\" opcode=\"%s\" op=\"%s\" file=\"%s\"" , "L%-5u %16p %-30s %s %s" ,
171+ phpdbg_notice ("opline" , "line=\"%u\" opline=\"%p\" op=\"%s\" file=\"%s\"" , "L%-5u %16p %s %s" ,
146172 opline -> lineno ,
147173 opline ,
148- phpdbg_decode_opcode (opline -> opcode ),
149174 decode ,
150175 execute_data -> func -> op_array .filename ? ZSTR_VAL (execute_data -> func -> op_array .filename ) : "unknown" );
151176 }
152177
153178 if (!ignore_flags && PHPDBG_G (oplog )) {
154- phpdbg_log_ex (fileno (PHPDBG_G (oplog )), "L%-5u %16p %-30s % s %s" ,
179+ phpdbg_log_ex (fileno (PHPDBG_G (oplog )), "L%-5u %16p %s %s" ,
155180 opline -> lineno ,
156181 opline ,
157- phpdbg_decode_opcode (opline -> opcode ),
158182 decode ,
159183 execute_data -> func -> op_array .filename ? ZSTR_VAL (execute_data -> func -> op_array .filename ) : "unknown" );
160184 }
@@ -182,5 +206,8 @@ void phpdbg_print_opline(zend_execute_data *execute_data, zend_bool ignore_flags
182206const char * phpdbg_decode_opcode (zend_uchar opcode ) /* {{{ */
183207{
184208 const char * ret = zend_get_opcode_name (opcode );
185- return ret ?ret :"UNKNOWN" ;
209+ if (ret ) {
210+ return ret + 5 ; /* Skip ZEND_ prefix */
211+ }
212+ return "UNKNOWN" ;
186213} /* }}} */
0 commit comments