diff options
author | Andrey Hristov <andrey@php.net> | 2010-01-21 18:12:18 +0000 |
---|---|---|
committer | Andrey Hristov <andrey@php.net> | 2010-01-21 18:12:18 +0000 |
commit | 2d7ca03976f4df3ee548fded4aa54f97002cb5cd (patch) | |
tree | a1c69399fd8f7e4f93a32080e0e2612fda0495a0 /ext/mysqlnd/mysqlnd_debug.c | |
parent | df15e2cde6a35693471283b339f1b992cd991166 (diff) | |
download | php-git-2d7ca03976f4df3ee548fded4aa54f97002cb5cd.tar.gz |
Add possibility to restrain the number of levels
Diffstat (limited to 'ext/mysqlnd/mysqlnd_debug.c')
-rw-r--r-- | ext/mysqlnd/mysqlnd_debug.c | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/ext/mysqlnd/mysqlnd_debug.c b/ext/mysqlnd/mysqlnd_debug.c index 1de52920d0..3e50516b47 100644 --- a/ext/mysqlnd/mysqlnd_debug.c +++ b/ext/mysqlnd/mysqlnd_debug.c @@ -1113,11 +1113,17 @@ static int mysqlnd_build_trace_string(zval **frame TSRMLS_DC, int num_args, va_l long line; HashTable *ht = Z_ARRVAL_PP(frame); zval **file, **tmp; + uint * level; + level = va_arg(args, uint *); str = va_arg(args, char**); len = va_arg(args, int*); num = va_arg(args, int*); + if (!(*level)--) { + return ZEND_HASH_APPLY_KEEP; + } + s_tmp = emalloc(1 + MAX_LENGTH_OF_LONG + 1 + 1); sprintf(s_tmp, "#%d ", (*num)++); TRACE_APPEND_STRL(s_tmp, strlen(s_tmp)); @@ -1283,11 +1289,17 @@ static int mysqlnd_build_trace_string(zval **frame TSRMLS_DC, int num_args, va_l long line; HashTable *ht = Z_ARRVAL_PP(frame); zval **file, **tmp; + uint * level; + level = va_arg(args, uint *); str = va_arg(args, char**); len = va_arg(args, int*); num = va_arg(args, int*); + if (!(*level)--) { + return ZEND_HASH_APPLY_KEEP; + } + s_tmp = emalloc(1 + MAX_LENGTH_OF_LONG + 1 + 1); sprintf(s_tmp, "#%d ", (*num)++); TRACE_APPEND_STRL(s_tmp, strlen(s_tmp)); @@ -1323,24 +1335,30 @@ static int mysqlnd_build_trace_string(zval **frame TSRMLS_DC, int num_args, va_l #endif -char * mysqlnd_get_backtrace(TSRMLS_D) +PHPAPI char * mysqlnd_get_backtrace(uint max_levels, size_t * length TSRMLS_DC) { zval *trace; char *res = estrdup(""), **str = &res, *s_tmp; int res_len = 0, *len = &res_len, num = 0; + if (max_levels == 0) { + max_levels = 99999; + } MAKE_STD_ZVAL(trace); zend_fetch_debug_backtrace(trace, 0, 0 TSRMLS_CC); - zend_hash_apply_with_arguments(Z_ARRVAL_P(trace) TSRMLS_CC, (apply_func_args_t)mysqlnd_build_trace_string, 3, str, len, &num); + 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); - s_tmp = emalloc(1 + MAX_LENGTH_OF_LONG + 7 + 1); - sprintf(s_tmp, "#%d {main}", num); - TRACE_APPEND_STRL(s_tmp, strlen(s_tmp)); - efree(s_tmp); + if (max_levels) { + s_tmp = emalloc(1 + MAX_LENGTH_OF_LONG + 7 + 1); + sprintf(s_tmp, "#%d {main}", num); + TRACE_APPEND_STRL(s_tmp, strlen(s_tmp)); + efree(s_tmp); + } res[res_len] = '\0'; + *length = res_len; return res; } |