Skip to content

Commit 502acc3

Browse files
committed
share code path for arg list string building
1 parent 967fa4e commit 502acc3

1 file changed

Lines changed: 27 additions & 38 deletions

File tree

Zend/zend_exceptions.c

Lines changed: 27 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -543,6 +543,31 @@ static void _build_trace_args(zval *arg, smart_str *str) /* {{{ */
543543
}
544544
/* }}} */
545545

546+
static void _build_trace_args_list(zval *tmp, smart_str *str) /* {{{ */
547+
{
548+
if (EXPECTED(Z_TYPE_P(tmp) == IS_ARRAY)) {
549+
size_t last_len = ZSTR_LEN(str->s);
550+
zend_string *name;
551+
zval *arg;
552+
553+
ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(tmp), name, arg) {
554+
if (name) {
555+
smart_str_append(str, name);
556+
smart_str_appends(str, ": ");
557+
}
558+
_build_trace_args(arg, str);
559+
} ZEND_HASH_FOREACH_END();
560+
561+
if (last_len != ZSTR_LEN(str->s)) {
562+
ZSTR_LEN(str->s) -= 2; /* remove last ', ' */
563+
}
564+
} else {
565+
/* only happens w/ reflection abuse (Zend/tests/bug63762.phpt) */
566+
zend_error(E_WARNING, "args element is not an array");
567+
}
568+
}
569+
/* }}} */
570+
546571
static void _build_trace_string(smart_str *str, const HashTable *ht, uint32_t num) /* {{{ */
547572
{
548573
zval *file, *tmp;
@@ -589,25 +614,7 @@ static void _build_trace_string(smart_str *str, const HashTable *ht, uint32_t nu
589614
smart_str_appendc(str, '(');
590615
tmp = zend_hash_find_known_hash(ht, ZSTR_KNOWN(ZEND_STR_ARGS));
591616
if (tmp) {
592-
if (EXPECTED(Z_TYPE_P(tmp) == IS_ARRAY)) {
593-
size_t last_len = ZSTR_LEN(str->s);
594-
zend_string *name;
595-
zval *arg;
596-
597-
ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(tmp), name, arg) {
598-
if (name) {
599-
smart_str_append(str, name);
600-
smart_str_appends(str, ": ");
601-
}
602-
_build_trace_args(arg, str);
603-
} ZEND_HASH_FOREACH_END();
604-
605-
if (last_len != ZSTR_LEN(str->s)) {
606-
ZSTR_LEN(str->s) -= 2; /* remove last ', ' */
607-
}
608-
} else {
609-
zend_error(E_WARNING, "args element is not an array");
610-
}
617+
_build_trace_args_list(tmp, str);
611618
}
612619
smart_str_appends(str, ")\n");
613620
}
@@ -621,25 +628,7 @@ ZEND_API zend_string *zend_trace_function_args_to_string(HashTable *frame) {
621628

622629
tmp = zend_hash_find_known_hash(frame, ZSTR_KNOWN(ZEND_STR_ARGS));
623630
if (tmp) {
624-
if (Z_TYPE_P(tmp) == IS_ARRAY) {
625-
size_t last_len = ZSTR_LEN(str.s);
626-
zend_string *name;
627-
zval *arg;
628-
629-
ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(tmp), name, arg) {
630-
if (name) {
631-
smart_str_append(&str, name);
632-
smart_str_appends(&str, ": ");
633-
}
634-
_build_trace_args(arg, &str);
635-
} ZEND_HASH_FOREACH_END();
636-
637-
if (last_len != ZSTR_LEN(str.s)) {
638-
ZSTR_LEN(str.s) -= 2; /* remove last ', ' */
639-
}
640-
} else {
641-
smart_str_appends(&str, "<<invalid argument array>>");
642-
}
631+
_build_trace_args_list(tmp, &str);
643632
}
644633

645634
smart_str_0(&str);

0 commit comments

Comments
 (0)