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

Reply via email to