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

Reply via email to