@@ -106,8 +106,7 @@ static inline char *phpdbg_decode_op(zend_op_array *ops, znode_op *op, uint32_t
106106 } break ;
107107
108108 case IS_UNUSED :
109- asprintf (& decode , "<unused>" );
110- break ;
109+ return NULL ;
111110 }
112111 return decode ;
113112} /* }}} */
@@ -116,43 +115,72 @@ char *phpdbg_decode_opline(zend_op_array *ops, zend_op *op, HashTable *vars) /*{
116115{
117116 char * decode [4 ] = {NULL , NULL , NULL , NULL };
118117
118+ /* OP1 */
119119 switch (op -> opcode ) {
120120 case ZEND_JMP :
121121 case ZEND_GOTO :
122122 case ZEND_FAST_CALL :
123123 asprintf (& decode [1 ], "J%ld" , OP_JMP_ADDR (op , op -> op1 ) - ops -> opcodes );
124- goto format ;
124+ break ;
125125
126- case ZEND_JMPZNZ :
126+ case ZEND_INIT_FCALL :
127+ case ZEND_RECV :
128+ case ZEND_RECV_INIT :
129+ case ZEND_RECV_VARIADIC :
130+ asprintf (& decode [1 ], "%" PRIu32 , op -> op1 .num );
131+ break ;
132+
133+ default :
127134 decode [1 ] = phpdbg_decode_op (ops , & op -> op1 , op -> op1_type , vars );
135+ break ;
136+ }
137+
138+ /* OP2 */
139+ switch (op -> opcode ) {
140+ /* TODO: ZEND_FAST_CALL, ZEND_FAST_RET op2 */
141+ case ZEND_JMPZNZ :
128142 asprintf (& decode [2 ], "J%u or J%" PRIu32 , op -> op2 .opline_num , op -> extended_value );
129- goto result ;
143+ break ;
130144
131145 case ZEND_JMPZ :
132146 case ZEND_JMPNZ :
133147 case ZEND_JMPZ_EX :
134148 case ZEND_JMPNZ_EX :
135149 case ZEND_JMP_SET :
136- decode [1 ] = phpdbg_decode_op (ops , & op -> op1 , op -> op1_type , vars );
137150 asprintf (& decode [2 ], "J%ld" , OP_JMP_ADDR (op , op -> op2 ) - ops -> opcodes );
138- goto result ;
151+ break ;
139152
140- case ZEND_RECV_INIT :
141- goto result ;
153+ case ZEND_SEND_VAL :
154+ case ZEND_SEND_VAL_EX :
155+ case ZEND_SEND_VAR :
156+ case ZEND_SEND_VAR_NO_REF :
157+ case ZEND_SEND_REF :
158+ case ZEND_SEND_VAR_EX :
159+ case ZEND_SEND_USER :
160+ asprintf (& decode [2 ], "%" PRIu32 , op -> op2 .num );
161+ break ;
142162
143163 default :
144- decode [1 ] = phpdbg_decode_op (ops , & op -> op1 , op -> op1_type , vars );
145164 decode [2 ] = phpdbg_decode_op (ops , & op -> op2 , op -> op2_type , vars );
146- result :
165+ break ;
166+ }
167+
168+ /* RESULT */
169+ switch (op -> opcode ) {
170+ case ZEND_CATCH :
171+ asprintf (& decode [2 ], "%" PRIu32 , op -> result .num );
172+ break ;
173+ default :
147174 decode [3 ] = phpdbg_decode_op (ops , & op -> result , op -> result_type , vars );
148- format :
149- asprintf (& decode [0 ],
150- "%-20s %-20s %-20s" ,
151- decode [1 ] ? decode [1 ] : "" ,
152- decode [2 ] ? decode [2 ] : "" ,
153- decode [3 ] ? decode [3 ] : "" );
175+ break ;
154176 }
155177
178+ asprintf (& decode [0 ],
179+ "%-20s %-20s %-20s" ,
180+ decode [1 ] ? decode [1 ] : "" ,
181+ decode [2 ] ? decode [2 ] : "" ,
182+ decode [3 ] ? decode [3 ] : "" );
183+
156184 if (decode [1 ])
157185 free (decode [1 ]);
158186 if (decode [2 ])
0 commit comments