sebastian Sat, 09 Apr 2011 09:52:24 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=310080
Log: Add optional argument to debug_backtrace() and debug_print_backtrace() to limit the amount of stack frames returned. Changed paths: U php/php-src/trunk/NEWS A php/php-src/trunk/Zend/tests/debug_backtrace_limit.phpt A php/php-src/trunk/Zend/tests/debug_print_backtrace_limit.phpt U php/php-src/trunk/Zend/zend_builtin_functions.c U php/php-src/trunk/Zend/zend_builtin_functions.h U php/php-src/trunk/Zend/zend_exceptions.c U php/php-src/trunk/ext/mysqlnd/mysqlnd_bt.c
Modified: php/php-src/trunk/NEWS =================================================================== --- php/php-src/trunk/NEWS 2011-04-09 07:15:32 UTC (rev 310079) +++ php/php-src/trunk/NEWS 2011-04-09 09:52:24 UTC (rev 310080) @@ -51,6 +51,8 @@ (galaxy dot mipt at gmail dot com, Kalle) . Improved unix build system to allow building multiple PHP binary SAPIs and one SAPI module the same time. FR #53271, FR #52410. (Jani) + . Added optional argument to debug_backtrace() and debug_print_backtrace() + to limit the amount of stack frames returned. (Sebastian, Patrick) - Improved Zend Engine memory usage: (Dmitry) . Replaced zend_function.pass_rest_by_reference by Added: php/php-src/trunk/Zend/tests/debug_backtrace_limit.phpt =================================================================== --- php/php-src/trunk/Zend/tests/debug_backtrace_limit.phpt (rev 0) +++ php/php-src/trunk/Zend/tests/debug_backtrace_limit.phpt 2011-04-09 09:52:24 UTC (rev 310080) @@ -0,0 +1,133 @@ +--TEST-- +debug_backtrace limit +--FILE-- +<?php +function a() { + b(); +} + +function b() { + c(); +} + +function c() { + print_r(debug_backtrace(0, 1)); + print_r(debug_backtrace(0, 2)); + print_r(debug_backtrace(0, 0)); + print_r(debug_backtrace(0, 4)); +} + +a(); +?> +--EXPECTF-- +Array +( + [0] => Array + ( + [file] => %s/debug_backtrace_limit.php + [line] => 7 + [function] => c + [args] => Array + ( + ) + + ) + +) +Array +( + [0] => Array + ( + [file] => %s/debug_backtrace_limit.php + [line] => 7 + [function] => c + [args] => Array + ( + ) + + ) + + [1] => Array + ( + [file] => %s/debug_backtrace_limit.php + [line] => 3 + [function] => b + [args] => Array + ( + ) + + ) + +) +Array +( + [0] => Array + ( + [file] => %s/debug_backtrace_limit.php + [line] => 7 + [function] => c + [args] => Array + ( + ) + + ) + + [1] => Array + ( + [file] => %s/debug_backtrace_limit.php + [line] => 3 + [function] => b + [args] => Array + ( + ) + + ) + + [2] => Array + ( + [file] => %s/debug_backtrace_limit.php + [line] => 17 + [function] => a + [args] => Array + ( + ) + + ) + +) +Array +( + [0] => Array + ( + [file] => %s/debug_backtrace_limit.php + [line] => 7 + [function] => c + [args] => Array + ( + ) + + ) + + [1] => Array + ( + [file] => %s/debug_backtrace_limit.php + [line] => 3 + [function] => b + [args] => Array + ( + ) + + ) + + [2] => Array + ( + [file] => %s/debug_backtrace_limit.php + [line] => 17 + [function] => a + [args] => Array + ( + ) + + ) + +) Property changes on: php/php-src/trunk/Zend/tests/debug_backtrace_limit.phpt ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Added: svn:eol-style + native Added: php/php-src/trunk/Zend/tests/debug_print_backtrace_limit.phpt =================================================================== --- php/php-src/trunk/Zend/tests/debug_print_backtrace_limit.phpt (rev 0) +++ php/php-src/trunk/Zend/tests/debug_print_backtrace_limit.phpt 2011-04-09 09:52:24 UTC (rev 310080) @@ -0,0 +1,31 @@ +--TEST-- +debug_print_backtrace limit +--FILE-- +<?php +function a() { + b(); +} + +function b() { + c(); +} + +function c() { + debug_print_backtrace(0, 1); + debug_print_backtrace(0, 2); + debug_print_backtrace(0, 0); + debug_print_backtrace(0, 4); +} + +a(); +?> +--EXPECTF-- +#0 c() called at [%s/debug_print_backtrace_limit.php:7] +#0 c() called at [%s/debug_print_backtrace_limit.php:7] +#1 b() called at [%s/debug_print_backtrace_limit.php:3] +#0 c() called at [%s/debug_print_backtrace_limit.php:7] +#1 b() called at [%s/debug_print_backtrace_limit.php:3] +#2 a() called at [%s/debug_print_backtrace_limit.php:17] +#0 c() called at [%s/debug_print_backtrace_limit.php:7] +#1 b() called at [%s/debug_print_backtrace_limit.php:3] +#2 a() called at [%s/debug_print_backtrace_limit.php:17] Property changes on: php/php-src/trunk/Zend/tests/debug_print_backtrace_limit.phpt ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Added: svn:eol-style + native Modified: php/php-src/trunk/Zend/zend_builtin_functions.c =================================================================== --- php/php-src/trunk/Zend/zend_builtin_functions.c 2011-04-09 07:15:32 UTC (rev 310079) +++ php/php-src/trunk/Zend/zend_builtin_functions.c 2011-04-09 09:52:24 UTC (rev 310080) @@ -227,8 +227,13 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_debug_backtrace, 0, 0, 0) ZEND_ARG_INFO(0, options) + ZEND_ARG_INFO(0, limit) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_INFO_EX(arginfo_debug_print_backtrace, 0, 0, 0) + ZEND_ARG_INFO(0, options) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_INFO_EX(arginfo_extension_loaded, 0, 0, 1) ZEND_ARG_INFO(0, extension_name) ZEND_END_ARG_INFO() @@ -290,7 +295,7 @@ ZEND_FE(get_extension_funcs, arginfo_extension_loaded) ZEND_FE(get_defined_constants, arginfo_get_defined_constants) ZEND_FE(debug_backtrace, arginfo_debug_backtrace) - ZEND_FE(debug_print_backtrace, arginfo_debug_backtrace) + ZEND_FE(debug_print_backtrace, arginfo_debug_print_backtrace) #if ZEND_DEBUG ZEND_FE(zend_test_func, NULL) #ifdef ZTS @@ -2047,11 +2052,11 @@ } } -/* {{{ proto void debug_print_backtrace([int options]) */ +/* {{{ proto void debug_print_backtrace([int options[, int limit]]) */ ZEND_FUNCTION(debug_print_backtrace) { zend_execute_data *ptr, *skip; - int lineno; + int lineno, frameno = 0; char *function_name; char *filename; const char *class_name = NULL; @@ -2060,8 +2065,9 @@ zval *arg_array = NULL; int indent = 0; long options = 0; + long limit = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &options) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|ll", &options, &limit) == FAILURE) { return; } @@ -2070,9 +2076,10 @@ /* skip debug_backtrace() */ ptr = ptr->prev_execute_data; - while (ptr) { + while (ptr && (limit == 0 || frameno < limit)) { const char *free_class_name = NULL; + frameno++; class_name = call_type = NULL; arg_array = NULL; @@ -2207,10 +2214,10 @@ /* }}} */ -ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int options TSRMLS_DC) +ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int options, int limit TSRMLS_DC) { zend_execute_data *ptr, *skip; - int lineno; + int lineno, frameno = 0; char *function_name; char *filename; char *class_name; @@ -2231,7 +2238,8 @@ array_init(return_value); - while (ptr) { + while (ptr && (limit == 0 || frameno < limit)) { + frameno++; MAKE_STD_ZVAL(stack_frame); array_init(stack_frame); @@ -2369,17 +2377,18 @@ /* }}} */ -/* {{{ proto array debug_backtrace([int options]) +/* {{{ proto array debug_backtrace([int options[, int limit]]) Return backtrace as array */ ZEND_FUNCTION(debug_backtrace) { long options = DEBUG_BACKTRACE_PROVIDE_OBJECT; + long limit = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &options) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|ll", &options, &limit) == FAILURE) { return; } - zend_fetch_debug_backtrace(return_value, 1, options TSRMLS_CC); + zend_fetch_debug_backtrace(return_value, 1, options, limit TSRMLS_CC); } /* }}} */ Modified: php/php-src/trunk/Zend/zend_builtin_functions.h =================================================================== --- php/php-src/trunk/Zend/zend_builtin_functions.h 2011-04-09 07:15:32 UTC (rev 310079) +++ php/php-src/trunk/Zend/zend_builtin_functions.h 2011-04-09 09:52:24 UTC (rev 310080) @@ -25,7 +25,7 @@ int zend_startup_builtin_functions(TSRMLS_D); BEGIN_EXTERN_C() -ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int options TSRMLS_DC); +ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int options, int limit TSRMLS_DC); END_EXTERN_C() #endif /* ZEND_BUILTIN_FUNCTIONS_H */ Modified: php/php-src/trunk/Zend/zend_exceptions.c =================================================================== --- php/php-src/trunk/Zend/zend_exceptions.c 2011-04-09 07:15:32 UTC (rev 310079) +++ php/php-src/trunk/Zend/zend_exceptions.c 2011-04-09 09:52:24 UTC (rev 310080) @@ -158,7 +158,7 @@ ALLOC_ZVAL(trace); Z_UNSET_ISREF_P(trace); Z_SET_REFCOUNT_P(trace, 0); - zend_fetch_debug_backtrace(trace, skip_top_traces, 0 TSRMLS_CC); + zend_fetch_debug_backtrace(trace, skip_top_traces, 0, 0 TSRMLS_CC); zend_update_property_string(default_exception_ce, &obj, "file", sizeof("file")-1, zend_get_executed_filename(TSRMLS_C) TSRMLS_CC); zend_update_property_long(default_exception_ce, &obj, "line", sizeof("line")-1, zend_get_executed_lineno(TSRMLS_C) TSRMLS_CC); Modified: php/php-src/trunk/ext/mysqlnd/mysqlnd_bt.c =================================================================== --- php/php-src/trunk/ext/mysqlnd/mysqlnd_bt.c 2011-04-09 07:15:32 UTC (rev 310079) +++ php/php-src/trunk/ext/mysqlnd/mysqlnd_bt.c 2011-04-09 09:52:24 UTC (rev 310080) @@ -454,7 +454,7 @@ } MAKE_STD_ZVAL(trace); - zend_fetch_debug_backtrace(trace, 0, 0 TSRMLS_CC); + zend_fetch_debug_backtrace(trace, 0, 0, 0 TSRMLS_CC); zend_hash_apply_with_arguments(Z_ARRVAL_P(trace) TSRMLS_CC, (apply_func_args_t)mysqlnd_build_trace_string, 4, &max_levels, str, len, &num); zval_ptr_dtor(&trace);
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php