diff options
author | Andi Gutmans <andi@php.net> | 2002-05-10 09:41:50 +0000 |
---|---|---|
committer | Andi Gutmans <andi@php.net> | 2002-05-10 09:41:50 +0000 |
commit | b6219a0dbcfe5c60a1f22e5f168addcda6ed4859 (patch) | |
tree | 78fccf8c4479c716701ea598adfbde2175cb1401 /Zend/zend_builtin_functions.c | |
parent | caa2dd2ce2ed751084030fb2e9efc2d7b9ed038b (diff) | |
download | php-git-b6219a0dbcfe5c60a1f22e5f168addcda6ed4859.tar.gz |
- Make debug_backtrace() return an array. Still not finished because I
might want to differentiate between method calls and static methods.
Example:
$bt = debug_backtrace();
foreach ($bt as $frame) {
if (isset($frame['class'])) {
print $frame['class'];
print "::";
}
print $frame['function'];
print " [";
print $frame['file'];
print ":";
print $frame['line'];
print "]\n";
}
Diffstat (limited to 'Zend/zend_builtin_functions.c')
-rw-r--r-- | Zend/zend_builtin_functions.c | 30 |
1 files changed, 25 insertions, 5 deletions
diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index 15cfee45c8..3fe1165535 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -1195,16 +1195,27 @@ ZEND_FUNCTION(debug_backtrace) int lineno; char *function_name; char *filename; + char *class_name; + zend_uint class_name_length; + zval *stack_frame; ptr = EG(current_execute_data); lineno = ptr->opline->lineno; + array_init(return_value); + while (ptr) { + MAKE_STD_ZVAL(stack_frame); + array_init(stack_frame); + + class_name = NULL; + if (ptr->object) { - printf("%s::", Z_OBJCE(*ptr->object)->name); + class_name = Z_OBJCE(*ptr->object)->name; + class_name_length = Z_OBJCE(*ptr->object)->name_length; } if (ptr->function_state.function->common.scope) { - printf("%s::", ptr->function_state.function->common.scope->name); + class_name = ptr->function_state.function->common.scope->name; } function_name = ptr->function_state.function->common.function_name; if (!function_name) { @@ -1213,17 +1224,26 @@ ZEND_FUNCTION(debug_backtrace) ptr = ptr->prev_execute_data; if (!ptr) { + zval_ptr_dtor(&stack_frame); break; } - + filename = ptr->function_state.function->op_array.filename; + + add_assoc_string_ex(stack_frame, "function", sizeof("function"), function_name, 1); + if (class_name) { + add_assoc_string_ex(stack_frame, "class", sizeof("class"), class_name, 1); + } + add_assoc_string_ex(stack_frame, "file", sizeof("file"), filename, 1); + add_assoc_long_ex(stack_frame, "line", sizeof("line"), lineno); + //add_assoc_stringl_ex(stack_frame, "class", sizeof("class")-1, class_name, class_name_length, 1); - printf("%s() [%s:%d]\n", function_name, filename, lineno); + add_next_index_zval(return_value, stack_frame); + if (ptr->opline) { lineno = ptr->opline->lineno; } } - RETURN_TRUE; } |