From 0488640f4c38c751ed5ff1b6779b6bcafd92616e Mon Sep 17 00:00:00 2001 From: krakjoe Date: Thu, 21 Nov 2013 13:52:20 +0000 Subject: [PATCH] better output for disassembler --- phpdbg_print.c | 16 +++++++++++----- phpdbg_prompt.c | 2 +- phpdbg_prompt.h | 1 + 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/phpdbg_print.c b/phpdbg_print.c index 8929fb0faf..9865fe9750 100644 --- a/phpdbg_print.c +++ b/phpdbg_print.c @@ -42,7 +42,8 @@ static inline void phpdbg_print_function_helper(zend_function *method TSRMLS_DC) switch (method->type) { case ZEND_USER_FUNCTION: { zend_op_array* op_array = &(method->op_array); - + HashTable vars; + if (op_array) { zend_op *opline = &(op_array->opcodes[0]); zend_uint opcode = 0, @@ -64,16 +65,21 @@ static inline void phpdbg_print_function_helper(zend_function *method TSRMLS_DC) op_array->filename ? op_array->filename : "unknown"); } - + zend_hash_init(&vars, op_array->last, NULL, NULL, 0); do { - const char *decode = phpdbg_decode_opcode(opline->opcode); + char *decode = phpdbg_decode_opline(op_array, opline, &vars TSRMLS_CC); if (decode != NULL) { phpdbg_writeln( - "\t\t#%lu\t%p %s", opline->lineno, opline, decode); + "\t\t#%lu\t%p %-30s %s", + opline->lineno, + opline, + phpdbg_decode_opcode(opline->opcode), + decode); } else phpdbg_error("\tFailed to decode opline @ %ld", opline); - + free(decode); opline++; } while (++opcode < end); + zend_hash_destroy(&vars); } } break; diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 27c54fd9e3..4f557cdc9e 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -1059,7 +1059,7 @@ static inline char *phpdbg_decode_op(zend_op_array *ops, znode_op *op, zend_uint return decode; } /* }}} */ -static inline char *phpdbg_decode_opline(zend_op_array *ops, zend_op *op, HashTable *vars TSRMLS_DC) /*{{{ */ +char *phpdbg_decode_opline(zend_op_array *ops, zend_op *op, HashTable *vars TSRMLS_DC) /*{{{ */ { char *decode[3]; diff --git a/phpdbg_prompt.h b/phpdbg_prompt.h index e41ef624d2..a410cc4ec4 100644 --- a/phpdbg_prompt.h +++ b/phpdbg_prompt.h @@ -23,6 +23,7 @@ void phpdbg_init(char *init_file, size_t init_file_len, zend_bool use_default TSRMLS_DC); int phpdbg_interactive(TSRMLS_D); void phpdbg_print_opline(zend_execute_data *execute_data, zend_bool ignore_flags TSRMLS_DC); +char *phpdbg_decode_opline(zend_op_array *ops, zend_op *op, HashTable *vars TSRMLS_DC); int phpdbg_compile(TSRMLS_D); void phpdbg_clean(zend_bool full TSRMLS_DC); void phpdbg_sigint_handler(int signo); -- 2.50.1