Created
April 5, 2011 09:21
-
-
Save patrickallaert/903309 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Index: Zend/zend_builtin_functions.c | |
=================================================================== | |
--- Zend/zend_builtin_functions.c (revision 309942) | |
+++ Zend/zend_builtin_functions.c (working copy) | |
@@ -227,6 +227,7 @@ | |
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_extension_loaded, 0, 0, 1) | |
@@ -2047,11 +2048,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 +2061,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 +2072,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 +2210,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 +2234,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 +2373,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); | |
} | |
/* }}} */ | |
Index: Zend/zend_builtin_functions.h | |
=================================================================== | |
--- Zend/zend_builtin_functions.h (revision 309942) | |
+++ Zend/zend_builtin_functions.h (working copy) | |
@@ -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 */ | |
Index: Zend/zend_exceptions.c | |
=================================================================== | |
--- Zend/zend_exceptions.c (revision 309942) | |
+++ Zend/zend_exceptions.c (working copy) | |
@@ -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); | |
Index: ext/mysqlnd/mysqlnd_bt.c | |
=================================================================== | |
--- ext/mysqlnd/mysqlnd_bt.c (revision 309942) | |
+++ ext/mysqlnd/mysqlnd_bt.c (working copy) | |
@@ -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); | |
Index: Zend/tests/debug_backtrace_limit.phpt | |
=================================================================== | |
--- Zend/tests/debug_backtrace_limit.phpt (revision 0) | |
+++ Zend/tests/debug_backtrace_limit.phpt (revision 0) | |
@@ -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 | |
+ ( | |
+ ) | |
+ | |
+ ) | |
+ | |
+) | |
Index: Zend/tests/debug_print_backtrace_limit.phpt | |
=================================================================== | |
--- Zend/tests/debug_print_backtrace_limit.phpt (revision 0) | |
+++ Zend/tests/debug_print_backtrace_limit.phpt (revision 0) | |
@@ -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] | |
Index: NEWS | |
=================================================================== | |
--- NEWS (revision 309942) | |
+++ NEWS (working copy) | |
@@ -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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment