diff options
Diffstat (limited to 'ext/mysqlnd/mysqlnd_bt.c')
| -rw-r--r-- | ext/mysqlnd/mysqlnd_bt.c | 75 |
1 files changed, 42 insertions, 33 deletions
diff --git a/ext/mysqlnd/mysqlnd_bt.c b/ext/mysqlnd/mysqlnd_bt.c index 27301f5a50..a93af6b395 100644 --- a/ext/mysqlnd/mysqlnd_bt.c +++ b/ext/mysqlnd/mysqlnd_bt.c @@ -42,14 +42,15 @@ TRACE_APPEND_STRL(val, sizeof(val)-1) #define TRACE_APPEND_KEY(key) \ - if ((tmp = zend_hash_str_find(ht, key, sizeof(key) - 1)) != NULL) { \ - TRACE_APPEND_STRL(Z_STRVAL_P(tmp), Z_STRLEN_P(tmp)); \ + if (zend_hash_find(ht, key, sizeof(key), (void**)&tmp) == SUCCESS) { \ + TRACE_APPEND_STRL(Z_STRVAL_PP(tmp), Z_STRLEN_PP(tmp)); \ } /* }}} */ + static int -mysqlnd_build_trace_args(zval *arg TSRMLS_DC, int num_args, va_list args, zend_hash_key *hash_key) /* {{{ */ +mysqlnd_build_trace_args(zval **arg TSRMLS_DC, int num_args, va_list args, zend_hash_key *hash_key) /* {{{ */ { char **str; int *len; @@ -63,20 +64,20 @@ mysqlnd_build_trace_args(zval *arg TSRMLS_DC, int num_args, va_list args, zend_h * but that could cause some E_NOTICE and also damn long lines. */ - switch (Z_TYPE_P(arg)) { + switch (Z_TYPE_PP(arg)) { case IS_NULL: TRACE_APPEND_STR("NULL, "); break; case IS_STRING: { int l_added; TRACE_APPEND_CHR('\''); - if (Z_STRLEN_P(arg) > 15) { - TRACE_APPEND_STRL(Z_STRVAL_P(arg), 15); + if (Z_STRLEN_PP(arg) > 15) { + TRACE_APPEND_STRL(Z_STRVAL_PP(arg), 15); TRACE_APPEND_STR("...', "); l_added = 15 + 6 + 1; /* +1 because of while (--l_added) */ } else { - l_added = Z_STRLEN_P(arg); - TRACE_APPEND_STRL(Z_STRVAL_P(arg), l_added); + l_added = Z_STRLEN_PP(arg); + TRACE_APPEND_STRL(Z_STRVAL_PP(arg), l_added); TRACE_APPEND_STR("', "); l_added += 3 + 1; } @@ -87,17 +88,18 @@ mysqlnd_build_trace_args(zval *arg TSRMLS_DC, int num_args, va_list args, zend_h } break; } - case IS_FALSE: - TRACE_APPEND_STR("false, "); - break; - case IS_TRUE: - TRACE_APPEND_STR("true, "); + case IS_BOOL: + if (Z_LVAL_PP(arg)) { + TRACE_APPEND_STR("true, "); + } else { + TRACE_APPEND_STR("false, "); + } break; case IS_RESOURCE: TRACE_APPEND_STR("Resource id #"); /* break; */ case IS_LONG: { - long lval = Z_LVAL_P(arg); + long lval = Z_LVAL_PP(arg); char s_tmp[MAX_LENGTH_OF_LONG + 1]; int l_tmp = zend_sprintf(s_tmp, "%ld", lval); /* SAFE */ TRACE_APPEND_STRL(s_tmp, l_tmp); @@ -105,7 +107,7 @@ mysqlnd_build_trace_args(zval *arg TSRMLS_DC, int num_args, va_list args, zend_h break; } case IS_DOUBLE: { - double dval = Z_DVAL_P(arg); + double dval = Z_DVAL_PP(arg); char *s_tmp; int l_tmp; @@ -121,13 +123,18 @@ mysqlnd_build_trace_args(zval *arg TSRMLS_DC, int num_args, va_list args, zend_h TRACE_APPEND_STR("Array, "); break; case IS_OBJECT: { - zend_string *class_name; + char *class_name; + zend_uint class_name_len; + int dupl; TRACE_APPEND_STR("Object("); - class_name = zend_get_object_classname(Z_OBJ_P(arg) TSRMLS_CC); + dupl = zend_get_object_classname(*arg, (const char **)&class_name, &class_name_len TSRMLS_CC); - TRACE_APPEND_STRL(class_name->val, class_name->len); + TRACE_APPEND_STRL(class_name, class_name_len); + if (!dupl) { + efree(class_name); + } TRACE_APPEND_STR("), "); break; @@ -140,13 +147,13 @@ mysqlnd_build_trace_args(zval *arg TSRMLS_DC, int num_args, va_list args, zend_h /* }}} */ static int -mysqlnd_build_trace_string(zval *frame TSRMLS_DC, int num_args, va_list args, zend_hash_key *hash_key) /* {{{ */ +mysqlnd_build_trace_string(zval **frame TSRMLS_DC, int num_args, va_list args, zend_hash_key *hash_key) /* {{{ */ { char *s_tmp, **str; int *len, *num; long line; - HashTable *ht = Z_ARRVAL_P(frame); - zval *file, *tmp; + HashTable *ht = Z_ARRVAL_PP(frame); + zval **file, **tmp; uint * level; level = va_arg(args, uint *); @@ -163,14 +170,14 @@ mysqlnd_build_trace_string(zval *frame TSRMLS_DC, int num_args, va_list args, ze sprintf(s_tmp, "#%d ", (*num)++); TRACE_APPEND_STRL(s_tmp, strlen(s_tmp)); efree(s_tmp); - if ((file = zend_hash_str_find(ht, "file", sizeof("file") - 1)) != NULL) { - if ((tmp = zend_hash_str_find(ht, "line", sizeof("line") - 1)) != NULL) { - line = Z_LVAL_P(tmp); + if (zend_hash_find(ht, "file", sizeof("file"), (void**)&file) == SUCCESS) { + if (zend_hash_find(ht, "line", sizeof("line"), (void**)&tmp) == SUCCESS) { + line = Z_LVAL_PP(tmp); } else { line = 0; } - s_tmp = emalloc(Z_STRLEN_P(file) + MAX_LENGTH_OF_LONG + 4 + 1); - sprintf(s_tmp, "%s(%ld): ", Z_STRVAL_P(file), line); + s_tmp = emalloc(Z_STRLEN_PP(file) + MAX_LENGTH_OF_LONG + 4 + 1); + sprintf(s_tmp, "%s(%ld): ", Z_STRVAL_PP(file), line); TRACE_APPEND_STRL(s_tmp, strlen(s_tmp)); efree(s_tmp); } else { @@ -180,9 +187,9 @@ mysqlnd_build_trace_string(zval *frame TSRMLS_DC, int num_args, va_list args, ze TRACE_APPEND_KEY("type"); TRACE_APPEND_KEY("function"); TRACE_APPEND_CHR('('); - if ((tmp = zend_hash_str_find(ht, "args", sizeof("args") - 1)) != NULL) { + if (zend_hash_find(ht, "args", sizeof("args"), (void**)&tmp) == SUCCESS) { int last_len = *len; - zend_hash_apply_with_arguments(Z_ARRVAL_P(tmp) TSRMLS_CC, mysqlnd_build_trace_args, 2, str, len); + zend_hash_apply_with_arguments(Z_ARRVAL_PP(tmp) TSRMLS_CC, (apply_func_args_t)mysqlnd_build_trace_args, 2, str, len); if (last_len != *len) { *len -= 2; /* remove last ', ' */ } @@ -192,19 +199,21 @@ mysqlnd_build_trace_string(zval *frame TSRMLS_DC, int num_args, va_list args, ze } /* }}} */ + PHPAPI char * -mysqlnd_get_backtrace(uint max_levels, size_t * length TSRMLS_DC) /* {{{ */ +mysqlnd_get_backtrace(uint max_levels, size_t * length TSRMLS_DC) { - zval trace; + 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; } - zend_fetch_debug_backtrace(&trace, 0, 0, 0 TSRMLS_CC); + MAKE_STD_ZVAL(trace); + zend_fetch_debug_backtrace(trace, 0, 0, 0 TSRMLS_CC); - zend_hash_apply_with_arguments(Z_ARRVAL(trace) TSRMLS_CC, mysqlnd_build_trace_string, 4, &max_levels, 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); if (max_levels) { @@ -219,7 +228,7 @@ mysqlnd_get_backtrace(uint max_levels, size_t * length TSRMLS_DC) /* {{{ */ return res; } -/* }}} */ + /* * Local variables: |
