Skip to content

Commit 09da895

Browse files
committed
Merge remote-tracking branch 'origin/PHP-5.6'
Conflicts: sapi/phpdbg/phpdbg.c sapi/phpdbg/phpdbg_bp.c sapi/phpdbg/phpdbg_list.c sapi/phpdbg/phpdbg_parser.c sapi/phpdbg/phpdbg_parser.h sapi/phpdbg/phpdbg_prompt.c
2 parents 9e62255 + 50756b5 commit 09da895

14 files changed

+571
-417
lines changed

sapi/phpdbg/phpdbg.c

+120-56
Large diffs are not rendered by default.

sapi/phpdbg/phpdbg.h

+49-52
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ static zend_always_inline void *zend_hash_index_add_mem(HashTable *ht, zend_ulon
139139
#include "phpdbg_utils.h"
140140
#include "phpdbg_btree.h"
141141
#include "phpdbg_watch.h"
142+
#include "phpdbg_bp.h"
142143
#ifdef PHP_WIN32
143144
# include "phpdbg_sigio_win32.h"
144145
#endif
@@ -154,70 +155,64 @@ int phpdbg_do_parse(phpdbg_param_t *stack, char *input TSRMLS_DC);
154155
BEGIN: DO NOT CHANGE DO NOT CHANGE DO NOT CHANGE
155156
*/
156157

157-
/* {{{ tables */
158-
#define PHPDBG_BREAK_FILE 0
159-
#define PHPDBG_BREAK_SYM 1
160-
#define PHPDBG_BREAK_OPLINE 2
161-
#define PHPDBG_BREAK_METHOD 3
162-
#define PHPDBG_BREAK_COND 4
163-
#define PHPDBG_BREAK_OPCODE 5
164-
#define PHPDBG_BREAK_FUNCTION_OPLINE 6
165-
#define PHPDBG_BREAK_METHOD_OPLINE 7
166-
#define PHPDBG_BREAK_FILE_OPLINE 8
167-
#define PHPDBG_BREAK_MAP 9
168-
#define PHPDBG_BREAK_TABLES 10 /* }}} */
169-
170158
/* {{{ flags */
171-
#define PHPDBG_HAS_FILE_BP (1<<1)
172-
#define PHPDBG_HAS_SYM_BP (1<<2)
173-
#define PHPDBG_HAS_OPLINE_BP (1<<3)
174-
#define PHPDBG_HAS_METHOD_BP (1<<4)
175-
#define PHPDBG_HAS_COND_BP (1<<5)
176-
#define PHPDBG_HAS_OPCODE_BP (1<<6)
177-
#define PHPDBG_HAS_FUNCTION_OPLINE_BP (1<<7)
178-
#define PHPDBG_HAS_METHOD_OPLINE_BP (1<<8)
179-
#define PHPDBG_HAS_FILE_OPLINE_BP (1<<9) /* }}} */
159+
#define PHPDBG_HAS_FILE_BP (1ULL<<1)
160+
#define PHPDBG_HAS_PENDING_FILE_BP (1ULL<<2)
161+
#define PHPDBG_HAS_SYM_BP (1ULL<<3)
162+
#define PHPDBG_HAS_OPLINE_BP (1ULL<<4)
163+
#define PHPDBG_HAS_METHOD_BP (1ULL<<5)
164+
#define PHPDBG_HAS_COND_BP (1ULL<<6)
165+
#define PHPDBG_HAS_OPCODE_BP (1ULL<<7)
166+
#define PHPDBG_HAS_FUNCTION_OPLINE_BP (1ULL<<8)
167+
#define PHPDBG_HAS_METHOD_OPLINE_BP (1ULL<<9)
168+
#define PHPDBG_HAS_FILE_OPLINE_BP (1ULL<<10) /* }}} */
180169

181170
/*
182171
END: DO NOT CHANGE DO NOT CHANGE DO NOT CHANGE
183172
*/
184173

185-
#define PHPDBG_IN_COND_BP (1<<10)
186-
#define PHPDBG_IN_EVAL (1<<11)
174+
#define PHPDBG_IN_COND_BP (1ULL<<11)
175+
#define PHPDBG_IN_EVAL (1ULL<<12)
176+
177+
#define PHPDBG_IS_STEPPING (1ULL<<13)
178+
#define PHPDBG_STEP_OPCODE (1ULL<<14)
179+
#define PHPDBG_IS_QUIET (1ULL<<15)
180+
#define PHPDBG_IS_QUITTING (1ULL<<16)
181+
#define PHPDBG_IS_COLOURED (1ULL<<17)
182+
#define PHPDBG_IS_CLEANING (1ULL<<18)
183+
#define PHPDBG_IS_RUNNING (1ULL<<19)
187184

188-
#define PHPDBG_IS_STEPPING (1<<12)
189-
#define PHPDBG_STEP_OPCODE (1<<13)
190-
#define PHPDBG_IS_QUIET (1<<14)
191-
#define PHPDBG_IS_QUITTING (1<<15)
192-
#define PHPDBG_IS_COLOURED (1<<16)
193-
#define PHPDBG_IS_CLEANING (1<<17)
185+
#define PHPDBG_IN_UNTIL (1ULL<<20)
186+
#define PHPDBG_IN_FINISH (1ULL<<21)
187+
#define PHPDBG_IN_LEAVE (1ULL<<22)
194188

195-
#define PHPDBG_IN_UNTIL (1<<18)
196-
#define PHPDBG_IN_FINISH (1<<19)
197-
#define PHPDBG_IN_LEAVE (1<<20)
189+
#define PHPDBG_IS_REGISTERED (1ULL<<23)
190+
#define PHPDBG_IS_STEPONEVAL (1ULL<<24)
191+
#define PHPDBG_IS_INITIALIZING (1ULL<<25)
192+
#define PHPDBG_IS_SIGNALED (1ULL<<26)
193+
#define PHPDBG_IS_INTERACTIVE (1ULL<<27)
194+
#define PHPDBG_IS_BP_ENABLED (1ULL<<28)
195+
#define PHPDBG_IS_REMOTE (1ULL<<29)
196+
#define PHPDBG_IS_DISCONNECTED (1ULL<<30)
197+
#define PHPDBG_WRITE_XML (1ULL<<31)
198198

199-
#define PHPDBG_IS_REGISTERED (1<<21)
200-
#define PHPDBG_IS_STEPONEVAL (1<<22)
201-
#define PHPDBG_IS_INITIALIZING (1<<23)
202-
#define PHPDBG_IS_SIGNALED (1<<24)
203-
#define PHPDBG_IS_INTERACTIVE (1<<25)
204-
#define PHPDBG_IS_BP_ENABLED (1<<26)
205-
#define PHPDBG_IS_REMOTE (1<<27)
206-
#define PHPDBG_IS_DISCONNECTED (1<<28)
207-
#define PHPDBG_WRITE_XML (1<<29)
199+
#define PHPDBG_SHOW_REFCOUNTS (1ULL<<32)
208200

209-
#define PHPDBG_SHOW_REFCOUNTS (1<<30)
201+
#define PHPDBG_IN_SIGNAL_HANDLER (1ULL<<33)
210202

211-
#define PHPDBG_IN_SIGNAL_HANDLER (1<<30)
203+
#define PHPDBG_DISCARD_OUTPUT (1ULL<<34)
212204

213-
#define PHPDBG_SEEK_MASK (PHPDBG_IN_UNTIL|PHPDBG_IN_FINISH|PHPDBG_IN_LEAVE)
214-
#define PHPDBG_BP_RESOLVE_MASK (PHPDBG_HAS_FUNCTION_OPLINE_BP|PHPDBG_HAS_METHOD_OPLINE_BP|PHPDBG_HAS_FILE_OPLINE_BP)
215-
#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)
205+
#define PHPDBG_SEEK_MASK (PHPDBG_IN_UNTIL | PHPDBG_IN_FINISH | PHPDBG_IN_LEAVE)
206+
#define PHPDBG_BP_RESOLVE_MASK (PHPDBG_HAS_FUNCTION_OPLINE_BP | PHPDBG_HAS_METHOD_OPLINE_BP | PHPDBG_HAS_FILE_OPLINE_BP)
207+
#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)
208+
#define PHPDBG_IS_STOPPING (PHPDBG_IS_QUITTING | PHPDBG_IS_CLEANING)
209+
210+
#define PHPDBG_PRESERVE_FLAGS_MASK (PHPDBG_SHOW_REFCOUNTS | PHPDBG_IS_STEPONEVAL | PHPDBG_IS_BP_ENABLED | PHPDBG_STEP_OPCODE | PHPDBG_IS_QUIET | PHPDBG_IS_COLOURED)
216211

217212
#ifndef _WIN32
218-
# define PHPDBG_DEFAULT_FLAGS (PHPDBG_IS_QUIET|PHPDBG_IS_COLOURED|PHPDBG_IS_BP_ENABLED)
213+
# define PHPDBG_DEFAULT_FLAGS (PHPDBG_IS_QUIET | PHPDBG_IS_COLOURED | PHPDBG_IS_BP_ENABLED)
219214
#else
220-
# define PHPDBG_DEFAULT_FLAGS (PHPDBG_IS_QUIET|PHPDBG_IS_BP_ENABLED)
215+
# define PHPDBG_DEFAULT_FLAGS (PHPDBG_IS_QUIET | PHPDBG_IS_BP_ENABLED)
221216
#endif /* }}} */
222217

223218
/* {{{ output descriptors */
@@ -280,6 +275,7 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg)
280275
FILE *ptr;
281276
int fd;
282277
} io[PHPDBG_IO_FDS]; /* io */
278+
int eol; /* type of line ending to use */
283279
size_t (*php_stdiop_write)(php_stream *, const char *, size_t TSRMLS_DC);
284280
int in_script_xml; /* in <stream> output mode */
285281
struct {
@@ -305,17 +301,18 @@ ZEND_BEGIN_MODULE_GLOBALS(phpdbg)
305301

306302
JMP_BUF *sigsegv_bailout; /* bailout address for accesibility probing */
307303

308-
zend_ulong flags; /* phpdbg flags */
304+
uint64_t flags; /* phpdbg flags */
309305

310306
char *socket_path; /* phpdbg.path ini setting */
311307
char *sapi_name_ptr; /* store sapi name to free it if necessary to not leak memory */
312308
int socket_fd; /* file descriptor to socket (wait command) (-1 if unused) */
313309
int socket_server_fd; /* file descriptor to master socket (wait command) (-1 if unused) */
314310
#ifdef PHP_WIN32
315-
HANDLE sigio_watcher_thread; /* sigio watcher thread handle */
311+
HANDLE sigio_watcher_thread; /* sigio watcher thread handle */
316312
struct win32_sigio_watcher_data swd;
317313
#endif
318-
int8_t eol;
314+
315+
struct _zend_phpdbg_globals *backup; /* backup of data to store */
319316
ZEND_END_MODULE_GLOBALS(phpdbg) /* }}} */
320317

321318
#endif

sapi/phpdbg/phpdbg_bp.c

+104-27
Original file line numberDiff line numberDiff line change
@@ -207,48 +207,111 @@ PHPDBG_API void phpdbg_set_breakpoint_file(const char *path, long line_num TSRML
207207
{
208208
php_stream_statbuf ssb;
209209
char realpath[MAXPATHLEN];
210+
const char *original_path = path;
211+
zend_bool pending;
210212

211-
if (php_stream_stat_path(path, &ssb) != FAILURE) {
212-
if (ssb.sb.st_mode & (S_IFREG|S_IFLNK)) {
213-
HashTable *broken;
214-
phpdbg_breakfile_t new_break;
215-
size_t path_len = 0L;
213+
HashTable *broken, *file_breaks = &PHPDBG_G(bp)[PHPDBG_BREAK_FILE];
214+
phpdbg_breakfile_t new_break;
215+
size_t path_len = 0L;
216216

217-
if (VCWD_REALPATH(path, realpath)) {
218-
path = realpath;
217+
if (VCWD_REALPATH(path, realpath)) {
218+
path = realpath;
219+
}
220+
path_len = strlen(path);
221+
222+
if (!zend_hash_str_exists(&PHPDBG_G(file_sources), path, path_len)) {
223+
if (php_stream_stat_path(path, &ssb) == FAILURE) {
224+
if (original_path[0] == '/') {
225+
phpdbg_error("breakpoint", "type=\"nofile\" add=\"fail\" file=\"%s\"", "Cannot stat %s, it does not exist", original_path);
226+
return;
219227
}
228+
229+
file_breaks = &PHPDBG_G(bp)[PHPDBG_BREAK_FILE_PENDING];
230+
path = original_path;
220231
path_len = strlen(path);
232+
pending = 1;
233+
} else if (!(ssb.sb.st_mode & (S_IFREG|S_IFLNK))) {
234+
phpdbg_error("breakpoint", "type=\"notregular\" add=\"fail\" file=\"%s\"", "Cannot set breakpoint in %s, it is not a regular file", path);
235+
return;
236+
}
237+
}
221238

222-
if (!(broken = zend_hash_str_find_ptr(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], path, path_len))) {
223-
HashTable breaks;
239+
if (!(broken = zend_hash_str_find_ptr(file_breaks, path, path_len))) {
240+
HashTable breaks;
241+
zend_hash_init(&breaks, 8, NULL, phpdbg_file_breaks_dtor, 0);
224242

225-
zend_hash_init(&breaks, 8, NULL, phpdbg_file_breaks_dtor, 0);
243+
broken = zend_hash_str_add_mem(file_breaks, path, path_len, &breaks, sizeof(HashTable));
244+
}
226245

227-
broken = zend_hash_str_update_mem(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE], path, path_len, &breaks, sizeof(HashTable));
228-
}
246+
if (!zend_hash_index_exists(broken, line_num)) {
247+
PHPDBG_BREAK_INIT(new_break, PHPDBG_BREAK_FILE);
248+
new_break.filename = estrndup(path, path_len);
249+
new_break.line = line_num;
250+
251+
zend_hash_index_update_mem(broken, line_num, &new_break, sizeof(phpdbg_breakfile_t));
229252

230-
if (!zend_hash_index_exists(broken, line_num)) {
231-
PHPDBG_G(flags) |= PHPDBG_HAS_FILE_BP;
253+
if (pending) {
254+
PHPDBG_G(flags) |= PHPDBG_HAS_PENDING_FILE_BP;
232255

233-
PHPDBG_BREAK_INIT(new_break, PHPDBG_BREAK_FILE);
234-
new_break.filename = estrndup(path, path_len);
235-
new_break.line = line_num;
256+
phpdbg_notice("breakpoint", "add=\"success\" id=\"%d\" file=\"%s\" line=\"%ld\" pending=\"pending\"", "Pending breakpoint #%d added at %s:%ld", new_break.id, new_break.filename, new_break.line);
257+
} else {
258+
PHPDBG_G(flags) |= PHPDBG_HAS_FILE_BP;
236259

237-
zend_hash_index_update_mem(broken, line_num, &new_break, sizeof(phpdbg_breakfile_t));
260+
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);
261+
}
238262

239-
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);
263+
PHPDBG_BREAK_MAPPING(new_break.id, broken);
264+
} else {
265+
phpdbg_error("breakpoint", "type=\"exists\" add=\"fail\" file=\"%s\" line=\"%ld\"", "Breakpoint at %s:%ld exists", path, line_num);
266+
}
267+
} /* }}} */
240268

241-
PHPDBG_BREAK_MAPPING(new_break.id, broken);
242-
} else {
243-
phpdbg_error("breakpoint", "type=\"exists\" add=\"fail\" file=\"%s\" line=\"%ld\"", "Breakpoint at %s:%ld exists", path, line_num);
269+
PHPDBG_API void phpdbg_resolve_pending_file_break(const char *file TSRMLS_DC) /* {{{ */
270+
{
271+
HashTable *fileht;
272+
uint filelen = strlen(file);
273+
zend_string *cur;
274+
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;
280+
281+
PHPDBG_G(flags) |= PHPDBG_HAS_FILE_BP;
282+
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));
244287
}
245288

