Skip to content

Commit a1ef8b4

Browse files
committed
Improve phpdbg opcode dump
Don't show <unused>, just don't display anything instead. Dump nums used in op1/op2/result, e.g. for SEND, RECV etc. Split the switch into three parts, one for each operand.
1 parent fc8143f commit a1ef8b4

File tree

2 files changed

+49
-21
lines changed

2 files changed

+49
-21
lines changed

sapi/phpdbg/phpdbg_opcode.c

Lines changed: 45 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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])

sapi/phpdbg/tests/commands/0102_print.test

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@
66
#################################################
77
#[User Class: test (3 methods)]
88
#L%d-%d test::testMethod() %s - 0x%s + 1 ops
9-
# L%d #0 RETURN null <unused> <unused>
9+
# L%d #0 RETURN null
1010
#L%d-%d test::testPrivateMethod() %s - 0x%s + 1 ops
11-
# L%d #0 RETURN null <unused> <unused>
11+
# L%d #0 RETURN null
1212
#L%d-%d test::testProtectedMethod() %s - 0x%s + 1 ops
13-
# L%d #0 RETURN null <unused> <unused>
13+
# L%d #0 RETURN null
1414
#[User Method testMethod (1 ops)]
1515
#L%d-%d test::testMethod() %s - 0x%s + 1 ops
16-
# L%d #0 RETURN null <unused> <unused>
16+
# L%d #0 RETURN null
1717
#################################################
1818
<:
1919
class test {

0 commit comments

Comments
 (0)