@@ -36,7 +36,8 @@ static inline const char *phpdbg_decode_opcode(zend_uchar opcode) /* {{{ */
36
36
return "UNKNOWN" ;
37
37
} /* }}} */
38
38
39
- static inline char * phpdbg_decode_op (zend_op_array * ops , znode_op * op , uint32_t type ) /* {{{ */
39
+ static inline char * phpdbg_decode_op (
40
+ zend_op_array * ops , const znode_op * op , uint32_t type ) /* {{{ */
40
41
{
41
42
char * decode = NULL ;
42
43
@@ -62,91 +63,72 @@ static inline char *phpdbg_decode_op(zend_op_array *ops, znode_op *op, uint32_t
62
63
return decode ;
63
64
} /* }}} */
64
65
65
- char * phpdbg_decode_opline (zend_op_array * ops , zend_op * op ) /*{{{ */
66
+ char * phpdbg_decode_input_op (
67
+ zend_op_array * ops , const zend_op * opline , znode_op op , zend_uchar op_type ,
68
+ uint32_t flags ) {
69
+ char * result = NULL ;
70
+ if (op_type != IS_UNUSED ) {
71
+ result = phpdbg_decode_op (ops , & op , op_type );
72
+ } else if (ZEND_VM_OP_JMP_ADDR == (flags & ZEND_VM_OP_MASK )) {
73
+ spprintf (& result , 0 , "J%td" , OP_JMP_ADDR (opline , op ) - ops -> opcodes );
74
+ } else if (ZEND_VM_OP_NUM == (flags & ZEND_VM_OP_MASK )) {
75
+ spprintf (& result , 0 , "%" PRIu32 , op .num );
76
+ } else if (ZEND_VM_OP_TRY_CATCH == (flags & ZEND_VM_OP_MASK )) {
77
+ if (opline -> opcode != ZEND_FAST_RET || opline -> extended_value ) {
78
+ spprintf (& result , 0 , "try-catch(%" PRIu32 ")" , op .num );
79
+ }
80
+ } else if (ZEND_VM_OP_LIVE_RANGE == (flags & ZEND_VM_OP_MASK )) {
81
+ if (opline -> extended_value & ZEND_FREE_ON_RETURN ) {
82
+ spprintf (& result , 0 , "live-range(%" PRIu32 ")" , op .num );
83
+ }
84
+ } else if (ZEND_VM_OP_THIS == (flags & ZEND_VM_OP_MASK )) {
85
+ result = estrdup ("THIS" );
86
+ } else if (ZEND_VM_OP_NEXT == (flags & ZEND_VM_OP_MASK )) {
87
+ result = estrdup ("NEXT" );
88
+ } else if (ZEND_VM_OP_CLASS_FETCH == (flags & ZEND_VM_OP_MASK )) {
89
+ //zend_dump_class_fetch_type(op.num);
90
+ } else if (ZEND_VM_OP_CONSTRUCTOR == (flags & ZEND_VM_OP_MASK )) {
91
+ result = estrdup ("CONSTRUCTOR" );
92
+ }
93
+ return result ;
94
+ }
95
+
96
+ char * phpdbg_decode_opline (zend_op_array * ops , zend_op * opline ) /*{{{ */
66
97
{
67
- const char * opcode_name = phpdbg_decode_opcode (op -> opcode );
98
+ const char * opcode_name = phpdbg_decode_opcode (opline -> opcode );
99
+ uint32_t flags = zend_get_opcode_flags (opline -> opcode );
68
100
char * result , * decode [4 ] = {NULL , NULL , NULL , NULL };
69
101
70
102
/* EX */
71
- switch (op -> opcode ) {
103
+ switch (opline -> opcode ) {
72
104
case ZEND_FAST_CALL :
73
- if (op -> extended_value == ZEND_FAST_CALL_FROM_FINALLY ) {
105
+ if (opline -> extended_value == ZEND_FAST_CALL_FROM_FINALLY ) {
74
106
decode [0 ] = estrdup ("FAST_CALL<FROM_FINALLY>" );
75
107
}
76
108
break ;
77
109
case ZEND_FAST_RET :
78
- if (op -> extended_value != 0 ) {
110
+ if (opline -> extended_value != 0 ) {
79
111
spprintf (& decode [0 ], 0 , "FAST_RET<%s>" ,
80
- op -> extended_value == ZEND_FAST_RET_TO_CATCH ? "TO_CATCH" : "TO_FINALLY" );
112
+ opline -> extended_value == ZEND_FAST_RET_TO_CATCH ? "TO_CATCH" : "TO_FINALLY" );
81
113
}
82
114
break ;
83
115
}
84
116
85
117
/* OP1 */
86
- switch (op -> opcode ) {
87
- case ZEND_JMP :
88
- case ZEND_FAST_CALL :
89
- spprintf (& decode [1 ], 0 , "J%td" , OP_JMP_ADDR (op , op -> op1 ) - ops -> opcodes );
90
- break ;
91
-
92
- case ZEND_INIT_FCALL :
93
- case ZEND_RECV :
94
- case ZEND_RECV_INIT :
95
- case ZEND_RECV_VARIADIC :
96
- spprintf (& decode [1 ], 0 , "%" PRIu32 , op -> op1 .num );
97
- break ;
98
-
99
- default :
100
- decode [1 ] = phpdbg_decode_op (ops , & op -> op1 , op -> op1_type );
101
- break ;
102
- }
118
+ decode [1 ] = phpdbg_decode_input_op (
119
+ ops , opline , opline -> op1 , opline -> op1_type , ZEND_VM_OP1_FLAGS (flags ));
103
120
104
121
/* OP2 */
105
- switch (op -> opcode ) {
106
- case ZEND_JMPZNZ :
107
- spprintf (& decode [2 ], 0 , "J%td or J%td" ,
108
- OP_JMP_ADDR (op , op -> op2 ) - ops -> opcodes ,
109
- ZEND_OFFSET_TO_OPLINE (op , op -> extended_value ) - ops -> opcodes );
110
- break ;
111
-
112
- case ZEND_JMPZ :
113
- case ZEND_JMPNZ :
114
- case ZEND_JMPZ_EX :
115
- case ZEND_JMPNZ_EX :
116
- case ZEND_JMP_SET :
117
- case ZEND_ASSERT_CHECK :
118
- spprintf (& decode [2 ], 0 , "J%td" , OP_JMP_ADDR (op , op -> op2 ) - ops -> opcodes );
119
- break ;
120
-
121
- case ZEND_FAST_CALL :
122
- case ZEND_FAST_RET :
123
- if (op -> extended_value != 0 ) {
124
- spprintf (& decode [2 ], 0 , "%" PRIu32 , op -> op2 .num );
125
- }
126
- break ;
127
-
128
- case ZEND_SEND_VAL :
129
- case ZEND_SEND_VAL_EX :
130
- case ZEND_SEND_VAR :
131
- case ZEND_SEND_VAR_NO_REF :
132
- case ZEND_SEND_REF :
133
- case ZEND_SEND_VAR_EX :
134
- case ZEND_SEND_USER :
135
- spprintf (& decode [2 ], 0 , "%" PRIu32 , op -> op2 .num );
136
- break ;
137
-
138
- default :
139
- decode [2 ] = phpdbg_decode_op (ops , & op -> op2 , op -> op2_type );
140
- break ;
141
- }
122
+ decode [2 ] = phpdbg_decode_input_op (
123
+ ops , opline , opline -> op2 , opline -> op2_type , ZEND_VM_OP2_FLAGS (flags ));
142
124
143
125
/* RESULT */
144
- switch (op -> opcode ) {
126
+ switch (opline -> opcode ) {
145
127
case ZEND_CATCH :
146
- spprintf (& decode [3 ], 0 , "%" PRIu32 , op -> result .num );
128
+ spprintf (& decode [3 ], 0 , "%" PRIu32 , opline -> result .num );
147
129
break ;
148
130
default :
149
- decode [3 ] = phpdbg_decode_op (ops , & op -> result , op -> result_type );
131
+ decode [3 ] = phpdbg_decode_op (ops , & opline -> result , opline -> result_type );
150
132
break ;
151
133
}
152
134
0 commit comments