Commit:    775376b362dfb9e9d0bf29dcd4cd2a2155117398
Author:    krakjoe <joe.watk...@live.co.uk>         Mon, 18 Nov 2013 03:18:37 
+0000
Parents:   8ada4342a47170a38799282919714997d3771c06
Branches:  PHP-5.6

Link:       
http://git.php.net/?p=php-src.git;a=commitdiff;h=775376b362dfb9e9d0bf29dcd4cd2a2155117398

Log:
better way to detect leave/finish

Changed paths:
  M  phpdbg.c
  M  phpdbg.h
  M  phpdbg_prompt.c


Diff:
diff --git a/phpdbg.c b/phpdbg.c
index ec8d267..e542906 100644
--- a/phpdbg.c
+++ b/phpdbg.c
@@ -101,7 +101,7 @@ static PHP_RINIT_FUNCTION(phpdbg) /* {{{ */
     zend_hash_init(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE], 8, NULL, NULL, 0);
     zend_hash_init(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], 8, NULL, 
php_phpdbg_destroy_bp_methods, 0);
     zend_hash_init(&PHPDBG_G(bp)[PHPDBG_BREAK_COND], 8, NULL, 
php_phpdbg_destroy_bp_condition, 0);
-
+       zend_hash_init(&PHPDBG_G(seek), 8, NULL, NULL, 0);
        return SUCCESS;
 } /* }}} */
 
@@ -112,7 +112,8 @@ static PHP_RSHUTDOWN_FUNCTION(phpdbg) /* {{{ */
     zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE]);
     zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD]);
     zend_hash_destroy(&PHPDBG_G(bp)[PHPDBG_BREAK_COND]);
-
+       zend_hash_destroy(&PHPDBG_G(seek));
+       
     if (PHPDBG_G(exec)) {
         efree(PHPDBG_G(exec));
         PHPDBG_G(exec) = NULL;
diff --git a/phpdbg.h b/phpdbg.h
index 0416b93..a12e03b 100644
--- a/phpdbg.h
+++ b/phpdbg.h
@@ -118,7 +118,7 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg)
        phpdbg_param_t   *lparam;           /* last param */
        zend_ulong flags;                   /* phpdbg flags */
        FILE *oplog;                        /* opline log */
-       zend_ulong seek;                                        /* seek opline 
*/
+       HashTable seek;                                         /* seek oplines 
*/
 ZEND_END_MODULE_GLOBALS(phpdbg)
 /* }}} */
 
diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c
index 7f976bf..a36cb24 100644
--- a/phpdbg_prompt.c
+++ b/phpdbg_prompt.c
@@ -309,7 +309,11 @@ static PHPDBG_COMMAND(until) /* {{{ */
                
                for (next = self; next < EG(active_op_array)->last; next++) {
                        if (EG(active_op_array)->opcodes[next].lineno != 
opline->lineno) {
-                               PHPDBG_G(seek) = (zend_ulong) 
&EG(active_op_array)->opcodes[next];
+                               zend_hash_index_update(
+                                       &PHPDBG_G(seek), 
+                                       (zend_ulong) 
&EG(active_op_array)->opcodes[next], 
+                                       &EG(active_op_array)->opcodes[next],
+                                       sizeof(zend_op), NULL);
                                break;
                        }
                }
