ID: 44428 Updated by: [EMAIL PROTECTED] Reported By: thuejk at gmail dot com -Status: Open +Status: Bogus Bug Type: Scripting Engine problem Operating System: * PHP Version: 5.2.5 -Assigned To: +Assigned To: dmitry New Comment:
The debug backtrace shows filename and lineno of calling script. In case function is called from inside internal function (may be as callback) no filename and lineno may be set. Previous Comments: ------------------------------------------------------------------------ [2008-03-30 17:56:28] php at xuefeng dot org Index: zend_builtin_functions.c =================================================================== RCS file: /repository/ZendEngine2/zend_builtin_functions.c,v retrieving revision 1.277.2.12.2.25.2.14 diff -u -r1.277.2.12.2.25.2.14 zend_builtin_functions.c --- zend_builtin_functions.c 10 Mar 2008 22:02:41 -0000 1.277.2.12.2.25.2.14 +++ zend_builtin_functions.c 30 Mar 2008 17:54:29 -0000 @@ -2000,6 +2000,19 @@ } else if (ptr->function_state.function->common.scope) { add_assoc_string_ex(stack_frame, "class", sizeof("class"), ptr->function_state.function->common.scope->name, 1); add_assoc_string_ex(stack_frame, "type", sizeof("type"), "::", 1); + + } else if (ptr->function_state.function->common.type == ZEND_USER_FUNCTION) { + + if (ptr->function_state.function->op_array.filename) { + add_assoc_string_ex(stack_frame, "file", sizeof("file"), + ptr->function_state.function->op_array.filename, 1 + ); + } + if (ptr->function_state.function->op_array.opcodes) { + add_assoc_long_ex(stack_frame, "line", sizeof("line"), + ptr->function_state.function->op_array.opcodes->lineno + ); + } } if ((! ptr->opline) || ((ptr->opline->opcode == ZEND_DO_FCALL_BY_NAME) || (ptr->opline->opcode == ZEND_DO_FCALL))) { ------------------------------------------------------------------------ [2008-03-13 12:03:59] thuejk at gmail dot com Description: ------------ In all cases (but the one below one), "file" and "line" indexes are defined in each frame of the output of debug_backtrace. But when using call_user_function() or call_user_function_array, "file" and "line" is not defined for one of the frames. It would be nice if I could count on file and line always being defined when using the output of debug_backtrace, thereby avoiding code for special cases. For the missing file and line in the example code below, when calling f() inside call_user_function(), I suggest using the file and line of the call_user_function() call. See also bug 38047 and 24405. Reproduce code: --------------- <?php error_reporting(E_ALL | E_STRICT); function f() { $a = $b; var_dump(debug_backtrace()); } //The backtrace generated here will not have file and line defined call_user_func("f", Array()); //The backtrace generated here will have file and line defined. f(); ?> Expected result: ---------------- The frame with index 0 of the first debug_backtrace_call should contain indexes "file" => "test.php" and "line" => 6 Actual result: -------------- array(2) { [0]=> array(2) { ["function"]=> string(1) "f" ["args"]=> array(1) { [0]=> &array(0) { } } } [1]=> array(4) { ["file"]=> string(18) "/home/tjk/test.php" ["line"]=> int(6) ["function"]=> string(14) "call_user_func" ["args"]=> array(2) { [0]=> &string(1) "f" [1]=> &array(0) { } } } } array(1) { [0]=> array(4) { ["file"]=> string(18) "/home/tjk/test.php" ["line"]=> int(8) ["function"]=> string(1) "f" ["args"]=> array(0) { } } } ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=44428&edit=1