Commit: 0deced5a7a3f89aeba321e90fa03ba89607ad271
Author: krakjoe <joe.watk...@live.co.uk> Wed, 27 Nov 2013 13:01:57
+0000
Parents: 4216cb28408a660dbf435f00d3c58ba89666b602
Branches: PHP-5.6
Link:
http://git.php.net/?p=php-src.git;a=commitdiff;h=0deced5a7a3f89aeba321e90fa03ba89607ad271
Log:
more improvements to breakpoint api
separate printing logic, always return base
add hit count to breakpoints, displayed on hit
Changed paths:
M phpdbg_bp.c
M phpdbg_bp.h
M phpdbg_prompt.c
diff --git a/phpdbg_bp.c b/phpdbg_bp.c
index 1560bc8..2985080 100644
--- a/phpdbg_bp.c
+++ b/phpdbg_bp.c
@@ -130,28 +130,29 @@ PHPDBG_API void phpdbg_set_breakpoint_file(const char
*path, long line_num TSRML
if (zend_hash_find(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE],
path, path_len, (void**)&broken) == FAILURE) {
HashTable breaks;
-
+
zend_hash_init(&breaks, 8, NULL,
phpdbg_file_breaks_dtor, 0);
zend_hash_update(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE],
path, path_len, &breaks,
sizeof(HashTable),
(void**)&broken);
}
-
+
if (!zend_hash_index_exists(broken, line_num)) {
PHPDBG_G(flags) |= PHPDBG_HAS_FILE_BP;
-
- new_break.filename = estrndup(path, path_len);
- new_break.line = line_num;
+
new_break.id = PHPDBG_G(bp_count)++;
new_break.type = PHPDBG_BREAK_FILE;
-
+ new_break.hits = 0;
+ new_break.filename = estrndup(path, path_len);
+ new_break.line = line_num;
+
zend_hash_index_update(
broken, line_num, (void**)&new_break,
sizeof(phpdbg_breakfile_t), NULL);
-
+
phpdbg_notice("Breakpoint #%d added at %s:%ld",
new_break.id, new_break.filename,
new_break.line);
-
+
PHPDBG_BREAK_MAPPING(new_break.id, broken);
} else {
phpdbg_error("Breakpoint at %s:%ld exists",
path, line_num);
@@ -172,16 +173,17 @@ PHPDBG_API void phpdbg_set_breakpoint_symbol(const char
*name, size_t name_len T
PHPDBG_G(flags) |= PHPDBG_HAS_SYM_BP;
- new_break.symbol = estrndup(name, name_len);
new_break.id = PHPDBG_G(bp_count)++;
new_break.type = PHPDBG_BREAK_SYM;
-
+ new_break.hits = 0;
+ new_break.symbol = estrndup(name, name_len);
+
zend_hash_update(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM],
new_break.symbol,
name_len, &new_break, sizeof(phpdbg_breaksymbol_t),
NULL);
phpdbg_notice("Breakpoint #%d added at %s",
new_break.id, new_break.symbol);
-
+
PHPDBG_BREAK_MAPPING(new_break.id,
&PHPDBG_G(bp)[PHPDBG_BREAK_SYM]);
} else {
phpdbg_notice("Breakpoint exists at %s", name);
@@ -204,18 +206,19 @@ PHPDBG_API void phpdbg_set_breakpoint_method(const char*
class_name, const char*
(void**)&class_breaks, sizeof(HashTable),
(void**)&class_table);
}
- if (!zend_hash_exists(class_table, func_name, func_len)) {
+ if (!zend_hash_exists(class_table, lcname, func_len)) {
phpdbg_breakmethod_t new_break;
PHPDBG_G(flags) |= PHPDBG_HAS_METHOD_BP;
+ new_break.id = PHPDBG_G(bp_count)++;
+ new_break.type = PHPDBG_BREAK_METHOD;
+ new_break.hits = 0;
new_break.class_name = estrndup(class_name, class_len);
new_break.class_len = class_len;
new_break.func_name = estrndup(func_name, func_len);
new_break.func_len = func_len;
- new_break.id = PHPDBG_G(bp_count)++;
- new_break.type = PHPDBG_BREAK_METHOD;
-
+
zend_hash_update(class_table, lcname, func_len,
&new_break, sizeof(phpdbg_breakmethod_t), NULL);
@@ -236,12 +239,14 @@ PHPDBG_API void phpdbg_set_breakpoint_opline(zend_ulong
opline TSRMLS_DC) /* {{{
phpdbg_breakline_t new_break;
PHPDBG_G(flags) |= PHPDBG_HAS_OPLINE_BP;
-
- new_break.name = NULL;
- new_break.opline = opline;
+
new_break.id = PHPDBG_G(bp_count)++;
new_break.type = PHPDBG_BREAK_OPLINE;
-
+ new_break.hits = 0;
+ new_break.name = NULL;
+ new_break.opline = opline;
+
+
zend_hash_index_update(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE],
opline,
&new_break, sizeof(phpdbg_breakline_t), NULL);
@@ -264,11 +269,12 @@ PHPDBG_API void phpdbg_set_breakpoint_opcode(const char
*name, size_t name_len T
return;
}
- new_break.hash = hash;
- new_break.name = estrndup(name, name_len);
new_break.id = PHPDBG_G(bp_count)++;
new_break.type = PHPDBG_BREAK_OPCODE;
-
+ new_break.hits = 0;
+ new_break.hash = hash;
+ new_break.name = estrndup(name, name_len);
+
zend_hash_index_update(&PHPDBG_G(bp)[PHPDBG_BREAK_OPCODE], hash,
&new_break, sizeof(phpdbg_breakop_t), NULL);
@@ -285,10 +291,11 @@ PHPDBG_API void
phpdbg_set_breakpoint_opline_ex(phpdbg_opline_ptr_t opline TSRML
PHPDBG_G(flags) |= PHPDBG_HAS_OPLINE_BP;
- new_break.opline = (zend_ulong) opline;
new_break.id = PHPDBG_G(bp_count)++;
new_break.type = PHPDBG_BREAK_OPLINE;
-
+ new_break.hits = 0;
+ new_break.opline = (zend_ulong) opline;
+
zend_hash_index_update(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE],
(zend_ulong) opline, &new_break,
sizeof(phpdbg_breakline_t), NULL);
@@ -307,10 +314,11 @@ PHPDBG_API void phpdbg_set_breakpoint_expression(const
char *expr, size_t expr_l
zend_uint cops = CG(compiler_options);
zval pv;
- new_break.hash = hash;
new_break.id = PHPDBG_G(bp_count)++;
new_break.type = PHPDBG_BREAK_COND;
-
+ new_break.hits = 0;
+ new_break.hash = hash;
+
cops = CG(compiler_options);
CG(compiler_options) = ZEND_COMPILE_DEFAULT_FOR_EVAL;
@@ -350,34 +358,32 @@ PHPDBG_API void phpdbg_set_breakpoint_expression(const
char *expr, size_t expr_l
}
} /* }}} */
-int phpdbg_find_breakpoint_file(zend_op_array *op_array TSRMLS_DC) /* {{{ */
+phpdbg_breakbase_t* phpdbg_find_breakpoint_file(zend_op_array *op_array
TSRMLS_DC) /* {{{ */
{
HashTable *breaks;
- phpdbg_breakfile_t *brake;
+ phpdbg_breakbase_t *brake;
size_t name_len = strlen(op_array->filename);
if (zend_hash_find(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], op_array->filename,
name_len, (void**)&breaks) == FAILURE) {
- return FAILURE;
+ return NULL;
}
if (zend_hash_index_find(breaks, (*EG(opline_ptr))->lineno,
(void**)&brake) == SUCCESS) {
- phpdbg_notice("Breakpoint #%d at %s:%ld",
- brake->id, brake->filename, brake->line);
- return SUCCESS;
+ return brake;
}
- return FAILURE;
+ return NULL;
} /* }}} */
-int phpdbg_find_breakpoint_symbol(zend_function *fbc TSRMLS_DC) /* {{{ */
+phpdbg_breakbase_t* phpdbg_find_breakpoint_symbol(zend_function *fbc
TSRMLS_DC) /* {{{ */
{
const char *fname;
zend_op_array *ops;
- phpdbg_breaksymbol_t *bp;
+ phpdbg_breakbase_t *brake;
if (fbc->type != ZEND_USER_FUNCTION) {
- return FAILURE;
+ return NULL;
}
ops = (zend_op_array*)fbc;
@@ -393,21 +399,17 @@ int phpdbg_find_breakpoint_symbol(zend_function *fbc
TSRMLS_DC) /* {{{ */
fname = "main";
}
- if (zend_hash_find(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], fname,
strlen(fname), (void**)&bp) == SUCCESS) {
- phpdbg_notice("Breakpoint #%d in %s() at %s:%u",
- bp->id, bp->symbol,
- zend_get_executed_filename(TSRMLS_C),
- zend_get_executed_lineno(TSRMLS_C));
- return SUCCESS;
+ if (zend_hash_find(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM], fname,
strlen(fname), (void**)&brake) == SUCCESS) {
+ return brake;
}
- return FAILURE;
+ return NULL;
} /* }}} */
-int phpdbg_find_breakpoint_method(zend_op_array *ops TSRMLS_DC) /* {{{ */
+phpdbg_breakbase_t* phpdbg_find_breakpoint_method(zend_op_array *ops
TSRMLS_DC) /* {{{ */
{
HashTable *class_table;
- phpdbg_breakmethod_t *bp;
+ phpdbg_breakbase_t *brake;
if (zend_hash_find(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD], ops->scope->name,
ops->scope->name_length, (void**)&class_table) == SUCCESS) {
@@ -417,61 +419,46 @@ int phpdbg_find_breakpoint_method(zend_op_array *ops
TSRMLS_DC) /* {{{ */
if (zend_hash_find(
class_table,
lcname,
- lcname_len, (void**)&bp) == SUCCESS) {
+ lcname_len, (void**)&brake) == SUCCESS) {
efree(lcname);
- phpdbg_notice("Breakpoint #%d in %s::%s() at %s:%u",
- bp->id, bp->class_name, bp->func_name,
- zend_get_executed_filename(TSRMLS_C),
- zend_get_executed_lineno(TSRMLS_C));
- return SUCCESS;
+ return brake;
}
efree(lcname);
}
- return FAILURE;
+ return NULL;
} /* }}} */
-int phpdbg_find_breakpoint_opline(phpdbg_opline_ptr_t opline TSRMLS_DC) /* {{{
*/
+phpdbg_breakbase_t* phpdbg_find_breakpoint_opline(phpdbg_opline_ptr_t opline
TSRMLS_DC) /* {{{ */
{
- phpdbg_breakline_t *bp;
+ phpdbg_breakbase_t *brake;
if (zend_hash_index_find(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE],
- (zend_ulong) opline, (void**)&bp) == SUCCESS) {
- phpdbg_notice("Breakpoint #%d in %#lx at %s:%u",
- bp->id, bp->opline,
- zend_get_executed_filename(TSRMLS_C),
- zend_get_executed_lineno(TSRMLS_C));
-
- return SUCCESS;
+ (zend_ulong) opline, (void**)&brake) == SUCCESS) {
+ return brake;
}
- return FAILURE;
+ return NULL;
} /* }}} */
-int phpdbg_find_breakpoint_opcode(zend_uchar opcode TSRMLS_DC) /* {{{ */
+phpdbg_breakbase_t* phpdbg_find_breakpoint_opcode(zend_uchar opcode TSRMLS_DC)
/* {{{ */
{
- phpdbg_breakop_t *bp;
+ phpdbg_breakbase_t *brake;
const char *opname = phpdbg_decode_opcode(opcode);
if (memcmp(opname, PHPDBG_STRL("UNKNOWN")) == 0) {
- return FAILURE;
+ return NULL;
}
if (zend_hash_index_find(&PHPDBG_G(bp)[PHPDBG_BREAK_OPCODE],
- zend_hash_func(opname, strlen(opname)), (void**)&bp) ==
SUCCESS) {
- phpdbg_notice("Breakpoint #%d in %s at %s:%u",
- bp->id,
- opname,
- zend_get_executed_filename(TSRMLS_C),
- zend_get_executed_lineno(TSRMLS_C));
-
- return SUCCESS;
+ zend_hash_func(opname, strlen(opname)), (void**)&brake) ==
SUCCESS) {
+ return brake;
}
- return FAILURE;
+ return NULL;
} /* }}} */
-int phpdbg_find_conditional_breakpoint(TSRMLS_D) /* {{{ */
+phpdbg_breakbase_t* phpdbg_find_conditional_breakpoint(TSRMLS_D) /* {{{ */
{
phpdbg_breakcond_t *bp;
HashPosition position;
@@ -505,7 +492,6 @@ int phpdbg_find_conditional_breakpoint(TSRMLS_D) /* {{{ */
breakpoint = SUCCESS;
}
} zend_catch {
- phpdbg_error("Error detected while evaluating
expression %s", bp->code);
CG(interactive) = orig_interactive;
EG(no_extensions)=1;
@@ -528,55 +514,50 @@ int phpdbg_find_conditional_breakpoint(TSRMLS_D) /* {{{ */
}
}
- if (breakpoint == SUCCESS) {
- phpdbg_notice("Conditional breakpoint #%d: (%s) %s:%u",
- bp->id, bp->code,
- zend_get_executed_filename(TSRMLS_C),
- zend_get_executed_lineno(TSRMLS_C));
- }
-
- return breakpoint;
+ return (breakpoint == SUCCESS) ? ((phpdbg_breakbase_t*)bp) : NULL;
} /* }}} */
-int phpdbg_find_breakpoint(zend_execute_data* execute_data TSRMLS_DC) /* {{{ */
+phpdbg_breakbase_t* phpdbg_find_breakpoint(zend_execute_data* execute_data
TSRMLS_DC) /* {{{ */
{
+ phpdbg_breakbase_t *base = NULL;
+
if (!(PHPDBG_G(flags) & PHPDBG_IS_BP_ENABLED)) {
- return FAILURE;
+ return NULL;
}
/* conditions cannot be executed by eval()'d code */
if (!(PHPDBG_G(flags) & PHPDBG_IN_EVAL)
&& (PHPDBG_G(flags) & PHPDBG_HAS_COND_BP)
- && phpdbg_find_conditional_breakpoint(TSRMLS_C) == SUCCESS) {
- return SUCCESS;
+ && (base = phpdbg_find_conditional_breakpoint(TSRMLS_C))) {
+ return base;
}
if (PHPDBG_G(flags) & PHPDBG_HAS_FILE_BP
- && phpdbg_find_breakpoint_file(execute_data->op_array
TSRMLS_CC) == SUCCESS) {
- return SUCCESS;
+ && (base = phpdbg_find_breakpoint_file(execute_data->op_array
TSRMLS_CC))) {
+ return base;
}
if (PHPDBG_G(flags) & (PHPDBG_HAS_METHOD_BP|PHPDBG_HAS_SYM_BP)) {
/* check we are at the beginning of the stack */
if (execute_data->opline == EG(active_op_array)->opcodes) {
- if (phpdbg_find_breakpoint_symbol(
- execute_data->function_state.function
TSRMLS_CC) == SUCCESS) {
- return SUCCESS;
+ if ((base = phpdbg_find_breakpoint_symbol(
+ execute_data->function_state.function
TSRMLS_CC))) {
+ return base;
}
}
}
if (PHPDBG_G(flags) & PHPDBG_HAS_OPLINE_BP
&& phpdbg_find_breakpoint_opline(execute_data->opline
TSRMLS_CC) == SUCCESS) {
- return SUCCESS;
+ return base;
}
if (PHPDBG_G(flags) & PHPDBG_HAS_OPCODE_BP
&& phpdbg_find_breakpoint_opcode(execute_data->opline->opcode
TSRMLS_CC) == SUCCESS) {
- return SUCCESS;
+ return base;
}
- return FAILURE;
+ return NULL;
} /* }}} */
PHPDBG_API void phpdbg_delete_breakpoint(zend_ulong num TSRMLS_DC) /* {{{ */
@@ -666,6 +647,84 @@ PHPDBG_API void phpdbg_clear_breakpoints(TSRMLS_D) /* {{{
*/
PHPDBG_G(bp_count) = 0;
} /* }}} */
+PHPDBG_API void phpdbg_hit_breakpoint(phpdbg_breakbase_t* brake, zend_bool
output TSRMLS_DC) /* {{{ */
+{
+ brake->hits++;
+
+ if (output) {
+ phpdbg_print_breakpoint(brake TSRMLS_CC);
+ }
+} /* }}} */
+
+PHPDBG_API void phpdbg_print_breakpoint(phpdbg_breakbase_t* brake TSRMLS_DC)
/* {{{ */
+{
+ if (!brake)
+ goto unknown;
+
+ switch (brake->type) {
+ case PHPDBG_BREAK_FILE: {
+ phpdbg_notice("Breakpoint #%d at %s:%ld, hits: %d",
+ ((phpdbg_breakfile_t*)brake)->id,
+ ((phpdbg_breakfile_t*)brake)->filename,
+ ((phpdbg_breakfile_t*)brake)->line,
+ ((phpdbg_breakfile_t*)brake)->hits);
+ } break;
+
+ case PHPDBG_BREAK_SYM: {
+ phpdbg_notice("Breakpoint #%d in %s() at %s:%u, hits:
%d",
+ ((phpdbg_breaksymbol_t*)brake)->id,
+ ((phpdbg_breaksymbol_t*)brake)->symbol,
+ zend_get_executed_filename(TSRMLS_C),
+ zend_get_executed_lineno(TSRMLS_C),
+ ((phpdbg_breakfile_t*)brake)->hits);
+ } break;
+
+ case PHPDBG_BREAK_OPLINE: {
+ phpdbg_notice("Breakpoint #%d in %#lx at %s:%u, hits:
%d",
+ ((phpdbg_breakline_t*)brake)->id,
+ ((phpdbg_breakline_t*)brake)->opline,
+ zend_get_executed_filename(TSRMLS_C),
+ zend_get_executed_lineno(TSRMLS_C),
+ ((phpdbg_breakline_t*)brake)->hits);
+ } break;
+
+ case PHPDBG_BREAK_OPCODE: {
+ phpdbg_notice("Breakpoint #%d in %s at %s:%u, hits:
%d",
+ ((phpdbg_breakop_t*)brake)->id,
+ ((phpdbg_breakop_t*)brake)->name,
+ zend_get_executed_filename(TSRMLS_C),
+ zend_get_executed_lineno(TSRMLS_C),
+ ((phpdbg_breakop_t*)brake)->hits);
+ } break;
+
+ case PHPDBG_BREAK_METHOD: {
+ phpdbg_notice("Breakpoint #%d in %s::%s() at %s:%u,
hits: %d",
+ ((phpdbg_breakmethod_t*)brake)->id,
+ ((phpdbg_breakmethod_t*)brake)->class_name,
+ ((phpdbg_breakmethod_t*)brake)->func_name,
+ zend_get_executed_filename(TSRMLS_C),
+ zend_get_executed_lineno(TSRMLS_C),
+ ((phpdbg_breakmethod_t*)brake)->hits);
+ } break;
+
+ case PHPDBG_BREAK_COND: {
+ phpdbg_notice("Conditional breakpoint #%d: (%s) %s:%u,
hits: %d",
+ ((phpdbg_breakcond_t*)brake)->id,
+ ((phpdbg_breakcond_t*)brake)->code,
+ zend_get_executed_filename(TSRMLS_C),
+ zend_get_executed_lineno(TSRMLS_C),
+ ((phpdbg_breakcond_t*)brake)->hits);
+ } break;
+
+ default: {
+unknown:
+ phpdbg_notice("Unknown breakpoint at %s:%u",
+ zend_get_executed_filename(TSRMLS_C),
+ zend_get_executed_lineno(TSRMLS_C));
+ }
+ }
+} /* }}} */
+
PHPDBG_API void phpdbg_print_breakpoints(zend_ulong type TSRMLS_DC) /* {{{ */
{
switch (type) {
diff --git a/phpdbg_bp.h b/phpdbg_bp.h
index 607521f..ef1049e 100644
--- a/phpdbg_bp.h
+++ b/phpdbg_bp.h
@@ -23,20 +23,23 @@
/* {{{ */
typedef struct _zend_op *phpdbg_opline_ptr_t; /* }}} */
+/* {{{ breakpoint base structure */
+#define phpdbg_breakbase(name) \
+ int id; \
+ zend_uchar type; \
+ zend_ulong hits; \
+ const char *name; /* }}} */
+
/* {{{ breakpoint base */
typedef struct _phpdbg_breakbase_t {
- int id;
- zend_uchar type;
- const char *name;
+ phpdbg_breakbase(name);
} phpdbg_breakbase_t; /* }}} */
/**
* Breakpoint file-based representation
*/
typedef struct _phpdbg_breakfile_t {
- int id;
- zend_uchar type;
- const char *filename;
+ phpdbg_breakbase(filename);
long line;
} phpdbg_breakfile_t;
@@ -44,18 +47,14 @@ typedef struct _phpdbg_breakfile_t {
* Breakpoint symbol-based representation
*/
typedef struct _phpdbg_breaksymbol_t {
- int id;
- zend_uchar type;
- const char *symbol;
+ phpdbg_breakbase(symbol);
} phpdbg_breaksymbol_t;
/**
* Breakpoint method based representation
*/
typedef struct _phpdbg_breakmethod_t {
- int id;
- zend_uchar type;
- const char *class_name;
+ phpdbg_breakbase(class_name);
size_t class_len;
const char *func_name;
size_t func_len;
@@ -65,9 +64,7 @@ typedef struct _phpdbg_breakmethod_t {
* Breakpoint opline based representation
*/
typedef struct _phpdbg_breakline_t {
- int id;
- zend_uchar type;
- const char *name;
+ phpdbg_breakbase(name);
zend_ulong opline;
} phpdbg_breakline_t;
@@ -75,9 +72,7 @@ typedef struct _phpdbg_breakline_t {
* Breakpoint opcode based representation
*/
typedef struct _phpdbg_breakop_t {
- int id;
- zend_uchar type;
- const char *name;
+ phpdbg_breakbase(name);
zend_ulong hash;
} phpdbg_breakop_t;
@@ -85,9 +80,7 @@ typedef struct _phpdbg_breakop_t {
* Breakpoint condition based representation
*/
typedef struct _phpdbg_breakcond_t {
- int id;
- zend_uchar type;
- const char *code;
+ phpdbg_breakbase(code);
size_t code_len;
zend_ulong hash;
zend_op_array *ops;
@@ -101,16 +94,18 @@ PHPDBG_API void phpdbg_set_breakpoint_opline(zend_ulong
TSRMLS_DC);
PHPDBG_API void phpdbg_set_breakpoint_opline_ex(phpdbg_opline_ptr_t TSRMLS_DC);
PHPDBG_API void phpdbg_set_breakpoint_expression(const char*, size_t
TSRMLS_DC);
-int phpdbg_find_breakpoint_file(zend_op_array* TSRMLS_DC);
-int phpdbg_find_breakpoint_symbol(zend_function* TSRMLS_DC);
-int phpdbg_find_breakpoint_method(zend_op_array* TSRMLS_DC);
-int phpdbg_find_breakpoint_opline(phpdbg_opline_ptr_t TSRMLS_DC);
-int phpdbg_find_breakpoint_opcode(zend_uchar TSRMLS_DC);
-int phpdbg_find_conditional_breakpoint(TSRMLS_D);
-int phpdbg_find_breakpoint(zend_execute_data* TSRMLS_DC);
+phpdbg_breakbase_t* phpdbg_find_breakpoint_file(zend_op_array* TSRMLS_DC);
+phpdbg_breakbase_t* phpdbg_find_breakpoint_symbol(zend_function* TSRMLS_DC);
+phpdbg_breakbase_t* phpdbg_find_breakpoint_method(zend_op_array* TSRMLS_DC);
+phpdbg_breakbase_t* phpdbg_find_breakpoint_opline(phpdbg_opline_ptr_t
TSRMLS_DC);
+phpdbg_breakbase_t* phpdbg_find_breakpoint_opcode(zend_uchar TSRMLS_DC);
+phpdbg_breakbase_t* phpdbg_find_conditional_breakpoint(TSRMLS_D);
+phpdbg_breakbase_t* phpdbg_find_breakpoint(zend_execute_data* TSRMLS_DC);
PHPDBG_API void phpdbg_delete_breakpoint(zend_ulong num TSRMLS_DC);
PHPDBG_API void phpdbg_clear_breakpoints(TSRMLS_D);
+PHPDBG_API void phpdbg_hit_breakpoint(phpdbg_breakbase_t* brake, zend_bool
output TSRMLS_DC);
+PHPDBG_API void phpdbg_print_breakpoint(phpdbg_breakbase_t* brake TSRMLS_DC);
PHPDBG_API void phpdbg_print_breakpoints(zend_ulong type TSRMLS_DC);
PHPDBG_API void phpdbg_export_breakpoints(FILE *handle TSRMLS_DC);
diff --git a/phpdbg_prompt.c b/phpdbg_prompt.c
index 009d19c..b9c22b9 100644
--- a/phpdbg_prompt.c
+++ b/phpdbg_prompt.c
@@ -1394,9 +1394,16 @@ zend_vm_enter:
phpdbg_print_opline_ex(
execute_data, &vars, 0 TSRMLS_CC);
- if (PHPDBG_G(flags) & PHPDBG_BP_MASK
- && phpdbg_find_breakpoint(execute_data TSRMLS_CC) ==
SUCCESS) {
- DO_INTERACTIVE();
+ /* search for breakpoints */
+ {
+ phpdbg_breakbase_t *brake;
+
+ if ((PHPDBG_G(flags) & PHPDBG_BP_MASK) &&
+ (brake = phpdbg_find_breakpoint(execute_data
TSRMLS_CC))) {
+ phpdbg_hit_breakpoint(
+ brake, 1 TSRMLS_CC);
+ DO_INTERACTIVE();
+ }
}
if (PHPDBG_G(flags) & PHPDBG_IS_STEPPING) {
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php