@@ -332,8 +336,15 @@ static PHPDBG_COMMAND(finish) /* {{{ */
                zend_op  *opline = &EG(active_op_array)->opcodes[self];
                
                for (next = self; next < EG(active_op_array)->last; next++) {
-                       if (EG(active_op_array)->opcodes[next].opcode == 
ZEND_RETURN) {
-                               PHPDBG_G(seek) = (zend_ulong) 
&EG(active_op_array)->opcodes[next];
+                       switch (EG(active_op_array)->opcodes[next].opcode) {
+                               case ZEND_RETURN:
+                               case ZEND_THROW:
+                               case ZEND_EXIT:
+                                       zend_hash_index_update(
+                                               &PHPDBG_G(seek), 
+                                               (zend_ulong) 
&EG(active_op_array)->opcodes[next], 
+                                               
&EG(active_op_array)->opcodes[next],
+                                               sizeof(zend_op), NULL);
                                break;
                        }
                }
@@ -356,8 +367,15 @@ static PHPDBG_COMMAND(leave) /* {{{ */
                zend_op  *opline = &EG(active_op_array)->opcodes[self];
                
                for (next = self; next < EG(active_op_array)->last; next++) {
-                       if (EG(active_op_array)->opcodes[next].opcode == 
ZEND_RETURN) {
-                               PHPDBG_G(seek) = (zend_ulong) 
&EG(active_op_array)->opcodes[next];
+                       switch (EG(active_op_array)->opcodes[next].opcode) {
+                               case ZEND_RETURN:
+                               case ZEND_THROW:
+                               case ZEND_EXIT:
+                                       zend_hash_index_update(
+                                               &PHPDBG_G(seek), 
+                                               (zend_ulong) 
&EG(active_op_array)->opcodes[next], 
+                                               
&EG(active_op_array)->opcodes[next],
+                                               sizeof(zend_op), NULL);
                                break;
                        }
                }
@@ -397,8 +415,10 @@ static PHPDBG_COMMAND(run) /* {{{ */
                zend_activate_auto_globals(TSRMLS_C);
         } zend_end_try();
 
-               /* clean flags */
-               PHPDBG_G(flags) &= ~PHPDBG_SEEK_MASK;           
+               /* clean seek state */
+               PHPDBG_G(flags) &= ~PHPDBG_SEEK_MASK;
+               zend_hash_clean(
+                       &PHPDBG_G(seek));
                
                zend_try {
                        zend_execute(
@@ -974,6 +994,8 @@ void phpdbg_execute_ex(zend_execute_data *execute_data 
TSRMLS_DC) /* {{{ */
 #else
 void phpdbg_execute_ex(zend_op_array *op_array TSRMLS_DC) /* {{{ */
 {
+       long long flags = 0;
+       zend_ulong address = 0L;
        zend_execute_data *execute_data;
        zend_bool nested = 0;
 #endif
@@ -1034,11 +1056,15 @@ zend_vm_enter:
 
                /* perform seek operation */
                if (PHPDBG_G(flags) & PHPDBG_SEEK_MASK) {
-
+                       /* current address */
+                       zend_ulong address = (zend_ulong) execute_data->opline;
+                                                               
                        /* run to next line */
                        if (PHPDBG_G(flags) & PHPDBG_IN_UNTIL) {
-                               if (((zend_ulong)execute_data->opline) == 
PHPDBG_G(seek)) {
+                               if (zend_hash_index_exists(&PHPDBG_G(seek), 
address)) {
                                        PHPDBG_G(flags) &= ~PHPDBG_IN_UNTIL;
+                                       zend_hash_clean(
+                                               &PHPDBG_G(seek));
                                } else {
                                        /* skip possible breakpoints */
                                        goto next;
@@ -1047,17 +1073,21 @@ zend_vm_enter:
 
                        /* run to finish */
                        if (PHPDBG_G(flags) & PHPDBG_IN_FINISH) {
-                               if (((zend_ulong)execute_data->opline) == 
PHPDBG_G(seek)) {
+                               if (zend_hash_index_exists(&PHPDBG_G(seek), 
address)) {
                                        PHPDBG_G(flags) &= ~PHPDBG_IN_FINISH;
+                                       zend_hash_clean(
+                                               &PHPDBG_G(seek));
                                }
                                /* skip possible breakpoints */
                                goto next;
                        }
-
+       
                        /* break for leave */
                        if (PHPDBG_G(flags) & PHPDBG_IN_LEAVE) {
-                               if (((zend_ulong)execute_data->opline) == 
PHPDBG_G(seek)) {
+                               if (zend_hash_index_exists(&PHPDBG_G(seek), 
address)) {
                                        PHPDBG_G(flags) &= ~PHPDBG_IN_LEAVE;
+                                       zend_hash_clean(
+                                               &PHPDBG_G(seek));
                                        phpdbg_notice(
                                                "Breaking for leave at %s:%u",
                                                
zend_get_executed_filename(TSRMLS_C),


--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to