246-
} else {
247-
phpdbg_error("breakpoint", "type=\"notregular\" add=\"fail\" file=\"%s\"", "Cannot set breakpoint in %s, it is not a regular file", path);
289+
ZEND_HASH_FOREACH_PTR(fileht, brake) {
290+
new_brake = *brake;
291+
new_brake.filename = estrndup(file, filelen);
292+
PHPDBG_BREAK_UNMAPPING(brake->id);
293+
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();
303+
304+
zend_hash_del(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE_PENDING], cur);
305+
306+
if (!master) {
307+
PHPDBG_G(bp)[PHPDBG_BREAK_FILE_PENDING].pDestructor = dtor;
308+
}
309+
310+
if (!zend_hash_num_elements(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE_PENDING])) {
311+
PHPDBG_G(flags) &= ~PHPDBG_HAS_PENDING_FILE_BP;
312+
}
248313
}
249-
} else {
250-
phpdbg_error("breakpoint", "type=\"nofile\" add=\"fail\" file=\"%s\"", "Cannot stat %s, it does not exist", path);
251-
}
314+
} ZEND_HASH_FOREACH_END();
252315
} /* }}} */
253316

254317
PHPDBG_API void phpdbg_set_breakpoint_symbol(const char *name, size_t name_len TSRMLS_DC) /* {{{ */
@@ -1048,6 +1111,7 @@ PHPDBG_API void phpdbg_delete_breakpoint(zend_ulong num TSRMLS_DC) /* {{{ */
10481111
PHPDBG_API void phpdbg_clear_breakpoints(TSRMLS_D) /* {{{ */
10491112
{
10501113
zend_hash_clean(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE]);
1114+
zend_hash_clean(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE_PENDING]);
10511115
zend_hash_clean(&PHPDBG_G(bp)[PHPDBG_BREAK_SYM]);
10521116
zend_hash_clean(&PHPDBG_G(bp)[PHPDBG_BREAK_OPLINE]);
10531117
zend_hash_clean(&PHPDBG_G(bp)[PHPDBG_BREAK_METHOD_OPLINE]);
@@ -1283,7 +1347,20 @@ PHPDBG_API void phpdbg_print_breakpoints(zend_ulong type TSRMLS_DC) /* {{{ */
12831347
((phpdbg_breakbase_t *) brake)->disabled ? " [disabled]" : "");
12841348
} ZEND_HASH_FOREACH_END();
12851349
} ZEND_HASH_FOREACH_END();
1350+
} if ((PHPDBG_G(flags) & PHPDBG_HAS_PENDING_FILE_BP)) {
1351+
HashTable *points;
1352+
1353+
phpdbg_out(SEPARATE "\n");
1354+
phpdbg_out("Pending File Breakpoints:\n");
1355+
ZEND_HASH_FOREACH_PTR(&PHPDBG_G(bp)[PHPDBG_BREAK_FILE_PENDING], points) {
1356+
phpdbg_breakfile_t *brake;
12861357

1358+
ZEND_HASH_FOREACH_PTR(points, brake) {
1359+
phpdbg_writeln("file", "id=\"%d\" name=\"%s\" line=\"%lu\" disabled=\"%s\" pending=\"pending\"", "#%d\t\t%s:%lu%s",
1360+
brake->id, brake->filename, brake->line,
1361+
((phpdbg_breakbase_t *) brake)->disabled ? " [disabled]" : "");
1362+
} ZEND_HASH_FOREACH_END();
1363+
} ZEND_HASH_FOREACH_END();
12871364
} break;
12881365

12891366
case PHPDBG_BREAK_OPLINE: if ((PHPDBG_G(flags) & PHPDBG_HAS_OPLINE_BP)) {

sapi/phpdbg/phpdbg_bp.h

+14-12
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,17 @@
2323

2424
/* {{{ defines */
2525
#define PHPDBG_BREAK_FILE 0
26-
#define PHPDBG_BREAK_SYM 1
27-
#define PHPDBG_BREAK_OPLINE 2
28-
#define PHPDBG_BREAK_METHOD 3
29-
#define PHPDBG_BREAK_COND 4
30-
#define PHPDBG_BREAK_OPCODE 5
31-
#define PHPDBG_BREAK_FUNCTION_OPLINE 6
32-
#define PHPDBG_BREAK_METHOD_OPLINE 7
33-
#define PHPDBG_BREAK_FILE_OPLINE 8
34-
#define PHPDBG_BREAK_MAP 9
35-
#define PHPDBG_BREAK_TABLES 10 /* }}} */
26+
#define PHPDBG_BREAK_FILE_PENDING 1
27+
#define PHPDBG_BREAK_SYM 2
28+
#define PHPDBG_BREAK_OPLINE 3
29+
#define PHPDBG_BREAK_METHOD 4
30+
#define PHPDBG_BREAK_COND 5
31+
#define PHPDBG_BREAK_OPCODE 6
32+
#define PHPDBG_BREAK_FUNCTION_OPLINE 7
33+
#define PHPDBG_BREAK_METHOD_OPLINE 8
34+
#define PHPDBG_BREAK_FILE_OPLINE 9
35+
#define PHPDBG_BREAK_MAP 10
36+
#define PHPDBG_BREAK_TABLES 11 /* }}} */
3637

3738
/* {{{ */
3839
typedef struct _zend_op *phpdbg_opline_ptr_t; /* }}} */
@@ -116,10 +117,11 @@ typedef struct _phpdbg_breakcond_t {
116117
zend_op_array *ops;
117118
} phpdbg_breakcond_t;
118119

119-
/* {{{ Opline breaks API */
120+
/* {{{ Resolving breaks API */
120121
PHPDBG_API void phpdbg_resolve_op_array_breaks(zend_op_array *op_array TSRMLS_DC);
121122
PHPDBG_API int phpdbg_resolve_op_array_break(phpdbg_breakopline_t *brake, zend_op_array *op_array TSRMLS_DC);
122-
PHPDBG_API int phpdbg_resolve_opline_break(phpdbg_breakopline_t *new_break TSRMLS_DC); /* }}} */
123+
PHPDBG_API int phpdbg_resolve_opline_break(phpdbg_breakopline_t *new_break TSRMLS_DC);
124+
PHPDBG_API void phpdbg_resolve_pending_file_break(const char *file TSRMLS_DC); /* }}} */
123125

124126
/* {{{ Breakpoint Creation API */
125127
PHPDBG_API void phpdbg_set_breakpoint_file(const char* filename, long lineno TSRMLS_DC);

0 commit comments

Comments
 (0)