@@ -192,6 +192,9 @@ void init_executor(void) /* {{{ */
192192 EG (num_errors ) = 0 ;
193193 EG (errors ) = NULL ;
194194
195+ EG (filename_override ) = NULL ;
196+ EG (lineno_override ) = -1 ;
197+
195198 zend_fiber_init ();
196199 zend_weakrefs_init ();
197200
@@ -462,6 +465,8 @@ void shutdown_executor(void) /* {{{ */
462465 if (EG (ht_iterators ) != EG (ht_iterators_slots )) {
463466 efree (EG (ht_iterators ));
464467 }
468+
469+ ZEND_ASSERT (EG (filename_override ) == NULL );
465470 }
466471
467472#if ZEND_DEBUG
@@ -591,21 +596,18 @@ ZEND_API const char *get_function_arg_name(const zend_function *func, uint32_t a
591596
592597ZEND_API const char * zend_get_executed_filename (void ) /* {{{ */
593598{
594- zend_execute_data * ex = EG (current_execute_data );
595-
596- while (ex && (!ex -> func || !ZEND_USER_CODE (ex -> func -> type ))) {
597- ex = ex -> prev_execute_data ;
598- }
599- if (ex ) {
600- return ZSTR_VAL (ex -> func -> op_array .filename );
601- } else {
602- return "[no active file]" ;
603- }
599+ zend_string * filename = zend_get_executed_filename_ex ();
600+ return filename != NULL ? ZSTR_VAL (filename ) : "[no active file]" ;
604601}
605602/* }}} */
606603
607604ZEND_API zend_string * zend_get_executed_filename_ex (void ) /* {{{ */
608605{
606+ zend_string * filename_override = EG (filename_override );
607+ if (filename_override != NULL ) {
608+ return filename_override ;
609+ }
610+
609611 zend_execute_data * ex = EG (current_execute_data );
610612
611613 while (ex && (!ex -> func || !ZEND_USER_CODE (ex -> func -> type ))) {
@@ -621,6 +623,11 @@ ZEND_API zend_string *zend_get_executed_filename_ex(void) /* {{{ */
621623
622624ZEND_API uint32_t zend_get_executed_lineno (void ) /* {{{ */
623625{
626+ zend_long lineno_override = EG (lineno_override );
627+ if (lineno_override != -1 ) {
628+ return lineno_override ;
629+ }
630+
624631 zend_execute_data * ex = EG (current_execute_data );
625632
626633 while (ex && (!ex -> func || !ZEND_USER_CODE (ex -> func -> type ))) {
0 commit comments