diff options
| author | Dmitry Stogov <dmitry@php.net> | 2006-07-27 08:20:52 +0000 |
|---|---|---|
| committer | Dmitry Stogov <dmitry@php.net> | 2006-07-27 08:20:52 +0000 |
| commit | 0eb028291203b2ddddf7f37b87e2da45dafabfb6 (patch) | |
| tree | fecc96adcbd691437c3a1397adaf9a75033e3d63 /Zend/zend_builtin_functions.c | |
| parent | 6d6bd77429d2e96329070249c31d63dd392a97e4 (diff) | |
| download | php-git-0eb028291203b2ddddf7f37b87e2da45dafabfb6.tar.gz | |
Fixed bug #38047 ("file" and "line" sometimes not set in backtrace from inside error handler)
Diffstat (limited to 'Zend/zend_builtin_functions.c')
| -rw-r--r-- | Zend/zend_builtin_functions.c | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index e79b906e74..a5a4bb8325 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -1935,7 +1935,23 @@ ZEND_FUNCTION(debug_print_backtrace) if (filename) { zend_printf(") called at [%s:%d]\n", filename, lineno); } else { - ZEND_PUTS(")\n"); + zend_execute_data *prev = skip->prev_execute_data; + + while (prev) { + if (prev->function_state.function && + prev->function_state.function->common.type != ZEND_USER_FUNCTION) { + prev = NULL; + break; + } + if (prev->op_array) { + zend_printf(") called at [%s:%d]\n", prev->op_array->filename, prev->opline->lineno); + break; + } + prev = prev->prev_execute_data; + } + if (!prev) { + ZEND_PUTS(")\n"); + } } include_filename = filename; ptr = skip->prev_execute_data; @@ -2029,6 +2045,20 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int * and debug_baktrace() might have been called by the error_handler. in this case we don't * want to pop anything of the argument-stack */ } else { + zend_execute_data *prev = skip->prev_execute_data; + + while (prev) { + if (prev->function_state.function && + prev->function_state.function->common.type != ZEND_USER_FUNCTION) { + break; + } + if (prev->op_array) { + add_assoc_string_ex(stack_frame, "file", sizeof("file"), prev->op_array->filename, 1); + add_assoc_long_ex(stack_frame, "line", sizeof("line"), prev->opline->lineno); + break; + } + prev = prev->prev_execute_data; + } filename = NULL; } |
