]> granicus.if.org Git - php/commitdiff
fix symbol breakpoints
authorkrakjoe <joe.watkins@live.co.uk>
Sun, 10 Nov 2013 18:56:19 +0000 (18:56 +0000)
committerkrakjoe <joe.watkins@live.co.uk>
Sun, 10 Nov 2013 18:56:19 +0000 (18:56 +0000)
phpdbg_bp.c
phpdbg_help.c
phpdbg_prompt.c

index a45ab164f7ecbf2fcdab19472b1d26fee441e634..52f0a243fda2b2f3e8e37987d3d9c2a43a1a6ce1 100644 (file)
@@ -135,7 +135,7 @@ int phpdbg_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */
        if (!fname) {
                fname = "main";
        }
-
+    
        if (zend_hash_find(&PHPDBG_G(bp_symbols), fname, strlen(fname),
                (void**)&break_list) == SUCCESS) {
                printf("breakpoint reached!\n");
index 26811d0c395eacba52d4d125e02ee253dc6aef85..370c15eba0fddf7799faef5d2673c1ea596853ba 100644 (file)
@@ -82,10 +82,12 @@ PHPDBG_HELP(break) /* {{{ */
 {
        printf("Setting a breakpoint stops execution at a specific stage, the syntax is:\n");
        printf("\tfile:line\n");
-       printf("[more to come]\n");
+       printf("\tfunction\n");
        printf("For example:\n");
        printf("\tphpdbg> break test.php:1\n");
        printf("Will break execution on line 1 of test.php\n");
+       printf("\tphpdbg> break my_function\n");
+       printf("Will break execution on entry to my_function\n");
        return SUCCESS;
 } /* }}} */
 
index dee88d2534f82aeb57e6d6449546ab3716f540d2..a5fa359290d75c539c9035f0d8f0c6dd15ee7d5f 100644 (file)
@@ -531,8 +531,6 @@ zend_vm_enter:
                }
 #endif
 
-        phpdbg_print_opline(execute_data TSRMLS_CC);
-
         if (PHPDBG_G(has_file_bp)
                        && phpdbg_breakpoint_file(execute_data->op_array TSRMLS_CC) == SUCCESS) {
                        while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) {
@@ -540,15 +538,33 @@ zend_vm_enter:
                        }
                }
 
-               if (PHPDBG_G(has_sym_bp)
-                       && (execute_data->opline->opcode == ZEND_DO_FCALL || execute_data->opline->opcode == ZEND_DO_FCALL_BY_NAME)
-                       && phpdbg_breakpoint_symbol(execute_data->function_state.function TSRMLS_CC) == SUCCESS) {
-                       while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) {
-                               continue;
-                       }
-               }
-
+        if (PHPDBG_G(has_sym_bp)) {
+            zend_execute_data *previous = execute_data->prev_execute_data;
+            if (previous && (previous != execute_data)) {
+                if (previous->opline) {
+                    if (previous->opline->opcode == ZEND_DO_FCALL || previous->opline->opcode == ZEND_DO_FCALL_BY_NAME) {
+                        if (phpdbg_breakpoint_symbol(previous->function_state.function TSRMLS_CC) == SUCCESS) {
+                            while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) {
+                                               continue;
+                                       }
+                        }
+                    }
+                }
+            } else {
+                if (execute_data->opline->opcode == ZEND_DO_FCALL || execute_data->opline->opcode == ZEND_DO_FCALL_BY_NAME) {
+                    if (phpdbg_breakpoint_symbol(execute_data->function_state.function TSRMLS_CC) == SUCCESS) {
+                        while (phpdbg_interactive(0, NULL TSRMLS_CC) != PHPDBG_NEXT) {
+                                   continue;
+                           }
+                    }
+                }
+            }
+        }
+        
                PHPDBG_G(vmret) = execute_data->opline->handler(execute_data TSRMLS_CC);
+               
+               phpdbg_print_opline(
+                   execute_data TSRMLS_CC);
 
                if (PHPDBG_G(stepping)) {
                        while (phpdbg_interactive(