ID: 44428 Comment by: php at xuefeng dot org Reported By: thuejk at gmail dot com Status: Open Bug Type: Scripting Engine problem Operating System: * PHP Version: 5.2.5 New Comment:
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))) { Previous Comments: ------------------------------------------------------------------------ [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