@@ -250,6 +250,19 @@ PHPDBG_API void phpdbg_set_breakpoint_file(const char *path, long line_num TSRML
250
250
251
251
zend_hash_index_update_mem (broken , line_num , & new_break , sizeof (phpdbg_breakfile_t ));
252
252
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
+
253
266
if (pending ) {
254
267
PHPDBG_G (flags ) |= PHPDBG_HAS_PENDING_FILE_BP ;
255
268
@@ -259,58 +272,65 @@ PHPDBG_API void phpdbg_set_breakpoint_file(const char *path, long line_num TSRML
259
272
260
273
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
274
}
262
-
263
- PHPDBG_BREAK_MAPPING (new_break .id , broken );
264
275
} else {
265
276
phpdbg_error ("breakpoint" , "type=\"exists\" add=\"fail\" file=\"%s\" line=\"%ld\"" , "Breakpoint at %s:%ld exists" , path , line_num );
266
277
}
267
278
} /* }}} */
268
279
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 ) /* {{{ */
270
281
{
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 ;
274
286
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 ;
280
288
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 );
282
299
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 );
287
307
}
308
+ } ZEND_HASH_FOREACH_END ();
288
309
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 );
293
311
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
+ }
303
315
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
+ }
305
319
306
- if (!master ) {
307
- PHPDBG_G (bp )[PHPDBG_BREAK_FILE_PENDING ].pDestructor = dtor ;
308
- }
320
+ return fileht ;
321
+ }
309
322
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 );
314
334
} ZEND_HASH_FOREACH_END ();
315
335
} /* }}} */
316
336
0 commit comments