2323#include "zend_compile.h"
2424#include "phpdbg_opcode.h"
2525#include "phpdbg_utils.h"
26+ #include "ext/standard/php_string.h"
2627
2728ZEND_EXTERN_MODULE_GLOBALS (phpdbg );
2829
@@ -63,9 +64,59 @@ static inline char *phpdbg_decode_op(zend_op_array *ops, znode_op *op, uint32_t
6364 asprintf (& decode , "@" ZEND_ULONG_FMT , id );
6465 } break ;
6566
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 ;
69120
70121 case IS_UNUSED :
71122 asprintf (& decode , "<unused>" );
@@ -80,47 +131,39 @@ char *phpdbg_decode_opline(zend_op_array *ops, zend_op *op, HashTable *vars) /*{
80131
81132 switch (op -> opcode ) {
82133 case ZEND_JMP :
83- #ifdef ZEND_GOTO
84134 case ZEND_GOTO :
85- #endif
86- #ifdef ZEND_FAST_CALL
87135 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 );
90137 goto format ;
91138
92139 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 );
95142 goto result ;
96143
97144 case ZEND_JMPZ :
98145 case ZEND_JMPNZ :
99146 case ZEND_JMPZ_EX :
100147 case ZEND_JMPNZ_EX :
101-
102- #ifdef ZEND_JMP_SET
103148 case ZEND_JMP_SET :
104- #endif
105149 decode [1 ] = phpdbg_decode_op (ops , & op -> op1 , op -> op1_type , vars );
106150 asprintf (& decode [2 ], "J%ld" , OP_JMP_ADDR (op , op -> op2 ) - ops -> opcodes );
107- goto result ;
151+ goto result ;
108152
109153 case ZEND_RECV_INIT :
110154 goto result ;
111155
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 );
115159result :
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 );
117161format :
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 ] : "" );
124167 }
125168
126169 if (decode [1 ])
0 commit comments