@@ -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+
546571static 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