23
23
#include "zend_compile.h"
24
24
#include "phpdbg_opcode.h"
25
25
#include "phpdbg_utils.h"
26
+ #include "ext/standard/php_string.h"
26
27
27
28
ZEND_EXTERN_MODULE_GLOBALS (phpdbg );
28
29
@@ -63,9 +64,59 @@ static inline char *phpdbg_decode_op(zend_op_array *ops, znode_op *op, uint32_t
63
64
asprintf (& decode , "@" ZEND_ULONG_FMT , id );
64
65
} break ;
65
66
66
- case IS_CONST :
67
- asprintf (& decode , "C%u" , phpdbg_decode_literal (ops , RT_CONSTANT (ops , * op )));
68
- break ;
67
+ case IS_CONST : {
68
+ zval * literal = RT_CONSTANT (ops , * op );
69
+ switch (Z_TYPE_P (literal )) {
70
+ case IS_UNDEF :
71
+ decode = zend_strndup ("" , 0 );
72
+ break ;
73
+ case IS_NULL :
74
+ decode = zend_strndup (ZEND_STRL ("null" ));
75
+ break ;
76
+ case IS_FALSE :
77
+ decode = zend_strndup (ZEND_STRL ("false" ));
78
+ break ;
79
+ case IS_TRUE :
80
+ decode = zend_strndup (ZEND_STRL ("true" ));
81
+ break ;
82
+ case IS_LONG :
83
+ asprintf (& decode , "%lld" , Z_LVAL_P (literal ));
84
+ break ;
85
+ case IS_DOUBLE :
86
+ asprintf (& decode , "%.*G" , 14 , Z_DVAL_P (literal ));
87
+ break ;
88
+ case IS_STRING : {
89
+ int i ;
90
+ zend_string * str = php_addcslashes (Z_STR_P (literal ), 0 , "\\\"" , 2 );
91
+ for (i = 0 ; i < str -> len ; i ++ ) {
92
+ if (str -> val [i ] < 32 ) {
93
+ str -> val [i ] = ' ' ;
94
+ }
95
+ }
96
+ asprintf (& decode , "\"%.*s\"%c" , str -> len <= 18 ? (int ) str -> len : 17 , str -> val , str -> len <= 18 ? 0 : '+' );
97
+ zend_string_release (str );
98
+ } break ;
99
+ case IS_RESOURCE :
100
+ asprintf (& decode , "Rsrc #%d" , Z_RES_HANDLE_P (literal ));
101
+ break ;
102
+ case IS_ARRAY :
103
+ asprintf (& decode , "array(%d)" , zend_hash_num_elements (Z_ARR_P (literal )));
104
+ break ;
105
+ case IS_OBJECT : {
106
+ zend_string * str = Z_OBJCE_P (literal )-> name ;
107
+ asprintf (& decode , "%.*s%c" , str -> len <= 18 ? (int ) str -> len : 18 , str -> val , str -> len <= 18 ? 0 : '+' );
108
+ } break ;
109
+ case IS_CONSTANT :
110
+ decode = zend_strndup (ZEND_STRL ("<constant>" ));
111
+ break ;
112
+ case IS_CONSTANT_AST :
113
+ decode = zend_strndup (ZEND_STRL ("<ast>" ));
114
+ break ;
115
+ default :
116
+ asprintf (& decode , "unknown type: %d" , Z_TYPE_P (literal ));
117
+ break ;
118
+ }
119
+ } break ;
69
120
70
121
case IS_UNUSED :
71
122
asprintf (& decode , "<unused>" );
@@ -80,47 +131,39 @@ char *phpdbg_decode_opline(zend_op_array *ops, zend_op *op, HashTable *vars) /*{
80
131
81
132
switch (op -> opcode ) {
82
133
case ZEND_JMP :
83
- #ifdef ZEND_GOTO
84
134
case ZEND_GOTO :
85
- #endif
86
- #ifdef ZEND_FAST_CALL
87
135
case ZEND_FAST_CALL :
88
- #endif
89
- asprintf (& decode [1 ], "J%ld" , OP_JMP_ADDR (op , op -> op1 ) - ops -> opcodes );
136
+ asprintf (& decode [1 ], "J%ld" , OP_JMP_ADDR (op , op -> op1 ) - ops -> opcodes );
90
137
goto format ;
91
138
92
139
case ZEND_JMPZNZ :
93
- decode [1 ] = phpdbg_decode_op (ops , & op -> op1 , op -> op1_type , vars );
94
- asprintf (& decode [2 ], "J%u or J%" PRIu32 , op -> op2 .opline_num , op -> extended_value );
140
+ decode [1 ] = phpdbg_decode_op (ops , & op -> op1 , op -> op1_type , vars );
141
+ asprintf (& decode [2 ], "J%u or J%" PRIu32 , op -> op2 .opline_num , op -> extended_value );
95
142
goto result ;
96
143
97
144
case ZEND_JMPZ :
98
145
case ZEND_JMPNZ :
99
146
case ZEND_JMPZ_EX :
100
147
case ZEND_JMPNZ_EX :
101
-
102
- #ifdef ZEND_JMP_SET
103
148
case ZEND_JMP_SET :
104
- #endif
105
149
decode [1 ] = phpdbg_decode_op (ops , & op -> op1 , op -> op1_type , vars );
106
150
asprintf (& decode [2 ], "J%ld" , OP_JMP_ADDR (op , op -> op2 ) - ops -> opcodes );
107
- goto result ;
151
+ goto result ;
108
152
109
153
case ZEND_RECV_INIT :
110
154
goto result ;
111
155
112
- default : {
113
- decode [1 ] = phpdbg_decode_op (ops , & op -> op1 , op -> op1_type , vars );
114
- decode [2 ] = phpdbg_decode_op (ops , & op -> op2 , op -> op2_type , vars );
156
+ default :
157
+ decode [1 ] = phpdbg_decode_op (ops , & op -> op1 , op -> op1_type , vars );
158
+ decode [2 ] = phpdbg_decode_op (ops , & op -> op2 , op -> op2_type , vars );
115
159
result :
116
- decode [3 ] = phpdbg_decode_op (ops , & op -> result , op -> result_type , vars );
160
+ decode [3 ] = phpdbg_decode_op (ops , & op -> result , op -> result_type , vars );
117
161
format :
118
- asprintf (& decode [0 ],
119
- "%-20s %-20s %-20s" ,
120
- decode [1 ] ? decode [1 ] : "" ,
121
- decode [2 ] ? decode [2 ] : "" ,
122
- decode [3 ] ? decode [3 ] : "" );
123
- }
162
+ asprintf (& decode [0 ],
163
+ "%-20s %-20s %-20s" ,
164
+ decode [1 ] ? decode [1 ] : "" ,
165
+ decode [2 ] ? decode [2 ] : "" ,
166
+ decode [3 ] ? decode [3 ] : "" );
124
167
}
125
168
126
169
if (decode [1 ])
0 commit comments