Skip to content

Commit baba425

Browse files
committed
Merge remote-tracking branch 'origin/PHP-5.6'
Conflicts: sapi/phpdbg/phpdbg_bp.c
2 parents a3ae401 + 0ede82d commit baba425

File tree

3 files changed

+59
-38
lines changed

3 files changed

+59
-38
lines changed

sapi/phpdbg/phpdbg.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ int phpdbg_do_parse(phpdbg_param_t *stack, char *input TSRMLS_DC);
210210
#define PHPDBG_BP_MASK (PHPDBG_HAS_FILE_BP | PHPDBG_HAS_SYM_BP | PHPDBG_HAS_METHOD_BP | PHPDBG_HAS_OPLINE_BP | PHPDBG_HAS_COND_BP | PHPDBG_HAS_OPCODE_BP | PHPDBG_HAS_FUNCTION_OPLINE_BP | PHPDBG_HAS_METHOD_OPLINE_BP | PHPDBG_HAS_FILE_OPLINE_BP)
211211
#define PHPDBG_IS_STOPPING (PHPDBG_IS_QUITTING | PHPDBG_IS_CLEANING)
212212

213-
#define PHPDBG_PRESERVE_FLAGS_MASK (PHPDBG_SHOW_REFCOUNTS | PHPDBG_IS_STEPONEVAL | PHPDBG_IS_BP_ENABLED | PHPDBG_STEP_OPCODE | PHPDBG_IS_QUIET | PHPDBG_IS_COLOURED)
213+
#define PHPDBG_PRESERVE_FLAGS_MASK (PHPDBG_SHOW_REFCOUNTS | PHPDBG_IS_STEPONEVAL | PHPDBG_IS_BP_ENABLED | PHPDBG_STEP_OPCODE | PHPDBG_IS_QUIET | PHPDBG_IS_COLOURED | PHPDBG_IS_REMOTE | PHPDBG_WRITE_XML | PHPDBG_IS_DISCONNECTED)
214214

215215
#ifndef _WIN32
216216
# define PHPDBG_DEFAULT_FLAGS (PHPDBG_IS_QUIET | PHPDBG_IS_COLOURED | PHPDBG_IS_BP_ENABLED)

sapi/phpdbg/phpdbg_bp.c

Lines changed: 57 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,19 @@ PHPDBG_API void phpdbg_set_breakpoint_file(const char *path, long line_num TSRML
250250

251251
zend_hash_index_update_mem(broken, line_num, &new_break, sizeof(phpdbg_breakfile_t));
252252

253+
PHPDBG_BREAK_MAPPING(new_break.id, broken);
254+
255+
if (pending) {
256+
zend_string *file, *path_str = zend_string_init(path, path_len, 0);
257+
ZEND_HASH_FOREACH_STR_KEY(&PHPDBG_G(file_sources), file) {
258+
if (!(pending = ((broken = phpdbg_resolve_pending_file_break_ex(file->val, file->len, path_str, broken TSRMLS_CC)) == NULL))) {
259+
new_break = *(phpdbg_breakfile_t *) zend_hash_index_find_ptr(broken, line_num);
260+
break;
261+
}
262+
} ZEND_HASH_FOREACH_END();
263+
zend_string_release(path_str);
264+
}
265+
253266
if (pending) {
254267
PHPDBG_G(flags) |= PHPDBG_HAS_PENDING_FILE_BP;
255268

@@ -259,58 +272,65 @@ PHPDBG_API void phpdbg_set_breakpoint_file(const char *path, long line_num TSRML
259272

260273
phpdbg_notice("breakpoint", "add=\"success\" id=\"%d\" file=\"%s\" line=\"%ld\"", "Breakpoint #%d added at %s:%ld", new_break.id, new_break.filename, new_break.line);
261274
}
262-
263-
PHPDBG_BREAK_MAPPING(new_break.id, broken);
264275
} else {
265276
phpdbg_error("breakpoint", "type=\"exists\" add=\"fail\" file=\"%s\" line=\"%ld\"", "Breakpoint at %s:%ld exists", path, line_num);
266277
}
267278
} /* }}} */
268279

