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