summaryrefslogtreecommitdiff
path: root/ext/mysqlnd/mysqlnd_bt.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/mysqlnd/mysqlnd_bt.c')
-rw-r--r--ext/mysqlnd/mysqlnd_bt.c75
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: