Commit: af90b6d5c737646fa2b1f30d2f85a67fd8d770a7 Author: Felipe Pena <felipe...@gmail.com> Tue, 12 Nov 2013 11:33:51 -0200 Parents: fdf26eaa0f7daaecfb05699e6012d140d1cdbaa8 Branches: PHP-5.6
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=af90b6d5c737646fa2b1f30d2f85a67fd8d770a7 Log: - Improved breakpoint code Changed paths: M phpdbg_bp.c M phpdbg_bp.h M phpdbg_prompt.c M phpdbg_utils.c M phpdbg_utils.h Diff: diff --git a/phpdbg_bp.c b/phpdbg_bp.c index aa7c630..43f5fa7 100644 --- a/phpdbg_bp.c +++ b/phpdbg_bp.c @@ -101,16 +101,15 @@ void phpdbg_set_breakpoint_symbol(const char *name TSRMLS_DC) /* {{{ */ } } /* }}} */ -void phpdbg_set_breakpoint_method(const char* class_name, - size_t class_len, - const char* func_name, - size_t func_len TSRMLS_DC) /* {{{ */ +void phpdbg_set_breakpoint_method(const char* class_name, const char* func_name TSRMLS_DC) /* {{{ */ { HashTable class_breaks, *class_table; + size_t class_len = strlen(class_name); + size_t func_len = strlen(func_name); - if (zend_hash_find(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], class_name, class_len, (void**)&class_table) != SUCCESS) { - zend_hash_init( - &class_breaks, 8, NULL, phpdbg_class_breaks_dtor, 0); + if (zend_hash_find(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], class_name, + class_len, (void**)&class_table) != SUCCESS) { + zend_hash_init(&class_breaks, 8, NULL, phpdbg_class_breaks_dtor, 0); zend_hash_update( &PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], class_name, class_len, @@ -128,7 +127,9 @@ void phpdbg_set_breakpoint_method(const char* class_name, new_break.func_len = func_len; new_break.id = PHPDBG_G(bp_count)++; - zend_hash_update(class_table, func_name, func_len, &new_break, sizeof(phpdbg_breakmethod_t), NULL); + zend_hash_update(class_table, func_name, func_len, + &new_break, sizeof(phpdbg_breakmethod_t), NULL); + printf( "%sBreakpoint #%d added at %s::%s%s\n", PHPDBG_BOLD_LINE(TSRMLS_C), diff --git a/phpdbg_bp.h b/phpdbg_bp.h index 7636d8b..61d5004 100644 --- a/phpdbg_bp.h +++ b/phpdbg_bp.h @@ -62,7 +62,7 @@ typedef struct _phpdbg_breakline_t { void phpdbg_set_breakpoint_file(const char*, long TSRMLS_DC); void phpdbg_set_breakpoint_symbol(const char* TSRMLS_DC); -void phpdbg_set_breakpoint_method(const char*, size_t, const char*, size_t TSRMLS_DC); +void phpdbg_set_breakpoint_method(const char*, const char* TSRMLS_DC); void phpdbg_set_breakpoint_opline(zend_ulong TSRMLS_DC); void phpdbg_set_breakpoint_opline_ex(phpdbg_opline_ptr_t TSRMLS_DC); diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 54be3aa..f12567c 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -329,8 +329,7 @@ static PHPDBG_COMMAND(print) /* {{{ */ static PHPDBG_COMMAND(break) /* {{{ */ { - char *line_pos = NULL; - char *func_pos = NULL; + char *line_pos; if (expr_len <= 0L) { printf( @@ -338,10 +337,17 @@ static PHPDBG_COMMAND(break) /* {{{ */ return FAILURE; } - line_pos = strchr(expr, ':'); + line_pos = strchr(expr, ':'); if (line_pos) { - if (!(func_pos=strchr(line_pos+1, ':'))) { + char *class; + char *func; + + /* break class::method */ + if (phpdbg_is_class_method(expr, expr_len, &class, &func)) { + phpdbg_set_breakpoint_method(class, func TSRMLS_CC); + } else { + /* break file:line */ char path[MAXPATHLEN], resolved_name[MAXPATHLEN]; long line_num = strtol(line_pos+1, NULL, 0); @@ -350,43 +356,26 @@ static PHPDBG_COMMAND(break) /* {{{ */ path[line_pos - expr] = 0; if (expand_filepath(path, resolved_name TSRMLS_CC) == NULL) { - printf("%sFailed to expand path %s%s\n", PHPDBG_RED_LINE(TSRMLS_C), path, PHPDBG_END_LINE(TSRMLS_C)); + printf("%sFailed to expand path %s%s\n", + PHPDBG_RED_LINE(TSRMLS_C), path, PHPDBG_END_LINE(TSRMLS_C)); return FAILURE; } phpdbg_set_breakpoint_file(resolved_name, line_num TSRMLS_CC); } else { - printf("%sNo line specified in expression %s%s\n", PHPDBG_RED_LINE(TSRMLS_C), expr, PHPDBG_END_LINE(TSRMLS_C)); - return FAILURE; - } - } else { - char *class; - char *func; - - size_t func_len = strlen(func_pos+1), - class_len = (line_pos - expr); - - if (func_len) { - class = emalloc(class_len+1); - func = emalloc(func_len+1); - - memcpy(class, expr, class_len); - class[class_len]='\0'; - memcpy(func, func_pos+1, func_len); - func[func_len]='\0'; - - phpdbg_set_breakpoint_method(class, class_len, func, func_len TSRMLS_CC); - } else { - printf("%sNo function found in method expression %s%s\n", PHPDBG_RED_LINE(TSRMLS_C), expr, PHPDBG_END_LINE(TSRMLS_C)); + printf("%sNo line specified in expression %s%s\n", + PHPDBG_RED_LINE(TSRMLS_C), expr, PHPDBG_END_LINE(TSRMLS_C)); return FAILURE; } - } + } } else { + /* break 0xc0ffee */ if (phpdbg_is_addr(expr)) { zend_ulong opline = strtoul(expr, 0, 16); phpdbg_set_breakpoint_opline(opline TSRMLS_CC); } else if (phpdbg_is_numeric(expr)) { + /* break 1337 */ const char *filename = zend_get_executed_filename(TSRMLS_C); long line_num = strtol(expr, NULL, 0); @@ -398,6 +387,7 @@ static PHPDBG_COMMAND(break) /* {{{ */ phpdbg_set_breakpoint_file(filename, line_num TSRMLS_CC); } else { + /* break symbol */ char name[200]; size_t name_len = strlen(expr); diff --git a/phpdbg_utils.c b/phpdbg_utils.c index 9e39010..cb864c0 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -17,7 +17,9 @@ +----------------------------------------------------------------------+ */ +#include <stdio.h> #include <ctype.h> +#include "zend_alloc.h" #include "phpdbg_utils.h" int phpdbg_is_numeric(const char *str) /* {{{ */ @@ -46,3 +48,23 @@ int phpdbg_is_addr(const char *str) /* {{{ */ { return str[0] && str[1] && memcmp(str, "0x", 2) == 0; } /* }}} */ + +int phpdbg_is_class_method(const char *str, size_t len, char **class, char **method) /* {{{ */ +{ + const char *sep = strstr(str, "::"); + size_t class_len, method_len; + + if (!sep) { + return 0; + } + + class_len = sep - str; + method_len = len - ((sep+2) - str); + + *class = estrndup(str, class_len); + class[class_len] = 0; + + *method = estrndup(sep+2, method_len+1); + + return 1; +} /* }}} */ diff --git a/phpdbg_utils.h b/phpdbg_utils.h index 464a0c7..d56e504 100644 --- a/phpdbg_utils.h +++ b/phpdbg_utils.h @@ -23,5 +23,6 @@ int phpdbg_is_numeric(const char*); int phpdbg_is_empty(const char*); int phpdbg_is_addr(const char*); +int phpdbg_is_class_method(const char*, size_t, char**, char**); #endif /* PHPDBG_UTILS_H */ -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php