@@ -1029,22 +1029,21 @@ static inline char *phpdbg_decode_op(zend_op_array *ops, znode_op *op, zend_uint
1029
1029
{
1030
1030
char * decode = NULL ;
1031
1031
1032
- switch (type ) {
1032
+ switch (type & ~ EXT_TYPE_UNUSED ) {
1033
1033
case IS_CV :
1034
1034
asprintf (& decode , "$%s" , ops -> vars [op -> var ].name );
1035
1035
break ;
1036
1036
1037
1037
case IS_VAR :
1038
1038
case IS_TMP_VAR : {
1039
- zend_ulong id = 0 ;
1040
- if (zend_hash_index_find (vars , (zend_ulong ) ops -> vars - op -> var , (void * * ) & id ) != SUCCESS ) {
1039
+ zend_ulong id = 0 , * pid = NULL ;
1040
+ if (zend_hash_index_find (vars , (zend_ulong ) ops -> vars - op -> var , (void * * ) & pid ) != SUCCESS ) {
1041
1041
id = zend_hash_num_elements (vars );
1042
1042
zend_hash_index_update (
1043
1043
vars , (zend_ulong ) ops -> vars - op -> var ,
1044
1044
(void * * ) & id ,
1045
1045
sizeof (zend_ulong ), NULL );
1046
- }
1047
-
1046
+ } else id = * pid ;
1048
1047
asprintf (& decode , "@%lu" , id );
1049
1048
} break ;
1050
1049
@@ -1061,22 +1060,66 @@ static inline char *phpdbg_decode_op(zend_op_array *ops, znode_op *op, zend_uint
1061
1060
1062
1061
char * phpdbg_decode_opline (zend_op_array * ops , zend_op * op , HashTable * vars TSRMLS_DC ) /*{{{ */
1063
1062
{
1064
- char * decode [3 ];
1065
-
1066
- decode [1 ] = phpdbg_decode_op (ops , & op -> op1 , op -> op1_type , vars TSRMLS_CC );
1067
- decode [2 ] = phpdbg_decode_op (ops , & op -> op2 , op -> op2_type , vars TSRMLS_CC );
1068
-
1063
+ char * decode [4 ] = {NULL , NULL , NULL , NULL };
1064
+
1069
1065
switch (op -> opcode ) {
1070
- default : asprintf (
1071
- & decode [0 ], "%-20s %-20s" ,
1072
- decode [1 ], decode [2 ]
1073
- );
1066
+ case ZEND_JMP :
1067
+ #ifdef ZEND_GOTO
1068
+ case ZEND_GOTO :
1069
+ #endif
1070
+ #ifdef ZEND_FAST_CALL
1071
+ case ZEND_FAST_CALL :
1072
+ #endif
1073
+ asprintf (& decode [1 ], "#%lu" , op -> op1 .jmp_addr - ops -> opcodes );
1074
+ goto format ;
1075
+
1076
+
1077
+ case ZEND_JMPZNZ :
1078
+ decode [1 ] = phpdbg_decode_op (ops , & op -> op1 , op -> op1_type , vars TSRMLS_CC );
1079
+ asprintf (
1080
+ & decode [2 ], "#%lu or #%lu" , op -> op2 .opline_num , op -> extended_value );
1081
+ goto result ;
1082
+
1083
+ case ZEND_JMPZ :
1084
+ case ZEND_JMPNZ :
1085
+ case ZEND_JMPZ_EX :
1086
+ case ZEND_JMPNZ_EX :
1087
+
1088
+ #ifdef ZEND_JMP_SET
1089
+ case ZEND_JMP_SET :
1090
+ #endif
1091
+ #ifdef ZEND_JMP_SET_VAR
1092
+ case ZEND_JMP_SET_VAR :
1093
+ #endif
1094
+ decode [1 ] = phpdbg_decode_op (ops , & op -> op1 , op -> op1_type , vars TSRMLS_CC );
1095
+ asprintf (
1096
+ & decode [2 ], "#%lu" , op -> op2 .jmp_addr - ops -> opcodes );
1097
+ goto result ;
1098
+
1099
+ case ZEND_RECV_INIT :
1100
+ goto result ;
1101
+
1102
+ default : {
1103
+ decode [1 ] = phpdbg_decode_op (ops , & op -> op1 , op -> op1_type , vars TSRMLS_CC );
1104
+ decode [2 ] = phpdbg_decode_op (ops , & op -> op2 , op -> op2_type , vars TSRMLS_CC );
1105
+ result :
1106
+ decode [3 ] = phpdbg_decode_op (ops , & op -> result , op -> result_type , vars TSRMLS_CC );
1107
+ format :
1108
+ asprintf (
1109
+ & decode [0 ],
1110
+ "%-20s %-20s %-20s" ,
1111
+ decode [1 ] ? decode [1 ] : "" ,
1112
+ decode [2 ] ? decode [2 ] : "" ,
1113
+ decode [3 ] ? decode [3 ] : "" );
1114
+ }
1074
1115
}
1075
1116
1076
1117
if (decode [1 ])
1077
1118
free (decode [1 ]);
1078
1119
if (decode [2 ])
1079
1120
free (decode [2 ]);
1121
+ if (decode [3 ])
1122
+ free (decode [3 ]);
1080
1123
1081
1124
return decode [0 ];
1082
1125
} /* }}} */
0 commit comments