]> granicus.if.org Git - php/commitdiff
- Added command "set breakpoint <on|off>"
authorFelipe Pena <felipensp@gmail.com>
Mon, 25 Nov 2013 21:39:17 +0000 (19:39 -0200)
committerFelipe Pena <felipensp@gmail.com>
Mon, 25 Nov 2013 21:39:17 +0000 (19:39 -0200)
phpdbg.c
phpdbg.h
phpdbg_bp.c
phpdbg_set.c
phpdbg_set.h

index ebe7cafb7b4e42b1a92d0fa444a7713d874f6594..9eb1a0b32e56744344759d352d3b82afe11b6c60 100644 (file)
--- a/phpdbg.c
+++ b/phpdbg.c
@@ -78,7 +78,7 @@ static PHP_MINIT_FUNCTION(phpdbg) /* {{{ */
        REGISTER_LONG_CONSTANT("PHPDBG_COLOR_PROMPT", PHPDBG_COLOR_PROMPT, CONST_CS|CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("PHPDBG_COLOR_NOTICE", PHPDBG_COLOR_NOTICE, CONST_CS|CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("PHPDBG_COLOR_ERROR", PHPDBG_COLOR_ERROR, CONST_CS|CONST_PERSISTENT);
-       
+
        return SUCCESS;
 } /* }}} */
 
@@ -249,32 +249,32 @@ static PHP_FUNCTION(phpdbg_color)
        long element;
        char *color;
        zend_uint color_len;
-       
+
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ls", &element, &color, &color_len) == FAILURE) {
                return;
        }
-       
+
        switch (element) {
                case PHPDBG_COLOR_NOTICE:
                case PHPDBG_COLOR_ERROR:
                case PHPDBG_COLOR_PROMPT:
                        phpdbg_set_color_ex(element, color, color_len TSRMLS_CC);
                break;
-               
+
                default: zend_error(E_ERROR, "phpdbg detected an incorrect color constant");
        }
 } /* }}} */
 
 /* {{{ proto void phpdbg_prompt(string prompt) */
-static PHP_FUNCTION(phpdbg_prompt) 
+static PHP_FUNCTION(phpdbg_prompt)
 {
        char *prompt;
        zend_uint prompt_len;
-       
+
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &prompt, &prompt_len) == FAILURE) {
                return;
        }
-       
+
        phpdbg_set_prompt(prompt TSRMLS_CC);
 } /* }}} */
 
index 19cf0c463af68975985340e3a5c2f471ca119ffa..6962cdbf4b16451da5e0346a864e6943e519fa6b 100644 (file)
--- a/phpdbg.h
+++ b/phpdbg.h
 #define PHPDBG_IS_INITIALIZING (1<<19)
 #define PHPDBG_IS_SIGNALED      (1<<20)
 #define PHPDBG_IS_INTERACTIVE  (1<<21)
+#define PHPDBG_IS_BP_ENABLED    (1<<22)
 
 #ifndef _WIN32
-#   define PHPDBG_DEFAULT_FLAGS    (PHPDBG_IS_QUIET|PHPDBG_IS_COLOURED)
+#   define PHPDBG_DEFAULT_FLAGS    (PHPDBG_IS_QUIET|PHPDBG_IS_COLOURED|PHPDBG_IS_BP_ENABLED)
 #else
-#   define PHPDBG_DEFAULT_FLAGS    (PHPDBG_IS_QUIET)
+#   define PHPDBG_DEFAULT_FLAGS    (PHPDBG_IS_QUIET|PHPDBG_IS_BP_ENABLED)
 #endif /* }}} */
 
 /* {{{ strings */
@@ -137,7 +138,7 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg)
        HashTable registered;                                                   /* registered */
        HashTable seek;                                                                 /* seek oplines */
        phpdbg_frame_t frame;                                                   /* frame */
-       
+
        char *exec;                                             /* file to execute */
        size_t exec_len;                                        /* size of exec */
        zend_op_array *ops;                                     /* op_array */
@@ -151,10 +152,10 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg)
 
     char *prompt[2];                                           /* prompt */
     const phpdbg_color_t *colors[PHPDBG_COLORS];       /* colors */
-    
+
        phpdbg_command_t *lcmd;                                                 /* last command */
        phpdbg_param_t lparam;                                  /* last param */
-       
+
        zend_ulong flags;                                       /* phpdbg flags */
 ZEND_END_MODULE_GLOBALS(phpdbg) /* }}} */
 
index afd0be0d008b51f51fe28479ee2d53e8c3ad730b..40a3a50fc77d1f90cf7b7248d9baf5161e02b70b 100644 (file)
@@ -48,20 +48,20 @@ PHPDBG_API void phpdbg_export_breakpoints(FILE *handle TSRMLS_DC) /* {{{ */
 {
        HashPosition position;
        HashTable *table = NULL;
-       
+
        if (PHPDBG_G(flags) & PHPDBG_HAS_FILE_BP) {
                zend_llist *brakes;
 
                table = &PHPDBG_G(bp)[PHPDBG_BREAK_FILE];
-               
+
                for (zend_hash_internal_pointer_reset_ex(table, &position);
                        zend_hash_get_current_data_ex(table, (void*) &brakes, &position) == SUCCESS;
                        zend_hash_move_forward_ex(table, &position)) {
-                       
+
                        zend_llist_position lposition;
             phpdbg_breakfile_t *brake;
                        zend_ulong count = zend_llist_count(brakes);
-                       
+
                        if ((brake = zend_llist_get_first_ex(brakes, &lposition))) {
                                phpdbg_notice(
                                        "Exporting file breakpoints in %s (%d)", brake->filename, count);
@@ -72,14 +72,14 @@ PHPDBG_API void phpdbg_export_breakpoints(FILE *handle TSRMLS_DC) /* {{{ */
                        }
                }
        }
-       
+
        if (PHPDBG_G(flags) & PHPDBG_HAS_SYM_BP) {
                phpdbg_breaksymbol_t *brake;
-               
+
                table = &PHPDBG_G(bp)[PHPDBG_BREAK_SYM];
-               
+
                phpdbg_notice("Exporting symbol breakpoints (%d)", zend_hash_num_elements(table));
-               
+
                for (zend_hash_internal_pointer_reset_ex(table, &position);
                        zend_hash_get_current_data_ex(table, (void*) &brake, &position) == SUCCESS;
                        zend_hash_move_forward_ex(table, &position)) {
@@ -106,36 +106,36 @@ PHPDBG_API void phpdbg_export_breakpoints(FILE *handle TSRMLS_DC) /* {{{ */
                                zend_hash_move_forward_ex(class, &mposition)) {
                                if (!noted) {
                                        phpdbg_notice(
-                                               "Exporting method breakpoints in %s (%d)", 
+                                               "Exporting method breakpoints in %s (%d)",
                                                brake->class_name, zend_hash_num_elements(class));
                                        noted = 1;
                                }
-                               
+
                                fprintf(
                                        handle, "break %s::%s\n", brake->class_name, brake->func_name);
                        }
                }
        }
-       
+
        if (PHPDBG_G(flags) & PHPDBG_HAS_OPCODE_BP) {
                phpdbg_breakop_t *brake;
-               
+
                table = &PHPDBG_G(bp)[PHPDBG_BREAK_OPCODE];
-               
+
                phpdbg_notice(
                        "Exporting opcode breakpoints (%d)", zend_hash_num_elements(table));
-               
+
                for (zend_hash_internal_pointer_reset_ex(table, &position);
                        zend_hash_get_current_data_ex(table, (void**) &brake, &position) == SUCCESS;
                        zend_hash_move_forward_ex(table, &position)) {
-               
+
                        fprintf(
-                               handle, "break op %s\n", brake->name);  
+                               handle, "break op %s\n", brake->name);
                }
        }
-       
+
        /* export other types here after resolving errors from source command */
-       
+
 } /* }}} */
 
 PHPDBG_API void phpdbg_set_breakpoint_file(const char *path, long line_num TSRMLS_DC) /* {{{ */
@@ -545,6 +545,10 @@ int phpdbg_find_conditional_breakpoint(TSRMLS_D) /* {{{ */
 
 int phpdbg_find_breakpoint(zend_execute_data* execute_data TSRMLS_DC) /* {{{ */
 {
+       if (!(PHPDBG_G(flags) & PHPDBG_IS_BP_ENABLED)) {
+               return FAILURE;
+       }
+
        /* conditions cannot be executed by eval()'d code */
        if (!(PHPDBG_G(flags) & PHPDBG_IN_EVAL)
                && (PHPDBG_G(flags) & PHPDBG_HAS_COND_BP)
index b604822d6934b820019c14f530b751ce55555657..7c731920073ddd54e66f015563af1e0d140ac402 100644 (file)
@@ -41,16 +41,38 @@ PHPDBG_SET(prompt) /* {{{ */
        return SUCCESS;
 } /* }}} */
 
+PHPDBG_SET(breakpoint) /* {{{ */
+{
+       switch (param->type) {
+               case EMPTY_PARAM:
+                       phpdbg_writeln("%s",
+                               PHPDBG_G(flags) & PHPDBG_IS_BP_ENABLED ? "on" : "off");
+                       break;
+
+               case STR_PARAM:
+                       if (strncasecmp(param->str, PHPDBG_STRL("on")) == 0) {
+                               PHPDBG_G(flags) |= PHPDBG_IS_BP_ENABLED;
+                       } else if (strncasecmp(param->str, PHPDBG_STRL("off")) == 0) {
+                               PHPDBG_G(flags) ^= PHPDBG_IS_BP_ENABLED;
+                       }
+                       break;
+
+               phpdbg_default_switch_case();
+       }
+
+       return SUCCESS;
+} /* }}} */
+
 PHPDBG_SET(color) /* {{{ */
 {
        if ((param->type == STR_PARAM) && (input->argc == 3)) {
                const phpdbg_color_t *color = phpdbg_get_color(
                        input->argv[2]->string, input->argv[2]->length TSRMLS_CC);
                int element = PHPDBG_COLOR_INVALID;
-               
+
                if (color) {
-                       if (phpdbg_argv_is(1, "prompt")) {      
-                               phpdbg_notice(  
+                       if (phpdbg_argv_is(1, "prompt")) {
+                               phpdbg_notice(
                                        "setting prompt color to %s (%s)", color->name, color->code);
                                element = PHPDBG_COLOR_PROMPT;
                                if (PHPDBG_G(prompt)[1]) {
@@ -58,16 +80,16 @@ PHPDBG_SET(color) /* {{{ */
                                        PHPDBG_G(prompt)[1]=NULL;
                                }
                        } else if (phpdbg_argv_is(1, "error")) {
-                               phpdbg_notice(  
+                               phpdbg_notice(
                                        "setting error color to %s (%s)", color->name, color->code);
                                element = PHPDBG_COLOR_ERROR;
-                       
+
                        } else if (phpdbg_argv_is(1, "notice")) {
-                               phpdbg_notice(  
+                               phpdbg_notice(
                                        "setting notice color to %s (%s)", color->name, color->code);
                                element = PHPDBG_COLOR_NOTICE;
-                               
-                       } else goto usage; 
+
+                       } else goto usage;
 
                        /* set color for element */
                        phpdbg_set_color(element, color TSRMLS_CC);
index fa443ee8b9f9dd5443d1f6e21415b0f850bc1fe2..37ed3973c36b8ba2fcc77c1efeb40dd66bbdcbe4 100644 (file)
 PHPDBG_SET(prompt);
 PHPDBG_SET(color);
 PHPDBG_SET(oplog);
+PHPDBG_SET(breakpoint);
 
 static const phpdbg_command_t phpdbg_set_commands[] = {
     PHPDBG_COMMAND_D_EX(prompt,       "usage: set prompt <string>",                               'p', set_prompt,       NULL, 0),
     PHPDBG_COMMAND_D_EX(color,                   "usage: set color  <element> <color>",                   'c', set_color,        NULL, 1),
     PHPDBG_COMMAND_D_EX(oplog,        "usage: set oplog  <output>",                               'O', set_oplog,        NULL, 0),
+    PHPDBG_COMMAND_D_EX(breakpoint,   "usage: set breakpoint <on|off>",                           'b', set_breakpoint,   NULL, 0),
     PHPDBG_END_COMMAND
 };