Hi: Attached is a patch that adds an optional 'limit' parameter to debug_backtrace, which limits the size of the returned array. In cases where a script wants debug information only for the current function, or for the function <n> levels above that, we can save a lot of unnecessary call-stack traversal and zval allocation by bailing out early. For a sufficiently large call depth and a small <n>, I'd expect this to improve performance quite a bit.
The patch adds a total of six lines to the function, and one test in the main loop for the zero-argument case. Should apply cleanly to both PHP_4_3 and HEAD. Is there any chance this could be applied? :) Thanks in advance, - Dave [EMAIL PROTECTED] --- Zend/zend_builtin_functions.c~ 2003-05-20 11:33:36.000000000 -0400 +++ Zend/zend_builtin_functions.c 2003-05-20 15:31:09.000000000 -0400 @@ -1173,7 +1173,7 @@ return arg_array; } -/* {{{ proto void debug_backtrace(void) +/* {{{ proto void debug_backtrace([int limit]) Prints out a backtrace */ ZEND_FUNCTION(debug_backtrace) { @@ -1189,11 +1189,21 @@ void **args = cur_arg_pos; int arg_stack_consistent = 0; int frames_on_stack = 0; + zval **limit_zval = NULL; + long limit; - if (ZEND_NUM_ARGS()) { + if (ZEND_NUM_ARGS() > 1) { ZEND_WRONG_PARAM_COUNT(); } + if (ZEND_NUM_ARGS() == 1 && zend_get_parameters_ex(1, &limit_zval) == SUCCESS) { + convert_to_long_ex(limit_zval); + if ((limit = (*limit_zval)->value.lval) <= 0) { + zend_error(E_WARNING, "Limit must be a non-zero positive integer"); + return; + } + } + while (--args >= EG(argument_stack).elements) { if (*args--) { break; @@ -1217,6 +1227,9 @@ array_init(return_value); while (ptr) { + if (limit_zval && --limit < 0) + break; + MAKE_STD_ZVAL(stack_frame); array_init(stack_frame); -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php