]> granicus.if.org Git - php/commitdiff
Added deleting of watchpoints
authorBob Weinand <bobwei9@hotmail.com>
Thu, 19 Dec 2013 16:05:38 +0000 (11:05 -0500)
committerBob Weinand <bobwei9@hotmail.com>
Thu, 19 Dec 2013 16:05:38 +0000 (11:05 -0500)
phpdbg_prompt.c
phpdbg_utils.c
phpdbg_utils.h
phpdbg_watch.c
phpdbg_watch.h

index 1caa219ffe3828bbbbc4821941dc8d3824f23b8b..ae77d4065f677643257e60dd62c6cf58778361e9 100644 (file)
@@ -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
 }; /* }}} */
 
index 47437f223e45e0d45fecb9987e23619b10bd59ec..cb48c4e78bc2c5f3f55215107493f8841a08d2a4 100644 (file)
@@ -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;
+}
index 3126d0c2cf64fa2fd494914b1aeb1cb733bda2af..b79c203a2e993b5c6fa668a04f9289eac4d09d65 100644 (file)
@@ -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 */
index b3438c6edf6299f3d0853028b78e3719a79a0cc1..5df867a2b45dede597c73c232236735c073c092a 100644 (file)
@@ -22,6 +22,7 @@
 #include "phpdbg.h"
 #include "phpdbg_btree.h"
 #include "phpdbg_watch.h"
+#include "phpdbg_utils.h"
 #include <unistd.h>
 #include <sys/mman.h>
 
@@ -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) {
index ce76321056b5a56efa34d3a523b51980acb7a17f..0f96828edf373b2b661bd35b76cc31de649daa25 100644 (file)
 #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);