]> granicus.if.org Git - php/commitdiff
Add possibility to restrain the number of levels
authorAndrey Hristov <andrey@php.net>
Thu, 21 Jan 2010 18:12:18 +0000 (18:12 +0000)
committerAndrey Hristov <andrey@php.net>
Thu, 21 Jan 2010 18:12:18 +0000 (18:12 +0000)
ext/mysqlnd/mysqlnd_debug.c
ext/mysqlnd/mysqlnd_debug.h

index 1de52920d065085f1c31f0aa417db98c11d67a05..3e50516b471525f12416b72a4db2d7d180978832 100644 (file)
@@ -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;
 }
index fa6246f9f212a5cae71f9d23f81733bc414840fd..96c953c24dc4b21be6741e06fd57b911d9bd8ac8 100644 (file)
@@ -78,7 +78,7 @@ PHPAPI void * _mysqlnd_calloc(unsigned int nmemb, size_t size MYSQLND_MEM_D);
 PHPAPI void *  _mysqlnd_realloc(void *ptr, size_t new_size MYSQLND_MEM_D);
 PHPAPI void    _mysqlnd_free(void *ptr MYSQLND_MEM_D);
 
-PHPAPI char *  mysqlnd_get_backtrace(TSRMLS_D);
+PHPAPI char *  mysqlnd_get_backtrace(uint max_levels, size_t * length TSRMLS_DC);
 
 #if defined(__GNUC__)
 #define DBG_INF_EX(dbg_obj, msg)               do { if (dbg_skip_trace == FALSE) (dbg_obj)->m->log((dbg_obj), __LINE__, __FILE__, -1, "info : ", (msg)); } while (0)