@@ -234,62 +234,48 @@ void phpdbg_list_function_byname(const char *str, size_t len) /* {{{ */
234
234
/* Note: do not free the original file handler, let original compile_file() or caller do that. Caller may rely on its value to check success */
235
235
zend_op_array * phpdbg_compile_file (zend_file_handle * file , int type ) {
236
236
phpdbg_file_source data , * dataptr ;
237
- zend_file_handle fake ;
238
237
zend_op_array * ret ;
239
- char * filename ;
240
238
uint32_t line ;
241
239
char * bufptr , * endptr ;
240
+ int size ;
242
241
243
- if (zend_stream_fixup (file , & bufptr , & data .len ) == FAILURE ) {
244
- return PHPDBG_G (compile_file )(file , type );
242
+ ret = PHPDBG_G (compile_file )(file , type );
243
+ if (ret == NULL ) {
244
+ return ret ;
245
245
}
246
246
247
- filename = (char * )(file -> opened_path ? ZSTR_VAL (file -> opened_path ) : file -> filename );
247
+ if (file -> type == ZEND_HANDLE_MAPPED ) {
248
+ data .len = file -> handle .stream .mmap .len ;
249
+ data .buf = emalloc (data .len + 1 );
250
+ memcpy (data .buf , file -> handle .stream .mmap .buf , data .len );
251
+ } else {
252
+ if (file -> type == ZEND_HANDLE_FILENAME ) {
253
+ zend_stream_open (file -> filename , file );
254
+ }
248
255
249
- data . buf = emalloc ( data . len + ZEND_MMAP_AHEAD + 1 );
250
- if ( data .len > 0 ) {
251
- memcpy ( data .buf , bufptr , data .len );
256
+ size = file -> handle . stream . fsizer ( file -> handle . stream . handle );
257
+ data .buf = emalloc ( size + 1 );
258
+ data .len = file -> handle . stream . reader ( file -> handle . stream . handle , data .buf , size );
252
259
}
253
- memset (data .buf + data .len , 0 , ZEND_MMAP_AHEAD + 1 );
254
- data .line [0 ] = 0 ;
255
260
256
- memset (& fake , 0 , sizeof (fake ));
257
- fake .type = ZEND_HANDLE_MAPPED ;
258
- fake .handle .stream .mmap .buf = data .buf ;
259
- fake .handle .stream .mmap .len = data .len ;
260
- fake .free_filename = 0 ;
261
- fake .filename = filename ;
262
- fake .opened_path = file -> opened_path ;
261
+ memset (data .buf + data .len , 0 , 1 );
263
262
263
+ data .line [0 ] = 0 ;
264
264
* (dataptr = emalloc (sizeof (phpdbg_file_source ) + sizeof (uint32_t ) * data .len )) = data ;
265
265
266
266
for (line = 0 , bufptr = data .buf - 1 , endptr = data .buf + data .len ; ++ bufptr < endptr ;) {
267
267
if (* bufptr == '\n' ) {
268
268
dataptr -> line [++ line ] = (uint32_t )(bufptr - data .buf ) + 1 ;
269
269
}
270
270
}
271
+
271
272
dataptr -> lines = ++ line ;
273
+ dataptr = erealloc (dataptr , sizeof (phpdbg_file_source ) + sizeof (uint32_t ) * line );
272
274
dataptr -> line [line ] = endptr - data .buf ;
273
275
274
- ret = PHPDBG_G (compile_file )(& fake , type );
275
-
276
- if (ret == NULL ) {
277
- efree (data .buf );
278
- efree (dataptr );
279
-
280
- fake .opened_path = NULL ;
281
- zend_file_handle_dtor (& fake );
282
-
283
- return NULL ;
284
- }
285
-
286
- dataptr = erealloc (dataptr , sizeof (phpdbg_file_source ) + sizeof (uint32_t ) * line );
287
276
zend_hash_add_ptr (& PHPDBG_G (file_sources ), ret -> filename , dataptr );
288
277
phpdbg_resolve_pending_file_break (ZSTR_VAL (ret -> filename ));
289
278
290
- fake .opened_path = NULL ;
291
- zend_file_handle_dtor (& fake );
292
-
293
279
return ret ;
294
280
}
295
281
0 commit comments