From: Bob Weinand Date: Thu, 19 Dec 2013 16:05:38 +0000 (-0500) Subject: Added deleting of watchpoints X-Git-Tag: php-5.6.0beta2~1^2~37^2~45 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5e351695b6d4ca14c5af7e2690c38c7c07444640;p=php Added deleting of watchpoints --- diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c index 1caa219ffe..ae77d4065f 100644 --- a/phpdbg_prompt.c +++ b/phpdbg_prompt.c @@ -51,11 +51,11 @@ const phpdbg_command_t phpdbg_prompt_commands[] = { PHPDBG_COMMAND_D(break, "set breakpoint", 'b', phpdbg_break_commands, 1), PHPDBG_COMMAND_D(back, "show trace", 't', NULL, 0), PHPDBG_COMMAND_D(frame, "switch to a frame", 'f', NULL, 1), - PHPDBG_COMMAND_D(list, "lists some code", 'l', phpdbg_list_commands, 2), - PHPDBG_COMMAND_D(info, "displays some informations", 'i', phpdbg_info_commands, 1), + PHPDBG_COMMAND_D(list, "lists some code", 'l', phpdbg_list_commands, 2), + PHPDBG_COMMAND_D(info, "displays some informations", 'i', phpdbg_info_commands, 1), PHPDBG_COMMAND_D(clean, "clean the execution environment", 'X', NULL, 0), PHPDBG_COMMAND_D(clear, "clear breakpoints", 'C', NULL, 0), - PHPDBG_COMMAND_D(help, "show help menu", 'h', phpdbg_help_commands, 2), + PHPDBG_COMMAND_D(help, "show help menu", 'h', phpdbg_help_commands, 2), PHPDBG_COMMAND_D(quiet, "silence some output", 'Q', NULL, 1), PHPDBG_COMMAND_D(aliases, "show alias list", 'a', NULL, 0), PHPDBG_COMMAND_D(set, "set phpdbg configuration", 'S', phpdbg_set_commands, 1), @@ -63,7 +63,7 @@ const phpdbg_command_t phpdbg_prompt_commands[] = { PHPDBG_COMMAND_D(source, "execute a phpdbginit", '.', NULL, 1), PHPDBG_COMMAND_D(shell, "shell a command", '-', NULL, 1), PHPDBG_COMMAND_D(quit, "exit phpdbg", 'q', NULL, 0), - PHPDBG_COMMAND_D(watch, "set watchpoint", 'w', NULL, 0), + PHPDBG_COMMAND_D(watch, "set watchpoint", 'w', phpdbg_watch_commands, 1), PHPDBG_END_COMMAND }; /* }}} */ diff --git a/phpdbg_utils.c b/phpdbg_utils.c index 47437f223e..cb48c4e78b 100644 --- a/phpdbg_utils.c +++ b/phpdbg_utils.c @@ -377,3 +377,21 @@ PHPDBG_API const char *phpdbg_get_prompt(TSRMLS_D) /* {{{ */ return PHPDBG_G(prompt)[1]; } /* }}} */ + +int phpdbg_rebuild_symtable(TSRMLS_D) { + if (!EG(active_op_array)) { + phpdbg_error("No active op array!"); + return FAILURE; + } + + if (!EG(active_symbol_table)) { + zend_rebuild_symbol_table(TSRMLS_C); + + if (!EG(active_symbol_table)) { + phpdbg_error("No active symbol table!"); + return FAILURE; + } + } + + return SUCCESS; +} diff --git a/phpdbg_utils.h b/phpdbg_utils.h index 3126d0c2cf..b79c203a2e 100644 --- a/phpdbg_utils.h +++ b/phpdbg_utils.h @@ -106,4 +106,6 @@ PHPDBG_API const phpdbg_color_t* phpdbg_get_colors(TSRMLS_D); /* }}} */ PHPDBG_API void phpdbg_set_prompt(const char* TSRMLS_DC); PHPDBG_API const char *phpdbg_get_prompt(TSRMLS_D); /* }}} */ +int phpdbg_rebuild_symtable(TSRMLS_D); + #endif /* PHPDBG_UTILS_H */ diff --git a/phpdbg_watch.c b/phpdbg_watch.c index b3438c6edf..5df867a2b4 100644 --- a/phpdbg_watch.c +++ b/phpdbg_watch.c @@ -22,6 +22,7 @@ #include "phpdbg.h" #include "phpdbg_btree.h" #include "phpdbg_watch.h" +#include "phpdbg_utils.h" #include #include @@ -93,7 +94,25 @@ void phpdbg_create_zval_watchpoint(zval *zv, phpdbg_watchpoint_t *watch) { watch->type = WATCH_ON_ZVAL; } -static int phpdbg_watchpoint_parse_input(char *input, size_t len, HashTable *parent, int i TSRMLS_DC) { +static int phpdbg_create_watchpoint(phpdbg_watchpoint_t *watch) { + phpdbg_store_watchpoint(watch TSRMLS_CC); + zend_hash_add(&PHPDBG_G(watchpoints), watch->str, watch->str_len, &watch, sizeof(phpdbg_watchpoint_t *), NULL); + + phpdbg_activate_watchpoint(watch); + + return SUCCESS; +} + +static int phpdbg_delete_watchpoint(phpdbg_watchpoint_t *watch) { + int ret = zend_hash_del(&PHPDBG_G(watchpoints), watch->str, watch->str_len); + + efree(watch); + + return ret; +} + +static int phpdbg_watchpoint_parse_input(char *input, size_t len, HashTable *parent, int i, int (*callback)(phpdbg_watchpoint_t *) TSRMLS_DC) { + int ret = FAILURE; zend_bool new_index = 1; char *last_index; int index_len = 0; @@ -148,19 +167,17 @@ static int phpdbg_watchpoint_parse_input(char *input, size_t len, HashTable *par watch->name_in_parent_len = index_len; watch->parent_container = parent; phpdbg_create_zval_watchpoint(*zv, watch TSRMLS_CC); - phpdbg_store_watchpoint(watch TSRMLS_CC); - zend_hash_add(&PHPDBG_G(watchpoints), watch->str, watch->str_len, &watch, sizeof(phpdbg_watchpoint_t *), NULL); - phpdbg_activate_watchpoint(watch); + ret = callback(watch) == SUCCESS || ret == SUCCESS?SUCCESS:FAILURE; } else if (Z_TYPE_PP(zv) == IS_OBJECT) { - phpdbg_watchpoint_parse_input(input, len, Z_OBJPROP_PP(zv), i TSRMLS_CC); + phpdbg_watchpoint_parse_input(input, len, Z_OBJPROP_PP(zv), i, callback TSRMLS_CC); } else if (Z_TYPE_PP(zv) == IS_ARRAY) { - phpdbg_watchpoint_parse_input(input, len, Z_ARRVAL_PP(zv), i TSRMLS_CC); + phpdbg_watchpoint_parse_input(input, len, Z_ARRVAL_PP(zv), i, callback TSRMLS_CC); } else { /* Ignore silently */ } } - return SUCCESS; + return ret; } else if (new_index) { char last_chr = last_index[index_len]; last_index[index_len] = 0; @@ -177,10 +194,8 @@ static int phpdbg_watchpoint_parse_input(char *input, size_t len, HashTable *par watch->name_in_parent_len = index_len; watch->parent_container = parent; phpdbg_create_zval_watchpoint(*zv, watch TSRMLS_CC); - phpdbg_store_watchpoint(watch TSRMLS_CC); - zend_hash_add(&PHPDBG_G(watchpoints), input, len, &watch, sizeof(phpdbg_watchpoint_t *), NULL); - phpdbg_activate_watchpoint(watch); + ret = callback(watch) == SUCCESS || ret == SUCCESS?SUCCESS:FAILURE; } else if (Z_TYPE_PP(zv) == IS_OBJECT) { parent = Z_OBJPROP_PP(zv); } else if (Z_TYPE_PP(zv) == IS_ARRAY) { @@ -193,28 +208,41 @@ static int phpdbg_watchpoint_parse_input(char *input, size_t len, HashTable *par } } - return SUCCESS; + return ret; error: phpdbg_error("Malformed input"); return FAILURE; } +PHPDBG_WATCH(delete) /* {{{ */ +{ + switch (param->type) { + case STR_PARAM: + if (phpdbg_delete_var_watchpoint(param->str, param->len TSRMLS_CC) == FAILURE) { + phpdbg_error("Nothing was deleted, no corresponding watchpoint found"); + } + break; + + phpdbg_default_switch_case(); + } + + return SUCCESS; +} /* }}} */ + int phpdbg_create_var_watchpoint(char *input, size_t len TSRMLS_DC) { - if (!EG(active_op_array)) { - phpdbg_error("No active op array!"); + if (phpdbg_rebuild_symtable(TSRMLS_C) == FAILURE) { return SUCCESS; } - if (!EG(active_symbol_table)) { - zend_rebuild_symbol_table(TSRMLS_C); + return phpdbg_watchpoint_parse_input(input, len, EG(active_symbol_table), 0, phpdbg_create_watchpoint TSRMLS_CC); +} - if (!EG(active_symbol_table)) { - phpdbg_error("No active symbol table!"); - return SUCCESS; - } +int phpdbg_delete_var_watchpoint(char *input, size_t len TSRMLS_DC) { + if (phpdbg_rebuild_symtable(TSRMLS_C) == FAILURE) { + return SUCCESS; } - return phpdbg_watchpoint_parse_input(input, len, EG(active_symbol_table), 0 TSRMLS_CC); + return phpdbg_watchpoint_parse_input(input, len, EG(active_symbol_table), 0, phpdbg_delete_watchpoint TSRMLS_CC); } int phpdbg_watchpoint_segfault_handler(siginfo_t *info, void *context TSRMLS_DC) { diff --git a/phpdbg_watch.h b/phpdbg_watch.h index ce76321056..0f96828edf 100644 --- a/phpdbg_watch.h +++ b/phpdbg_watch.h @@ -27,10 +27,17 @@ #define PHPDBG_WATCH(name) PHPDBG_COMMAND(watch_##name) /** -* Printer Forward Declarations -*/ -/*PHPDBG_WATCH();*/ + * Printer Forward Declarations + */ +PHPDBG_WATCH(delete); +/** + * Commands + */ + +static const phpdbg_command_t phpdbg_watch_commands[] = { + PHPDBG_COMMAND_D_EX(delete, "delete watchpoint", 'd', watch_delete, NULL, 1), +}; /* Watchpoint functions/typedefs */ @@ -64,7 +71,9 @@ int phpdbg_watchpoint_segfault_handler(siginfo_t *info, void *context TSRMLS_DC) void phpdbg_create_addr_watchpoint(void *addr, size_t size, phpdbg_watchpoint_t *watch); void phpdbg_create_zval_watchpoint(zval *zv, phpdbg_watchpoint_t *watch); -int phpdbg_create_var_watchpoint(char *name, size_t len TSRMLS_DC); + +int phpdbg_delete_var_watchpoint(char *input, size_t len TSRMLS_DC); +int phpdbg_create_var_watchpoint(char *input, size_t len TSRMLS_DC); int phpdbg_print_changed_zvals(TSRMLS_D);