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