269-
PHPDBG_API void phpdbg_resolve_pending_file_break(const char *file TSRMLS_DC) /* {{{ */
280+
PHPDBG_API HashTable *phpdbg_resolve_pending_file_break_ex(const char *file, uint filelen, zend_string *cur, HashTable *fileht TSRMLS_DC) /* {{{ */
270281
{
271-
HashTable *fileht;
272-
uint filelen = strlen(file);
273-
zend_string *cur;
282+
if (cur->len < filelen && file[filelen - cur->len - 1] == '/' && !memcmp(file + filelen - cur->len, cur->val, cur->len)) {
283+
phpdbg_breakfile_t *brake, new_brake;
284+
HashTable *master = NULL;
285+
dtor_func_t dtor;
274286

275-
ZEND_HASH_FOREACH_STR_KEY_PTR(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE_PENDING], cur, fileht) {
276-
if (cur->len < filelen && file[filelen - cur->len - 1] == '/' && !memcmp(file + filelen - cur->len, cur->val, cur->len)) {
277-
phpdbg_breakfile_t *brake, new_brake;
278-
HashTable *master;
279-
dtor_func_t dtor;
287+
PHPDBG_G(flags) |= PHPDBG_HAS_FILE_BP;
280288

281-
PHPDBG_G(flags) |= PHPDBG_HAS_FILE_BP;
289+
if (!(master = zend_hash_str_find_ptr(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], file, filelen))) {
290+
dtor = PHPDBG_G(bp)[PHPDBG_BREAK_FILE_PENDING].pDestructor;
291+
PHPDBG_G(bp)[PHPDBG_BREAK_FILE_PENDING].pDestructor = NULL;
292+
fileht = zend_hash_str_add_mem(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], file, filelen, fileht, sizeof(HashTable));
293+
}
294+
295+
ZEND_HASH_FOREACH_PTR(fileht, brake) {
296+
new_brake = *brake;
297+
new_brake.filename = estrndup(file, filelen);
298+
PHPDBG_BREAK_UNMAPPING(brake->id);
282299

283-
if (!(master = zend_hash_str_find_ptr(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], file, filelen))) {
284-
dtor = PHPDBG_G(bp)[PHPDBG_BREAK_FILE_PENDING].pDestructor;
285-
PHPDBG_G(bp)[PHPDBG_BREAK_FILE_PENDING].pDestructor = NULL;
286-
fileht = zend_hash_str_add_mem(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], file, filelen, fileht, sizeof(HashTable));
300+
if (master) {
301+
zend_hash_index_update_mem(master, brake->line, &new_brake, sizeof(phpdbg_breakfile_t));
302+
PHPDBG_BREAK_MAPPING(brake->id, master);
303+
} else {
304+
efree((char *) brake->filename);
305+
*brake = new_brake;
306+
PHPDBG_BREAK_MAPPING(brake->id, fileht);
287307
}
308+
} ZEND_HASH_FOREACH_END();
288309

289-
ZEND_HASH_FOREACH_PTR(fileht, brake) {
290-
new_brake = *brake;
291-
new_brake.filename = estrndup(file, filelen);
292-
PHPDBG_BREAK_UNMAPPING(brake->id);
310+
zend_hash_del(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE_PENDING], cur);
293311

294-
if (master) {
295-
zend_hash_index_update_mem(master, brake->line, &new_brake, sizeof(phpdbg_breakfile_t));
296-
PHPDBG_BREAK_MAPPING(brake->id, master);
297-
} else {
298-
efree((char *) brake->filename);
299-
*brake = new_brake;
300-
PHPDBG_BREAK_MAPPING(brake->id, fileht);
301-
}
302-
} ZEND_HASH_FOREACH_END();
312+
if (!master) {
313+
PHPDBG_G(bp)[PHPDBG_BREAK_FILE_PENDING].pDestructor = dtor;
314+
}
303315

304-
zend_hash_del(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE_PENDING], cur);
316+
if (!zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE_PENDING])) {
317+
PHPDBG_G(flags) &= ~PHPDBG_HAS_PENDING_FILE_BP;
318+
}
305319

306-
if (!master) {
307-
PHPDBG_G(bp)[PHPDBG_BREAK_FILE_PENDING].pDestructor = dtor;
308-
}
320+
return fileht;
321+
}
309322

310-
if (!zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE_PENDING])) {
311-
PHPDBG_G(flags) &= ~PHPDBG_HAS_PENDING_FILE_BP;
312-
}
313-
}
323+
return NULL;
324+
} /* }}} */
325+
326+
PHPDBG_API void phpdbg_resolve_pending_file_break(const char *file TSRMLS_DC) /* {{{ */
327+
{
328+
HashTable *fileht;
329+
uint filelen = strlen(file);
330+
zend_string *cur;
331+
332+
ZEND_HASH_FOREACH_STR_KEY_PTR(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE_PENDING], cur, fileht) {
333+
phpdbg_resolve_pending_file_break_ex(file, filelen, cur, fileht TSRMLS_CC);
314334
} ZEND_HASH_FOREACH_END();
315335
} /* }}} */
316336

sapi/phpdbg/phpdbg_bp.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ typedef struct _phpdbg_breakcond_t {
121121
PHPDBG_API void phpdbg_resolve_op_array_breaks(zend_op_array *op_array TSRMLS_DC);
122122
PHPDBG_API int phpdbg_resolve_op_array_break(phpdbg_breakopline_t *brake, zend_op_array *op_array TSRMLS_DC);
123123
PHPDBG_API int phpdbg_resolve_opline_break(phpdbg_breakopline_t *new_break TSRMLS_DC);
124+
PHPDBG_API HashTable *phpdbg_resolve_pending_file_break_ex(const char *file, uint filelen, zend_string *cur, HashTable *fileht TSRMLS_DC);
124125
PHPDBG_API void phpdbg_resolve_pending_file_break(const char *file TSRMLS_DC); /* }}} */
125126

126127
/* {{{ Breakpoint Creation API */

0 commit comments

Comments
 (0)